簡體   English   中英

字符串對象的創建及其構造函數

[英]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

想要確保substrsubstr2在堆內存中是相同類型的操作和相同行為。

我知道String.substring()根本不創建新對象,而是使用具有不同偏移量的先前char []對象的一件事。

那么substrsubstr2會發生什么呢? 我們可以將這些東西與構造函數相關聯嗎,因為偏移量是在構造函數內部生成的。

摘自JLS§3.10.5。 字符串文字

字符串文字是對String類(第4.3.1節,第4.3.3節)的實例的引用。

而且,字符串文字總是引用類String的相同實例。 這是因為使用String.intern方法,對“字符串文字”(或更一般地說,是常量表達式的值(第15.28節)的字符串)進行了“插入”,以便共享唯一的實例。

因此, "Java"是指String對象。 此外,任何由相同字符組成的字符串文字都將引用相同的String對象。 但是,該對象的構造方式和時間尚未指定。

想要確保substrsubstr2在堆內存中是相同類型的操作和相同行為。

是的,它們是完全相同的一種操作。

我知道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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM