導航:首頁 > 編程語言 > javafinalclass性能

javafinalclass性能

發布時間:2024-02-03 03:48:02

java方法中變數用final修飾對性能有影響!你覺得呢

在java中使用final修飾類型(包括類和介面)或類的成員與修飾方法中的普通變數從JVM的角度上看是不一樣的!鑒於你談論的是用其修飾方法中普通變數的形式,故簡單說一下這方面的東東。

是否使用final修飾方法中普通變數對JVM來說沒有區別!使用final修飾方法中普通變數主要是為了給Java前端編譯器(如javac)看的!也就是說方法中被final修飾的普通變數在前端編譯時被javac檢查並保證該變數不會在作用域內被改變新值,但被編譯成位元組碼後用於修飾方法中普通變數的final就已經不存在了!說的再具體點就是你用或不用final修飾方法中普通變數而生成的位元組碼文件(.class文件)沒有區別(建議你用某種Class文件編輯器查看一下)!!! 當然在編譯過程中會掃描final關鍵字並對其生成詞法單元(Token),同時生成的抽象語法樹(AST)在未優化之前也是有區別的。
故如你所說的「普通方法中變數用final修飾的,方法結束後jvm是不會回收這個變數的,也就不會釋放內存!」這個要看該變數的作用域(比如是否發生常見的方法或線程逃逸等情況)以及是否賦值為字面量(比如字元串字面量"XXX"在載入時會被拘留(intern)在運行時常量池中,而不會在方法結束後下次GC時被回收,但這與final修飾無關!) 等特殊情況,但其是否被回收與是否僅被final修飾無關!!

至於用final修飾類型(包括類和介面)或類的成員從JVM角度考慮就和上面的很不一樣了,比如你談到的被final修飾的方法,雖然從虛擬機規范層面上講也使用invokevirtual位元組碼調用,但其實它已經屬於非虛方法,在JVM的角度上完全可以(當然還要看具體JVM如何實現)用指向目標方法對象的指針來作為解析的結果(直接引用),而不用再通過虛方法表進行每次執行時的動態分派過程,從而提高運行效率。再比如你談到的內聯,就我所知不用final修飾的方法在運行時只要JVM判斷其滿足一定條件(比如常見的HotSpot虛擬機對「熱點」方法的判斷)時也會根據具體情況進行內聯(守護內聯機制或內聯緩存機制)這種基礎優化機制,這方面就不多說了。(有些跑題了,呵呵)

最後想說的就是不推薦僅為了有可能提高的一點執行效率而盡可能多的使用或者濫用final(同樣也適用於static等關鍵字),首先提升程序執行效率應該更多的從演算法復雜度、業務流程合理性、軟體架構合理性以及後期運行時環境調優上著手,而僅從某種語法內部運行機制上打主意意義不大!當然《Effective Java》中還是給出了不少關於使用java方面有意義的指引。其次不同的JVM產品或相同JVM產品不同版本或相同版本不同JVM配置參數都可能對同一語法機制在內部有不同的運行策略,很有可能原本希望提升執行效率的手段在某種運行時環境下卻成了瓶頸。再者就算不考慮代碼的可讀性和可維護性,但在注釋時又如何去說明僅為了提升性能而用的final或其他關鍵字呢?(當然可以忽視掉對它們的注釋,我想這也是造成樓主提問的原因。)

羅嗦了一大堆,也不知是否是你想談論的,希望對彼此有幫助吧。
個人看法,屬於原創,僅供參考,水平有限,錯誤難免,接受指正,謝謝。

⑵ Java中final修飾的類有什麼作用

Java中,final關鍵字可以用來修飾類、方法和變數(包括成員變數和局部變數)。下面就從這三個方面來了解一下final關鍵字的基本用法。x0dx0a1.修飾類x0dx0a當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。x0dx0ax0dx0a在使用final修飾類的時候,要注意謹慎選擇,除非這個類真的在以後不會用來繼承或者出於安全的考慮,盡量不要將類設計為final類。x0dx0a2.修飾方法x0dx0a下面這段話摘自《Java編程思想》第四版第143頁:x0dx0a「使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。「x0dx0a因此,如果只有在想明確禁止 該方法在子類中被覆蓋的情況下才將方法設置為final的。x0dx0a註:類的private方法會隱式地被指定為final方法。x0dx0a3.修飾變數x0dx0a修飾變數是final用得最多的地方,也是本文接下來要重點闡述的內容。首先了解一下final變數的基本語法:x0dx0a對於一個final變數,如果是基本數據類型的變數,則其數值一旦在初始化之後便不能更改;如果是引用類型的變數,則在對其初始化之後便不能再讓其指向另一個對象。

⑶ Java給函數的參數加上final,對性能有影響嗎

可以提高性能,但是非常少,使用FINAL把變數定義為常量之後,一定程度上加快了變數的讀取,因為你肯定不會也不可能再修改了,所以虛擬機對常量會採取特殊存儲優化。

⑷ 如何優化JAVA代碼及提高執行效率

1、 盡量指定類的final修飾符帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50% 。
2、 盡量重用對象。特別是String 對象的使用中,出現字元串連接情況時應用StringBuffer 代替。由於系統不僅要花時間生成對象,以後可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象將會給程序的性能帶來很大的影響。
3、 盡量使用局部變數,調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧(Stack)中,速度較快。其他變數,如靜態變數、實例變數等,都在堆(Heap)中創建,速度較慢。另外,依賴於具體的編譯器/JVM,局部變數還可能得到進一步優化。請參見《盡可能使用堆棧變數》。

閱讀全文

與javafinalclass性能相關的資料

熱點內容
壓縮完了文件去哪裡找 瀏覽:380
武裝突襲3浩方聯機版本 瀏覽:674
網路機頂盒移動網路 瀏覽:391
iphone手機百度雲怎麼保存到qq 瀏覽:148
資料庫設計與實踐讀後感 瀏覽:112
js對象是什麼 瀏覽:744
網頁文件存pdf 瀏覽:567
文件夾正裝 瀏覽:279
剛復制的文件找不到怎麼辦 瀏覽:724
試運行適用於哪些體系文件 瀏覽:987
ghost文件復制很慢 瀏覽:967
傑德原車導航升級 瀏覽:240
編程dest是什麼意思 瀏覽:935
linux埠鏡像 瀏覽:820
iphone5屏幕清塵 瀏覽:157
機頂盒密碼怎麼改 瀏覽:672
w7系統下載32位教程 瀏覽:618
pcb文件包括哪些內容 瀏覽:598
g00文件 瀏覽:607
用bat程序刪除程序 瀏覽:516

友情鏈接