常量池:
常量池(constant pool)指的是在編譯期被確定,并被保存在已編譯的.class檔案中的一些資料,它包括了關于類、方法、介面等中的常量,也包括字串常量,
在常量池中存盤字串常量的記憶體空間,即字串常量池,當需要使用字串時,先去字串池中查看該字串是否已經存在,如果存在,則可以直接使用,如果不存在,初始化,并將該字串放入字串常量池中,
從字串角度思考:其物件的參考都是存盤在堆疊中的,如果是編譯期已經創建好(直接賦值字串)的就存盤在常量池中,如果是運行期(new出來的)才能確定的就存盤在堆中,對于equals相等的字串,在常量池中永遠只有一份,在堆中有多份,
使用String直接賦值:
String str = “abc”:可能創建一個或者不創建物件,如果”abc”在字串池中不存在,會在java字串池中創建一個String物件(”abc”),然后str指向這個記憶體地址,無論以后用這種方式創建多少個值為”abc”的字串物件,始終只有一個記憶體地址被分配;如果“abc” 在字串池中存在, str直接指向這個記憶體地址,
實體:
String str = "abc";
String str1 = "abc";
String str2 = "abc";
System.out.println(strstr1);//true
System.out.println(strstr2);//true
使用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(strstr1);//false
System.out.println(strstr2);//false
String拼接字串:
除了直接使用=賦值,也會用到字串拼接,字串拼接又分為變數拼接和已知字串拼接,
只要拼接內容存在變數,那么該拼接后的新變數就是在堆記憶體中新建的一個物件物體,
實體:
String str = "abc";//在常量池中創建abc
String str1 = "abcd";//在常量池中創建abcd
String str2 = str+"d";//拼接字串,此時會在堆中新建一個abcd的物件,因為str2編譯之前是未知的
String str3 = "abc"+"d";//拼接之后str3還是abcd,所以還是會指向字串常量池的記憶體地址
System.out.println(str1str2);//false
System.out.println(str1str3);//true
String.intern():
當呼叫 intern 方法時,如果常量池已經包含一個等于此 String 物件的字串(用 equals(Object) 方法確定),則回傳池中的字串,否則,將此 String 物件添加到常量池中,并回傳此 String 物件的參考,
實體:
String s1=new String("abc");
String s2=s1.intern();
System.out.println( s1s2 ); //false
System.out.println( s1+" "+s2 ); // abc abc
System.out.println( s2s1.intern() ); //true
s1==s1.intern()為false說明原來的“abc”仍然存在;
總結:
String str=“abc”和String str=new String(“abc”); 產生幾個物件?
前者1或0,后者2或1,先看字串常量池,如果字串常量池中沒有,都在常量池中創建一個,如果有,前者直接參考,后者在堆記憶體中還需創建一個“abc”實體物件,
2.對于基礎型別的變數和常量:變數和參考存盤在堆疊中,常量存盤在常量池中,
3.為了提升jvm(JAVA虛擬機)性能和減少記憶體開銷,避免字符的重復創建 專案中還是不要使用new String去創建字串,最好使用String直接賦值,
4.關于equals()和:對于String類簡單來說,equals()就是比較兩字串的內容是否相等,如果相等回傳true;而是比較兩字串的地址是否相同,也就是是否是同一個字串的參考,如果是回傳true,
5.String字串是不可變的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248862.html
標籤:Java
