簡體   English   中英

static final String =“something” - 靜態是否有意義?

[英]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),但我認為這些不是合並的......為什么?

謝謝,卡羅

開發人員使用此模式的原因有幾個,即使您對運行時行為的分析及其對字符串池的使用是正確的。

  1. 它更清晰地傳達開發人員的意圖。 具體來說,字符串現在有一個名稱,希望比常量更清晰,並且它傳達的運行時行為並非每個人都知道(或者他們不時忘記)。
  2. 如果開發人員想要更改源文件中的值,並且已在多個位置使用它,則只有一個位置可以進行更改。
  3. 一旦決定使用變量,關鍵字static將意味着內存使用率較低。 也就是說,只有一個字段用於存儲ref,而不是每個對象實例存儲一個字段。

至於你的后續問題:

  1. 問:為什么顯式調用String構造函數不會導致String被合並? 上面的代碼使用新的String(“hello”)print false。

因為字符串池僅用於字符串文字,所以如JLS所述,並且調用構造函數不會被歸類為字符串文字。

  1. 問:匯總行為是否保留給Strings?

字符串池僅用於字符串文字,但當然還有其他用於不同用例的緩存。 跳到腦海中最明顯的一個是用於優化自動裝箱的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.

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