equal與==的區別


equal與==

1.最大的區別是,==是運算符,equal是方法

簡述幾種情況下的equal與==

java基本類型
比較包裝類型
比較String類型
比較對象
1.java基本類型(short,int,long,byte,char,float,double,boolean)

比較基本類型,只能用==,不能用equal,這里的==比較的是兩個變量的值

2.比較包裝類型

==比較的是內存地址,因為a和b是new出來的,是兩個不同的對象,所以地址肯定是不同的,而equal比較的是值,附上源碼



3.比較String類型

==比較的是內存地址,equal比較的是值

這里給出一道題,來供參考



這道題我們一步一步來解決,首先s1==s2,==比較的是內存地址,而s2是new出來的新對象,new String("xxxx")放在堆中,而s1的“xxxx”放在常量池中,所以比較結果是false

第二,s1==s5,字符串+的本質是創建了StringBulider對象進行append操作,然后將拼接后的StringBulider對象用toString進行處理,處理后生成的字符串放在字符串池中找有沒有相同值的字符串,如果有將引用(s5)直接連接到已有的字符串地址,所以s1和s5的地址相同

第三,s1=s3+s4,這個的原理是涉及到類加載時初始化的問題,s3和s4的結果無法在編譯期間確定,如果把s3和s4定義為final類型,結果就是true了,java在編譯時,就知道“Program”+"ming"="Programming"了,但卻是在運行時才知道s3+s4="Programming"

4.比較對象

==和equal比較的都是內存地址,因為equal沒有被重寫,沒有被重寫的equal都是object的equal方法

 

也能參考下面

1.“==”常用來比較基本數據類型,8種基本數據類型有byte、short、long、double、char、int、float、boolean,因為變量直接存儲的就是他們的值,所以用"=="去比較,比較的就是他們的

但是復合數據類型用“==”比較的是他的堆內存地址
2.“equals”對於復合數據類型比較的也是它的堆內存地址(不能作用於基本數據類型的變量)。

但在實際項目中常用來比較String字符串的內容相等是為什么呢?

那是因為對於String(還有Date,Integer)類型重寫了equals方法,使其比較的是存儲對象的內容是否相等,而不是堆內存地址。

 String str1 = "Hello"; String str5 = "Hello"; String str2 = new String("Hello"); String str4 = new String("Hello"); String str3 = str2; // 引用傳遞,同一對象 System.out.println(str1 == str2); // false(str2是new的一個新地址) System.out.println(str1 == str3); // false(str3和str2內存地址一樣,和str1地址不同) System.out.println(str2 == str3); // true(引用str2,地址相同) System.out.println(str1 == str5); // true(String作為基本類型,沒創建新地址) System.out.println(str4 == str2); // false(內存地址不同) System.out.println(str1.equals(str2)); // true(內容一致,都是“hello”) System.out.println(str1.equals(str3)); // true(內容一致,都是“hello”) System.out.println(str2.equals(str3)); // true(內容一致,都是“hello”) System.out.println(str2.equals(str4)); // true(內容一致,都是“hello”) System.out.println(str1.equals(str5)); // true(內容一致,都是“hello”)

 


免責聲明!

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



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