java s1=abc s2=abc s1==s2_经典问题:String s1 = abc 与 String s2 = new String(abc)的区别...
這是以前剛學Java那會經常被問到的問題,并且也會經常出現在面試中。這個問題不僅僅只局限于Java,可以適用于其他大部分語言,正好最近有個小朋友在學編程,特此整理一下。
String s1 = "abc" ;
String s2 = new String("abc");
首先,我們先看看以上兩句分別做了什么?
String s1 = "abc" 做了什么
在棧中創建了一個名為 s1 的變量(引用)
如果 String池 中沒有 "abc" 存在,則在常量池中創建一個 String 類型的 "abc" 對象,有就不創建
將 "abc" 的地址賦給 s1
所以,此句到底創建了幾個對象,根據 "abc" 的情況而定,"abc" 之前存在就是一個,否則就沒有創建。
String s2 = new String("abc") 做了什么
創建了一個名為 s2 的變量(引用)
如果 String池 中沒有 "abc" 存在,則在 String池 中創建一個 String 類型的 "abc" ,有就不創建
使用 new關鍵字 在堆中創建了一個 String 對象
將用 new 創建的 String 對象的地址賦給 s2
所以,此句到底創建了幾個對象,根據 "abc" 的情況而定,"abc" 之前存在就是1個,不存在就是2個。
棧:存放基本類型的數據和對象的引用,但對象本身不存放在棧中,而是存放在堆中
堆:存放用 new 產生的數據
s1 == s2 與 s1.equals(s2)
s1 與 s2 看著都是內容為 "abc" 的字符串,但是使用 == 和 equals() 來判斷它們是否相等時會發現,結果并不一樣。
s1 == s2
結果為false,根據上述內容我們可以知道,兩者雖然內容一致,但是其實兩者的指向的內存地址并不一致,而 == 會檢查兩者的內存地址是否一致,一致為true,不一致為false
s1.equals(s2)
結果為true,因為 equals() 在檢查地址不相等后,還會檢查兩者的內容,兩者內容相等,則仍然返回true,毫無疑問,兩者的內容是一致的。
關于 String s3 = "abc" + "xyz";
還有一個與上述問題類似的問題,就是 String s3 = "abc" + "xyz"; 到底創建了幾個對象?
關于 "abc" 與 "xyz" 在上述中已經提到,如果之前存在就不用創建,不存在則創建。我們更需要關心的是這兩個字符串的拼接。
使用 "+" 拼接字符串,實際是創建了一個新字符串 "abcxyz"(使用 + 號,會在底層做 new StringBuilder().append("abc").append("xyz") 操作),所以至少會創建一個對象,如果 "abc" 與 "xyz" 之前都不存在,則就是創建3個對象,如果兩個中只有一個存在,則是2個。
關于 = 符號的小拓展
對于 "=" 我們并不陌生,但是編程語言中的 "=" 我們不能單純的當做數學中的等號,我們更習慣理解為賦值號,主要賦值的東西是內存地址,而不是內容本身。
我們可以這樣粗暴的理解:當一個對象被創建出來時,它可以簡單的分成兩部份,地址與內容。當我們使用a = 對象時,a 得到的并不是對象的內容,而是對象的地址,在我們操作 a 的時候,程序會通過 a(即對象的地址)來在內存中找到對象所表示的內容,并對其操作。
下面,我們來看一個小例子:
String a = "xyz";
String b = a;
System.out.println(" a = " + a);
System.out.println(" b = " + b);
a = "qwe";
System.out.println(" a = " + a);
System.out.println(" b = " + b);
打印結果:
a = xyz
b = xyz
a = qwe
b = xyz
那么在這過程中發生了什么?
a 獲取了 "xyz" 的內存地址
a 將 "xyz" 的內存地址給了 b,此時 a 與 b的內存地址都是指向 "xyz"
"qwe" 將它的地址賦給了 a,此時 a 的地址就指向 "qwe",但是 b 仍然指向 "xyz",所以 b 打印出來的值為 xyz。
推薦文章
總結
以上是生活随笔為你收集整理的java s1=abc s2=abc s1==s2_经典问题:String s1 = abc 与 String s2 = new String(abc)的区别...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小白理财课真的能赚钱吗?这几种靠谱的赚钱
- 下一篇: 【NC140 排序】手写快速排序