1. 程式人生 > >定義一個String物件直接使用“=”賦值 與 new 建立物件賦值 有何區別?

定義一個String物件直接使用“=”賦值 與 new 建立物件賦值 有何區別?

經常在java程式設計師面試的過程中,面試官經常會問到下面這個問題:
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。所以出現上面的結果也就是情理之中的事了。