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在==比較時會在編譯時期自動拆箱。