定義一個String物件直接使用“=”賦值 與 new 建立物件賦值 有何區別?
阿新 • • 發佈:2019-02-08
經常在java程式設計師面試的過程中,面試官經常會問到下面這個問題:
【答案】第一行程式碼建立了1個物件,第二行程式碼建立了2個物件;
String strA = "abc";
String StrB = new String("abc");
這兩行程式碼中分別建立了幾個物件?【答案】第一行程式碼建立了1個物件,第二行程式碼建立了2個物件;
【解析】
首先 String strA = "abc"; 建立了一個物件StrA並且把“abc”在記憶體中的地址賦值給了物件StrA,所以這個過程只建立了一個物件StrA;
而在String StrB = new String("abc")中,則建立了StrB物件,其存放的是存放“abc”地址的物件的引用地址;所以這個過程建立了StrB物件和存放“abc”地址的引用物件;
【擴充套件延伸】:
package com.huas.demo; /** * @author GaoFeng * @time 2018年5月5日下午11:43:51 * @todo http://cup.dnsxo.com */ public class Demo { public static void main(String[] args) { String strA = "abc"; String strB = new String("abc"); System.out.println("strA == strB ? " + (strA == strB ? true : false)); String strC = "abc"; System.out.println("strA == strC ? " + (strA == strC ? true : false)); String StrD = "ab"; String StrE = "c"; String StrF = StrD + StrE; System.out.println("strA == StrF ? " + (strA == StrF ? true : false)); String strBB = new String("abc"); System.out.println("strB == strBB ? " + (strB == strBB ? true : false)); } }
【執行結果】:
strA == strB ? false
strA == strC ? true
strA == StrF ? false
strB == strBB ? false
首先我們要明白的是
String strA = "abc";
這樣的程式碼,可能會建立一個物件或者不會建立物件,這裡會出現一個名詞:字串例項池;
例項池中存在字串:
這個名稱很形象,在這個字串例項池中存放著很多字串,可能包含有字串“abc”,所以在這種情況下,上面的語句就不會建立物件,而是直接引用池中的字串“abc”;
例項池中不存在字串:
如果字串“abc”在例項池中並不存在,那麼此時JVM就會初始化一個字串“abc”,即建立一個字串物件“abc”,並且會把建立好的字串放入到“字串例項池”中;
String strB = new String("abc");
對於關鍵字 new,JVM即會重新開闢記憶體空間產生新的物件,也就是說每次都會產生新的字串物件;
這樣對於結果:
strA == strB ? false
strA == strC ? true
strA == strC ? true
就不足為奇了。
而對於:
strA == StrF ? false
這個就要稍微難理解一些String StrD = "ab";
String StrE = "c";
String StrF = StrD + StrE;
字串StrD和StrE都是字串常量,所以它們在程式碼編譯的時就已經是確定好了,但是對StrF來說,他的值是StrD和StrE的引用,所以不會在編譯時確定,實際上StrF類似於新建了一個物件出來,然後把所建立的物件的引用賦值給了StrF。所以出現上面的結果也就是情理之中的事了。