為什么s1 == s2是true s3==s4是false
??? public static void main(String[] args) {
?? ??? ?String s1 = "imooc";
?? ??? ?String s2 = "imooc";
?????? ?
??????? //定義字符串s3,保存“I love”和s1拼接后的內(nèi)容
?? ??? ? String s3= "I love" + s1;
?? ??? ?
??????? // 比較字符串s1和s2
?? ??? ?// imooc為常量字符串,多次出現(xiàn)時會被編譯器優(yōu)化,只創(chuàng)建一個對象
?? ??? ?System.out.println("s1和s2內(nèi)存地址相同嗎?" + (s1 == s2));
?????? ?
??????? //比較字符串s1和s3
?? ??? ?System.out.println("s1和s3內(nèi)存地址相同嗎?" + (s1==s3) );
?? ??? ?String s4 = "I love " + s1;
???????? //比較字符串s4和s3
?? ??? ?// s1是變量,s4在運行時才知道具體值,所以s3和s4是不同的對象
?? ??? ?System.out.println("s3和s4內(nèi)存地址相同嗎?" + (s4 == s3));
?? ?}
}
2016-03-07
字符串可以說在被創(chuàng)建后便是一個常量,內(nèi)容不可更改。
更改的話相當(dāng)于變相創(chuàng)建了一個新的字符串。
s1創(chuàng)建了一個字符串為imooc,將這個常量保存在了內(nèi)存里。
創(chuàng)建s2時,由于s2創(chuàng)建的內(nèi)容和s1一樣,所以s2并沒有在內(nèi)存中創(chuàng)建一個新的字符串,而是指向s1所創(chuàng)字符串的內(nèi)存地址,所以s1和s2指向的是同一個常量,s1=s2。
s3是在s1的基礎(chǔ)上創(chuàng)建了一個新的字符串I love imooc,創(chuàng)建時開辟了新的內(nèi)存地址
s4同理,也是在s1上創(chuàng)建了新的字符串。
字符串之間的比較,是比較內(nèi)存首地址是否相同,而不是內(nèi)容。
所以s1和s2在內(nèi)存的指向上是相同,而s3和s4是各自新開辟的字符串,事先建立的字符串后付的值,所以s3和s4指向的內(nèi)容并不是一個,所以內(nèi)存地址不同,從而不相等