第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Java中使用Final關(guān)鍵字可以提高性能嗎?

在Java中使用Final關(guān)鍵字可以提高性能嗎?

慕工程0101907 2019-07-05 12:30:09
在Java中使用Final關(guān)鍵字可以提高性能嗎?在Java中,我們看到很多地方final關(guān)鍵字可以使用,但它的使用并不常見。例如:String str = "abc";System.out.println(str);在上述情況下,str可以final但這通常都會被擱置。當(dāng)一個方法永遠(yuǎn)不會被覆蓋時,我們可以使用Final關(guān)鍵字。類似地,在不被繼承的類的情況下。在任何或所有這些情況下使用Final關(guān)鍵字真的可以提高性能嗎?如果是,那怎么做?請解釋一下。如果正確使用final對于性能來說,真正重要的是,Java程序員應(yīng)該養(yǎng)成什么樣的習(xí)慣才能更好地使用關(guān)鍵字呢?
查看完整描述

3 回答

?
翻過高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗 獲得超3個贊

是的可以。下面是一個最終可以提高性能的實例:

條件編譯是一種技術(shù),在這種技術(shù)中,代碼行不會根據(jù)特定條件編譯到類文件中。這可用于刪除生產(chǎn)生成中的大量調(diào)試代碼。

考慮以下幾點:

public class ConditionalCompile {

  private final static boolean doSomething= false;

    if (doSomething) {
       // do first part. 
    }

    if (doSomething) {
     // do second part. 
    }

    if (doSomething) {     
      // do third part. 
    }

    if (doSomething) {
    // do finalization part. 
    }}

通過將DoSomething屬性轉(zhuǎn)換為最終屬性,您已經(jīng)告訴編譯器,每當(dāng)它看到DoSomething時,它應(yīng)該按照編譯時替換規(guī)則用false替換它。編譯器的第一次傳遞將代碼更改為某物就像這樣:

public class ConditionalCompile {

  private final static boolean doSomething= false;

    if (false){
       // do first part. 
    }

    if (false){
     // do second part. 
    }

    if (false){
      // do third part. 
    }

    if (false){
    // do finalization part. 

    }}

一旦完成,編譯器將再次查看它,并看到代碼中有一些不可訪問的語句。由于您使用的是高質(zhì)量的編譯器,所以它不喜歡所有那些無法訪問的字節(jié)碼。所以它移除了它們,你就得到了這樣的結(jié)果:

public class ConditionalCompile {


  private final static boolean doSomething= false;

  public static void someMethodBetter( ) {

    // do first part. 

    // do second part. 

    // do third part. 

    // do finalization part. 

  }}

從而減少了任何過多的代碼,或任何不必要的有條件檢查。

編輯:作為一個示例,讓我們使用以下代碼:

public class Test {
    public static final void main(String[] args) {
        boolean x = false;
        if (x) {
            System.out.println("x");
        }
        final boolean y = false;
        if (y) {
            System.out.println("y");
        }
        if (false) {
            System.out.println("z");
        }
    }}

在用Java 8編譯此代碼和用javap -c Test.class我們得到:

public class Test {
  public Test();
    Code:
       0: aload_0       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static final void main(java.lang.String[]);
    Code:
       0: iconst_0       1: istore_1       2: iload_1       3: ifeq          14
       6: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;
       9: ldc           #22                 // String x
      11: invokevirtual #24                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      14: iconst_0      15: istore_2      16: return}

我們可以注意到,編譯后的代碼只包含非最終變量。x..這表明最終變量對性能有影響,至少在這個簡單的情況下是這樣的。


查看完整回答
反對 回復(fù) 2019-07-05
?
慕神8447489

TA貢獻(xiàn)1780條經(jīng)驗 獲得超1個贊

通常不會。對于虛擬方法,HotSpot會跟蹤該方法是否具有其實被重寫,并且能夠執(zhí)行優(yōu)化,例如在假設(shè)方法沒有被重寫-直到它加載一個重寫方法的類,此時它可以撤消(或部分撤消)這些優(yōu)化。

(當(dāng)然,這是假設(shè)您在使用HotSpot-但它是目前為止最常見的JVM,所以.)

在我看來你應(yīng)該用final基于清晰的設(shè)計和可讀性,而不是出于性能原因。如果您出于性能原因想要更改任何內(nèi)容,那么在將最清晰的代碼變形之前,您應(yīng)該執(zhí)行適當(dāng)?shù)亩攘?這樣您就可以決定是否有任何額外的性能值得進(jìn)行較差的可讀性/設(shè)計。(以我的經(jīng)驗,這幾乎是不值得的;YMMV。)

編輯:由于最后的領(lǐng)域已經(jīng)提到,值得提出的是,他們往往是一個好主意,無論如何,就明確的設(shè)計。它們還改變了跨線程可見性方面的保證行為:在構(gòu)造函數(shù)完成后,所有最終字段都保證在其他線程中立即可見。這可能是最常用的final根據(jù)我的經(jīng)驗,雖然我支持喬希·布洛赫的“要么繼承要么禁止”的經(jīng)驗法則,但我可能應(yīng)該使用final更多的是為了上課.。


查看完整回答
反對 回復(fù) 2019-07-05
  • 3 回答
  • 0 關(guān)注
  • 1607 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號