(1)== 和 equals 的區別是什么?


Java數據類型分為:

         基本數據類型

         復合數據類型(包裝類是基本數據類型的引用類型也屬於復合數據類型)

基本數據類型:

      byte,short,int,long,float,double,char,boolean 

復合數據類型:

       包裝類:Byte ,Short,Integer,Long,Float,Double,Character,Boolean

       對象:var obj ={"name":"xiaoming"}

       數組: var objarr = ["1","2","3"]

       函數:function f(){}

轉:https://blog.csdn.net/qq_35001600/article/details/82889515 

1)基本數據類型之間比較用 == 且比較值,而復合數據類型 == 比較的時候兩對象的地址值是否一致,所以除非是同一個new出來的對象,結果為true,否則為false。

2)對於equals() 由於java中所有類都繼承與Object基類,在Object類中定義了一個equals(),該方法初始化是比較對象的內存地址。

但在一些類中重寫了這個方法,如包裝類String,Date等,equals()比較的是兩個變量的值。

·String

創建String對象的兩種方式比較他們的==和equals會有不同的效果

String s1=”sss”;

String s2=new String(“sss”);

System.out.println(s1.==s2);

System.out.println(s1.equals(s2));

輸出結果:false

              true

研究這個結果就需要了解一下String對象的創建機制。

   

String s1=”sss”;這種創建方式在內存中的過程是在方法區的常量池中創建一個”sss”字面值 ,然后之后由這種創建方式的變量都由棧中指向這個地址,所以只要值一樣,變量之間==為true;

而String s2=new String(“sss”);這種創建方式的過程具體是在堆中創建一個新的對象,所以在和值一樣的變量比較==時為false,但是只要值一樣的話.equals()還是為true的。

 

String中還有個特殊的地方就是使用+號拼接得到的結果如果值和某變量值一致,不代表兩變量地址一致,如果拼接的是一個字面值,則指向同一個值的常量池地址,兩變量地址一致。但如果拼接的是一個變量相當於新建了一個對象,地址指向堆,所以即使值一致,地址也不一樣。

最后String中有個intern()方法。

 

這個方法的作用是在常量池中檢查是否有和該字符串相同的值,如果有,則返回常量值,若沒有就創建該常量值,並返回。所以通過intern()得到的值會和指向同一個常量池值的變量地址一致且值一致

針對String簡單的總結一下:

①只要不新建對象,值相同地址一般相等

②String身為一個不可變值,對字符串的操作會新建一個對象。

③拼接時關注字符串是否新建對象

 

 

 

·包裝類

當包裝類和基本類型進行”==”比較時,包裝類會自動拆箱為基本數據類型再進行比較。而字面值的地址都指向常量池,值相同地址相同。

兩個相同包裝類型的對象進行equals()比較時,equals()會先比較類型,如果類型相同再比較值,二者同時成立為true

兩個基本類型沒有equals()比較方法

包裝類調用equals(),但是參數是基本類型,這時候會先進行自動裝箱,基本類型轉換為其包裝類,先判斷類型,再判斷值,二者都成立時結果為true

以Integer為例討論一下直接賦值的情況下兩變量的==結果和equals()值:

例:Integer i1=123;

Integer i2=123;

System.out.println(i1==i2);

輸出結果:true

因為Integer對象在編譯期會自動拆箱(該特性在jdk1.5之后)。

例:Integer i1=200;

Integer i2=200;

System.out.println(i1==i2);

輸出結果為:false

這個記過就很神奇,和上一個例子明明一樣為什么結果不一樣。這是因為Integer自動拆箱的過程:Integer i1=200在編譯期會調用一個叫valueOf()的靜態方法

 

 

由此可知,cache是一個數組,規定了整型在[-127,128]這個范圍。超過這個范圍的值就會在堆內存中創建一個新的對象,兩對象地址不同。

針對Integer簡單總結一下:

①無論如何Integer變量不會和新創建的對象相等。

②Integer在==比較時會在編譯時期自動拆箱。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM