[英]string object creation and its constructor
有兩種創建String對象的方法。
String str = new String("Java");
String str2 = "Java";
我知道在第一種情況下,肯定會調用構造函數。 但是不知道第二個。 構造函數會被調用嗎?
String substr = new String(str.substring(2,str.length)); // str is new object
String substr2 = new String(str2.substring(2,str2.length)); //str2 is not with new keyword
想要確保substr
和substr2
在堆內存中是相同類型的操作和相同行為。
我知道String.substring()
根本不創建新對象,而是使用具有不同偏移量的先前char []對象的一件事。
那么substr
和substr2
會發生什么呢? 我們可以將這些東西與構造函數相關聯嗎,因為偏移量是在構造函數內部生成的。
摘自JLS§3.10.5。 字符串文字 :
字符串文字是對
String
類(第4.3.1節,第4.3.3節)的實例的引用。而且,字符串文字總是引用類
String
的相同實例。 這是因為使用String.intern
方法,對“字符串文字”(或更一般地說,是常量表達式的值(第15.28節)的字符串)進行了“插入”,以便共享唯一的實例。
因此, "Java"
是指String
對象。 此外,任何由相同字符組成的字符串文字都將引用相同的String
對象。 但是,該對象的構造方式和時間尚未指定。
想要確保
substr
和substr2
在堆內存中是相同類型的操作和相同行為。
是的,它們是完全相同的一種操作。
我知道
String.substring()
根本不創建新對象,而是使用具有不同偏移量的先前char []對象的一件事。
未指定。 您所描述的是Oracle JDK的舊版本如何工作。 當前版本不再這樣做 : substring()
現在復制字符。 此更改是在Java 7u6中進行的。
創建任何對象時都會調用構造函數。
如果String str2 = "World";
,jvm將首先在字符串池中搜索字符串"world"
。 只有在池中不存在此文字時,才會調用構造函數,否則它將返回現有對象。
構造函數應始終被調用。 要自己找出調試此應用程序:
public static void main(String[] args) {
String str = new String("Java"); // <-- breakpoint here
String str2 = "World";
String str3 = "Java"; // (1)
String str4 = new String("Java"); // (2)
System.out.println(str + " " + str2 + " " + str3 + " " + str4);
}
在第一行上設置斷點( String str = new...
),然后String str = new...
“ Step into”進入String()
構造函數。 然后從構造函數中“跳出”,“跳出”到下一行,然后再次“跳入”。 您應該再次處於String()
構造函數中。
1:對於str3
來說,它應該來自池,即if (str3 == str)
為true
。
2:但是str4
將是一個新實例,即, if (str4 == str || str4 == str3)
為false
。 請參閱String API 。
讓我們知道您發現了什么:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.