1. 程式人生 > >String直接賦值與使用new String的區別

String直接賦值與使用new String的區別

在研究String直接賦值與new String的區別之前我們需要先了解java中的字串常量池的概念

字串常量池

String類是我們平常專案中使用頻率非常高的一種物件型別,jvm為了提升效能和減少記憶體開銷,避免字元的重複建立,其維護了一塊特殊的記憶體空間,即字串池,當需要使用字串時,先去字串池中檢視該字串是否已經存在,如果存在,則可以直接使用,如果不存在,初始化,並將該字串放入字元創常量池中。

使用String直接賦值

String str = “abc”;可能建立一個或者不建立物件,如果”abc”在字串池中不存在,會在java字串池中建立一個String物件(”abc”),然後str指向這個記憶體地址,無論以後用這種方式建立多少個值為”abc”的字串物件,始終只有一個記憶體地址被分配。==判斷的是物件的記憶體地址,而equals判斷的是物件內容。通過以下程式碼測試:

String str = "abc";
String str1 = "abc";
String str2 = "abc";
System.out.println(str==str1);//true
System.out.println(str==str2);//true

也就是str、str1、str2都是指向同一個記憶體地址。

使用new String 建立字串

String str = new String(“abc”);至少會建立一個物件,也有可能建立兩個。因為用到new關鍵字,肯定會在堆中建立一個String物件,如果字元池中已經存在”abc”,則不會在字串池中建立一個String物件,如果不存在,則會在字串常量池中也建立一個物件。

String str = new String("abc");
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str==str1);//false
System.out.println(str==str2);//false

可以看出來,str、str1、str2指向的是不同的記憶體地址

使用String拼接字串

專案中除了直接使用=賦值,也會用到字串拼接,字串拼接又分為變數拼接和已知字串拼接

String str = "abc";//在常量池中建立abc
String
str1 = "abcd";//在常量池中建立abcd String str2 = str+"d";//拼接字串,此時會在堆中新建一個abcd的物件,因為str2編譯之前是未知的 String str3 = "abc"+"d";//拼接之後str3還是abcd,所以還是會指向字串常量池的記憶體地址 System.out.println(str1==str2);//false System.out.println(str1==str3);//true

所以在專案中還是不要使用new String去建立字串,最好使用String直接賦值。