[英]static final String = “something” — does the static make sense?
static final String = "something";
我想知道這樣的聲明在Java中是否有某種真正的意義。 我已經在代碼中找到了成千上萬的時間,但是學習和使用字符串我已經學會了無關緊要多少次聲明一個String
對象:如果你之前的某個類聲明了這個字符串,那么它被合並並重用(我'我在談論沒有顯式構造函數調用創建的String)
public class StringCompare {
private void toCompare(String h) {
String x = "hello";
System.out.println( x == h);
}
public void compare() {
String h = "hello";
toCompare(h);
}
}
事實上,這段代碼在調用compare時打印為true
,因此2個變量引用同一個對象。 說final
變量不能重新定義,在這種情況下static
字是完全無用的 。 我錯過了這一點嗎?
更多東西:
1 - 為什么顯式調用String
構造函數不會導致String被合並? 上面的代碼使用new String("hello")
print false
。
2 - 是否為字符串保留了池化行為? 還有一些其他不可變對象(比如BigInteger),但我認為這些不是合並的......為什么?
謝謝,卡羅
開發人員使用此模式的原因有幾個,即使您對運行時行為的分析及其對字符串池的使用是正確的。
至於你的后續問題:
因為字符串池僅用於字符串文字,所以如JLS所述,並且調用構造函數不會被歸類為字符串文字。
字符串池僅用於字符串文字,但當然還有其他用於不同用例的緩存。 跳到腦海中最明顯的一個是用於優化自動裝箱的int緩存。
即使靜態在這種情況下不會給您帶來內存優勢,您仍然可以以靜態方式訪問該字段,因此您不需要實例。 例如,您經常使用一些URI,因此您創建以下類:
public class Uris
{
public static final String GOOGLE = "http://google.com";
public static final String BBC = "http://bbc.co.uk";
}
使用靜態 ,您可以使用Uris.GOOGLE
而不是新的Uris().GOOGLE
。
static
意味着對於為該類創建的每個新對象,String構造和池只需要發生一次。 這是一個小的計算節省。
這是因為String ="hello"
或String h
沒有在堆中創建任何對象,這些對象都存儲在String constant pool
,作為new String("hello");
在堆中創建一個新對象,因此地址將不同
檢查的細節在這里
String x = "hello";
String h = "hello";
是兩個String
文字。 它們位於公共池中(String池的一部分)。 有同樣的參考。 然后==
檢查參考,你會得到true
如果使用String x = new String("hello")
,它將創建一個新的String
對象x
。 當然是指新的參考。 現在比較參考給你false
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.