❶ java中==和equal有什麼區別
Java中==和equal的區別為:
1、== 表示 判斷2個變數或對象實例是否指向同一個內存空間,equals()表示 判斷2個變數或對象實例所指向的內存空間的值是否相同。
2、== 表示 對內存地址進行比較,equals()表示 對字元串的內容進行比較。
3、== 表示引用是否相同,equals() 表示值是否相同。
❷ 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中的字元串到底是在方法區的常量池裡還是new出來的對象里
String str ="nihao";
當這段代碼編譯的時候,首先它會去堆里的方法區常量池裡去查找,如果有一個同樣的字元串「nihao」,存在,那麼它會把當前聲明的對象的地址指向那個字元串對象,調用的是String.itern()方法。如果沒有的話,它會開啟堆內存,分割一塊新的地址指向str對象。
String是不可變的(final的),不必擔心穩定性問題。
而當你新new一個String數組的時候,當你給String數組賦值的時候,它同樣遵循這個原理。
這樣做的好處:字元串多重利用,防止產生冗餘。
詳情參考jdk中String類的的itern方法:
public String intern()
返回字元串對象的規范化表示形式。
一個初始為空的字元串池,它由類 String 私有地維護。
當調用 intern 方法時,如果池已經包含一個等於此 String 對象的字元串(用 equals(Object) 方法確定),則返回池中的字元串。否則,將此 String 對象添加到池中,並返回此 String 對象的引用。
它遵循以下規則:對於任意兩個字元串 s 和 t,當且僅當
s.equals(t) 為 true 時,s.intern()==t.intern() 才為 true。
所有字面值字元串和字元串賦值常量表達式都使用 intern 方法進行操作。