1. 程式人生 > >後端---java關於String str=new String("abc");究竟生成幾個了幾個String物件

後端---java關於String str=new String("abc");究竟生成幾個了幾個String物件

String str=new String("abc");

首先我們要知道的是這句話生成了兩個String物件,一個是new String("abc")在常量池中產生了一個"abc"物件,另外一個物件是在堆中複製了一份字串池中的"abc",並將這個物件的引用交給str使用,str只是一個引用變數.

再瞭解為什麼產生兩個String物件之前我嗯先要明白什麼是引用變數和物件,物件一般在通過new在堆中建立,而str只是一個引用變數.

引用變數與物件的區別:
字串文字"abc"是一個String物件,文字池(pool of literal strings)和堆(heap)中的字串物件.

我們舉個例子再來說明一下什麼是引用變數和物件,

Object Demo;

這句話只是聲明瞭一個類Object的引用變數Demo(我們常將之稱為控制代碼),而物件一般通過new方法來進行建立.

並且在java中所有的字串文字(字串常量)都是一個String的物件.

String字串物件建立過程:

由於字串物件的大量使用(它是一個物件,一般而言物件總是在堆(heap)中分配記憶體),Java中為了節省記憶體空間和執行時間(如比較字串時,==比equals()快),在編譯階段就把所有的字串文字放到一個文字池(pool of literal strings)中,而執行時文字池成為常量池的一部分。文字池的好處,就是該池中所有相同的字串常量被合併,只佔用一個空間。

String s1 = "abc" ;
String s2 = "abc" ;
if( s1 == s2 ) System.out.println("s1,s2 refer to the same object");
else System.out.println("trouble");

在上述程式碼中我們只在常量池中建立了一個"abc"字串物件,而分別定義了兩個引用變數s1和s2分別去常量池中指向他們.

String str=new String("abc");

這個時候我們再來回到原問題,現在看String s = new String("abc");語句,

這裡"abc"本身就是文字池中的一個物件,而在執行時執行new String()時,將文字池pool中的物件複製一份放到堆heap中,並且把heap中的這個物件的引用交給str持有。所以,這條語句就建立了2個String物件。