String中==和equals的區別
==只是用來比較兩個引用的值.
String類重寫了Object類中的equals方法,該方法用於判斷字符串是否相同.
String s1 = “abc”;和Strings2 = new String(“abc”);的區別
s1在內存中有一個對象.
s2在內存中有兩個對象.
1.判斷定義爲String類型的s1和s2是否相等
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
//true 先去常量池裏找有沒有abc這個對象,如果沒有,就創建一個,如果有,就不創建了
System.out.pritnln(s1.equals(s2));
//true 因爲String重寫了Object裏的equals方法,比較是對象的內容,只要他們內容一模一樣就爲true
2.下面這句話在內存中創建了幾個對象?
String s1 = new String("abc");
//單獨寫這句話就是創建兩個對象,先在常量池裏創建一個,然後將常量池副本拷貝一份給堆內存的對象裏
3.判斷定義爲String類型的s1和s2是否相等
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2); ?
//false s1是記錄的堆內存的地址值,s2記錄的是常量池中的地址值
System.out.pritnln(s1.equals(s2)); ?
//true 因爲String重寫了Object裏的equals方法,比較是對象的內容,只要他們內容一模一樣就爲true
4.判斷定義爲String類型的s1和s2是否相等
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2); ?
//true 因爲java編譯器有常量優化機制,在編譯的時候就把"a","b","c"三個常量看成了一個常量"abc"
System.out.pritnln(s1.equals(s2)); ?
//true 因爲String重寫了Object裏的equals方法,比較是對象的內容,只要他們內容一模一樣就爲true
5.判斷定義爲String類型的s1和s2是否相等
String s1 = "ab";
String s2 = "abc";
System.out.println((s1 + "c") == s2); ?
//false 字符串與其他的類型用+相連接的時候,其實底層是調用StringBuffer的append方法,相當於
//在堆內存創建了一StringBuffer對象
System.out.pritnln((s1 + "c").equals(s2)); ?//true 因爲String重寫了Object裏的equals方法,比較是對象的內容,只要他們內容一模一樣就爲true