java: String的==与equals
string 是對象,所以==對于string來說,是對比的內存地址;
解釋第一個:a==c//為true。 因為b被final修飾,那么它本身是一個常量,如果你原意的話,你可去看看編譯后的class文件。里面變量c = "hello2",底層原理是java進行了優化。會查找內存中是否存在"hello2",如果存在,那么就將地址賦予c,很明顯把a的內存地址賦予了c。所以才會a==c得到結果true
解釋第二個:a==e//為false。因為string的+2,底層原理是,StringBuffer.append("2").toString(); 很明顯,地址發生了改變,所以a==e得到結果會為false
?
?
由于string類比較特殊,jdk專門做了緩存優化。
?
原來Java運行時會維護一個String Pool(String池)。String池用來存放運行時中產生的各種字符串,并且池中的字符串的內容不重復。而一般對象不存在這個緩沖池,并且創建的對象僅僅存在于方法的堆棧區。
也就是說需要看string創建的方式:
?
1 當使用任何方式來創建一個字符串對象s時,Java運行時(運行中JVM)會拿著這個X在String池中找是否存在內容相同的字符串對象,如果不存在,則在池中創建一個字符串s,否則,不在池中添加。
2 Java中,只要使用new關鍵字來創建對象,則一定會(在堆區或棧區)創建一個新的對象。
3 使用直接指定或者使用純字符串串聯來創建String對象,則僅僅會檢查維護String池中的字符串,池中沒有就在池中創建一個,有則罷了!但絕不會在堆棧區再去創建該String對象。
4 使用包含變量的表達式來創建String對象,則不僅會檢查維護String池,而且還會在堆棧區創建一個String對象。
另外,String的intern()方法是一個本地方法,定義為public native String intern(); intern()方法的價值在于讓開發者能將注意力集中到String池上。當調用 intern 方法時,如果池已經包含一個等于此 String 對象的字符串(該對象由 equals(Object) 方法確定),則返回池中的字符串。否則,將此 String 對象添加到池中,并且返回此 String 對象的引用。
總結
以上是生活随笔為你收集整理的java: String的==与equals的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构:前缀,中缀,后缀表达式(逆波兰
- 下一篇: 史上最全,最完美的 JAVA 技术体系思