簡體   English   中英

在編譯時或運行時生成 Java 字符串

[英]Java String generation at compile time or runtime

鑒於此代碼:

if(somecondition) {
    String one = "one";
    //print one;
}

只有在該條件為真時才會生成此字符串?

感謝任何幫助。

編輯:

使用字符串池,可以肯定地說,無論條件如何,字符串one都會被添加到池中。

那么,如果需要從對象解析變量,會發生什么?

說,

String hello = "Hello Mr " + user.firstName();

這將如何添加到字符串池中? 並且當它確實被添加到字符串池時,它不會正確地創建新的字符串文字(除非 user.firstName() 更改)。

該字符串在您鍵入時生成; 但是,為了讓這個答案有意義,我們需要在應用程序的構建和啟動過程中經歷轉換。

  1. 首先,您將其輸入到*.java文件中。
  2. 然后編譯器將其作為常量池條目的一部分復制到*.class文件中。
  3. 然后運行程序並請求類,這觸發類加載器將文件從磁盤復制到 RAM,觸發創建的對象元數據條目以將常量包裝在常量池中。

因此,根據您對希望使用的“創建”類型的定義,可以在多個位置“創建”它。

現在,在您的第一個示例中,使用字符串時並未實現 String 對象,而是使用*.class文件時。 但是,在您輸入方法之前,它不會被正在運行的程序引用。

最后,使用字符串池化,每次將要創建字符串時,都會搜索現有字符串池,如果找到匹配條目,則使用匹配條目而不是創建新字符串。 這以大量字符串搜索為代價減少了運行時中的字符串數量。

由於您的代碼的詳細信息,您有三個不同的字符串符合池化條件(“Hello Mr”, user.firstName()的值,以及將它們組合在一起的字符串)。 “你好先生”將與類加載合並(假設正在完成合並)。 user.firstName()的值會在最初創建返回值時發生。 生成的組合字符串將在分配之前(或來自池的引用,如果它已經存在於池中)被池化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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