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