java 字符串缓冲池 String缓冲池
生活随笔
收集整理的這篇文章主要介紹了
java 字符串缓冲池 String缓冲池
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
java 中 String 創(chuàng)建詳細(xì)解釋
字符串對(duì)象是一種特殊的對(duì)象.String 類(lèi)是一個(gè)不可變的類(lèi)..也就說(shuō),String 對(duì)象
一旦創(chuàng)建就不允許修改
String 類(lèi)有一個(gè)對(duì)應(yīng)的 String 池,也就是 String pool.每一個(gè)內(nèi)容相同的字符串對(duì)
象都對(duì)應(yīng)于一個(gè) pool 里的對(duì)象.
1 看下面一段代碼.
[java]?view plaincopy String?s?=?new?String("abc");?? String?s1?=?"abc";?? String?s2?=?new?String("abc");?? System.out.println(s?==?s1);?? System.out.println(s?==?s2);?? System.out.println(s1?==?s2);??
請(qǐng)問(wèn) 前面三條語(yǔ)句分別創(chuàng)建了幾個(gè)對(duì)象,分別是什么.后面的輸出分別是什么
(1)String s = new String("abc"); 這句,創(chuàng)建了兩個(gè)對(duì)象..其內(nèi)容都是"abc".注意,
s 不是對(duì)象,只是引用.只有 new 生成的才是對(duì)象.
創(chuàng)建的流程是,首先括號(hào)里的"abc"先到 String pool 里看有沒(méi)"abc"這個(gè)對(duì)象,沒(méi)有
則在 pool 里創(chuàng)建這個(gè)對(duì)象..所以這里就在 pool 創(chuàng)建了一個(gè)"abc"對(duì)象.然后 通過(guò)
new 語(yǔ)句又創(chuàng)建了一個(gè)"abc"對(duì)象..而這個(gè)對(duì)象是放在內(nèi)存的堆里. .這里的 s 指
向堆里的對(duì)象.
(2) String s1 = "abc"; 這條語(yǔ)句,s1 當(dāng)然還是引用 .后面的"abc".其實(shí)就是上面括
號(hào)里的"abc".執(zhí)行的是相同的操作.即 在 pool 里查找有沒(méi)"abc"這個(gè)對(duì)象.沒(méi)有則
創(chuàng)建一個(gè)...很顯然,第一條語(yǔ)句在 pool 里已經(jīng)創(chuàng)建了一個(gè)"abc".所以這條語(yǔ)句沒(méi)
有創(chuàng)建對(duì)象,s1 指向的是 pool 中的"abc"
(3)String s2 = new String("abc"); 這條語(yǔ)句,其實(shí)和第一條是一樣的。因?yàn)榈谝?/span>
條已經(jīng)在 pool 中創(chuàng)建了"abc"這個(gè)對(duì)象,所以這條語(yǔ)句由于在 pool 中先找到了
"abc",所以不用在 pool 中再次創(chuàng)建"abc"了,而只是在堆里創(chuàng)建了一個(gè)新的
"abc"對(duì)象.s2 指向的是堆里的"abc".注意,雖然內(nèi)容都是"abc",s 與 s2 表示的是
不同的對(duì)象
(4)接下來(lái)就很好說(shuō)了.下面的三個(gè)==判斷.(注意,==永遠(yuǎn)是判斷內(nèi)存地址是否相
等) s 與 s1,一個(gè)指向堆里的對(duì)象,一個(gè)指向 pool 里的.很明顯是不同的對(duì)象.s 與
s2.上面說(shuō)了,雖然都是指向堆里的對(duì)象,內(nèi)容也是"abc",但是也不是相同的對(duì)象.
s1 與 s2.一個(gè)指向 pool,一個(gè)指向堆.也不是相同的對(duì)象.所以三個(gè)都返回 false.
2 第二個(gè)問(wèn)題
[java]?view plaincopy String?s?=?new?String("abc");?? String?s1?=?"abc";?? String?s2?=?new?String("abc");?? System.out.println(s?==?s1.intern());?? System.out.println(s?==?s2.intern());?? System.out.println(s1?==?s2.intern());??
求最后輸出是什么
解答.最后的答案是 false false true
intern()方法.按照 jdk 的幫助文檔來(lái)說(shuō),是返回字符串對(duì)象的規(guī)范化表示形式。通
俗一點(diǎn)說(shuō),就是返回對(duì)應(yīng)這個(gè)字符串內(nèi)容的那個(gè) pool 里的對(duì)象.這樣說(shuō)也許還看
不太明白,那可以拿具體例子來(lái)說(shuō)
s1.intern().他的執(zhí)行流程是,在 pool 里去查找 s1 對(duì)應(yīng)的內(nèi)容(也就是"abc").如果
找到,則返回 pool 里的對(duì)象.如果沒(méi)有(老實(shí)說(shuō),我沒(méi)想到有哪種情況是沒(méi)有的),則
在 Pool 創(chuàng)建這個(gè)對(duì)象,并返回...
這樣就很容易理解了.s1.intern 返回的是 pool 里的"abc"對(duì)象.與 s 這個(gè)堆里的對(duì)
象肯定不同,返回 false.同理,s 與 s2.intern()也肯定不同,返回 false.第三個(gè),s1 與
s2.intern().其中 s2.intern()返回的是 pool 中的"abc"對(duì)象,而 s1 也是指向 pool 中
的"abc"對(duì)象.所以返回的是 true:
3 第三個(gè)問(wèn)題
[java]?view plaincopy String?hello?=?"hello";?? String?hel?=?"hel";?? String?lo?=?"lo";?? System.out.println(hello?==?"hel"?+?"lo");?? System.out.println(hello?==?"hel"?+?lo);??
求輸出的結(jié)果
解答 true false
首先,上面已經(jīng)說(shuō)明了,hello hel lo 這三個(gè)都是指向 pool 中的對(duì)象..
現(xiàn)在我們考慮"hel" + "lo" 按照內(nèi)容來(lái)說(shuō),兩個(gè)相加也就是"hello".這個(gè)時(shí)候,這個(gè)會(huì)
返回 pool 中的"hello"對(duì)象.所以,hello == "hel" + "lo" 返回的是 true .
而"hel" + lo 雖然內(nèi)容也是"hello",但是它將在堆里面生成一個(gè)"hello"對(duì)象,并返回
這個(gè)對(duì)象...所以這里的結(jié)果是 false
總結(jié)一下就是,如果加號(hào)兩邊的是字面值(字面值就是直接在""里寫(xiě)的值,比如上面
的"hel"與"lo"),那么將在 pool 里查找有沒(méi)對(duì)應(yīng)內(nèi)容的對(duì)象(這里的內(nèi)容就是
"hello"),并返回 pool 里的對(duì)象.這和 hello 是一樣的....
如果加號(hào)兩邊不滿足上面的條件(比如,兩邊的值是引用值或者堆里的字符串對(duì)
象).那么將不會(huì)再 pool 里查找"hello",而是直接在堆里生成一個(gè)新的對(duì)象...
字符串對(duì)象是一種特殊的對(duì)象.String 類(lèi)是一個(gè)不可變的類(lèi)..也就說(shuō),String 對(duì)象
一旦創(chuàng)建就不允許修改
String 類(lèi)有一個(gè)對(duì)應(yīng)的 String 池,也就是 String pool.每一個(gè)內(nèi)容相同的字符串對(duì)
象都對(duì)應(yīng)于一個(gè) pool 里的對(duì)象.
1 看下面一段代碼.
[java]?view plaincopy
(1)String s = new String("abc"); 這句,創(chuàng)建了兩個(gè)對(duì)象..其內(nèi)容都是"abc".注意,
s 不是對(duì)象,只是引用.只有 new 生成的才是對(duì)象.
創(chuàng)建的流程是,首先括號(hào)里的"abc"先到 String pool 里看有沒(méi)"abc"這個(gè)對(duì)象,沒(méi)有
則在 pool 里創(chuàng)建這個(gè)對(duì)象..所以這里就在 pool 創(chuàng)建了一個(gè)"abc"對(duì)象.然后 通過(guò)
new 語(yǔ)句又創(chuàng)建了一個(gè)"abc"對(duì)象..而這個(gè)對(duì)象是放在內(nèi)存的堆里. .這里的 s 指
向堆里的對(duì)象.
(2) String s1 = "abc"; 這條語(yǔ)句,s1 當(dāng)然還是引用 .后面的"abc".其實(shí)就是上面括
號(hào)里的"abc".執(zhí)行的是相同的操作.即 在 pool 里查找有沒(méi)"abc"這個(gè)對(duì)象.沒(méi)有則
創(chuàng)建一個(gè)...很顯然,第一條語(yǔ)句在 pool 里已經(jīng)創(chuàng)建了一個(gè)"abc".所以這條語(yǔ)句沒(méi)
有創(chuàng)建對(duì)象,s1 指向的是 pool 中的"abc"
(3)String s2 = new String("abc"); 這條語(yǔ)句,其實(shí)和第一條是一樣的。因?yàn)榈谝?/span>
條已經(jīng)在 pool 中創(chuàng)建了"abc"這個(gè)對(duì)象,所以這條語(yǔ)句由于在 pool 中先找到了
"abc",所以不用在 pool 中再次創(chuàng)建"abc"了,而只是在堆里創(chuàng)建了一個(gè)新的
"abc"對(duì)象.s2 指向的是堆里的"abc".注意,雖然內(nèi)容都是"abc",s 與 s2 表示的是
不同的對(duì)象
(4)接下來(lái)就很好說(shuō)了.下面的三個(gè)==判斷.(注意,==永遠(yuǎn)是判斷內(nèi)存地址是否相
等) s 與 s1,一個(gè)指向堆里的對(duì)象,一個(gè)指向 pool 里的.很明顯是不同的對(duì)象.s 與
s2.上面說(shuō)了,雖然都是指向堆里的對(duì)象,內(nèi)容也是"abc",但是也不是相同的對(duì)象.
s1 與 s2.一個(gè)指向 pool,一個(gè)指向堆.也不是相同的對(duì)象.所以三個(gè)都返回 false.
2 第二個(gè)問(wèn)題
[java]?view plaincopy
解答.最后的答案是 false false true
intern()方法.按照 jdk 的幫助文檔來(lái)說(shuō),是返回字符串對(duì)象的規(guī)范化表示形式。通
俗一點(diǎn)說(shuō),就是返回對(duì)應(yīng)這個(gè)字符串內(nèi)容的那個(gè) pool 里的對(duì)象.這樣說(shuō)也許還看
不太明白,那可以拿具體例子來(lái)說(shuō)
s1.intern().他的執(zhí)行流程是,在 pool 里去查找 s1 對(duì)應(yīng)的內(nèi)容(也就是"abc").如果
找到,則返回 pool 里的對(duì)象.如果沒(méi)有(老實(shí)說(shuō),我沒(méi)想到有哪種情況是沒(méi)有的),則
在 Pool 創(chuàng)建這個(gè)對(duì)象,并返回...
這樣就很容易理解了.s1.intern 返回的是 pool 里的"abc"對(duì)象.與 s 這個(gè)堆里的對(duì)
象肯定不同,返回 false.同理,s 與 s2.intern()也肯定不同,返回 false.第三個(gè),s1 與
s2.intern().其中 s2.intern()返回的是 pool 中的"abc"對(duì)象,而 s1 也是指向 pool 中
的"abc"對(duì)象.所以返回的是 true:
3 第三個(gè)問(wèn)題
[java]?view plaincopy
解答 true false
首先,上面已經(jīng)說(shuō)明了,hello hel lo 這三個(gè)都是指向 pool 中的對(duì)象..
現(xiàn)在我們考慮"hel" + "lo" 按照內(nèi)容來(lái)說(shuō),兩個(gè)相加也就是"hello".這個(gè)時(shí)候,這個(gè)會(huì)
返回 pool 中的"hello"對(duì)象.所以,hello == "hel" + "lo" 返回的是 true .
而"hel" + lo 雖然內(nèi)容也是"hello",但是它將在堆里面生成一個(gè)"hello"對(duì)象,并返回
這個(gè)對(duì)象...所以這里的結(jié)果是 false
總結(jié)一下就是,如果加號(hào)兩邊的是字面值(字面值就是直接在""里寫(xiě)的值,比如上面
的"hel"與"lo"),那么將在 pool 里查找有沒(méi)對(duì)應(yīng)內(nèi)容的對(duì)象(這里的內(nèi)容就是
"hello"),并返回 pool 里的對(duì)象.這和 hello 是一樣的....
如果加號(hào)兩邊不滿足上面的條件(比如,兩邊的值是引用值或者堆里的字符串對(duì)
象).那么將不會(huì)再 pool 里查找"hello",而是直接在堆里生成一個(gè)新的對(duì)象...
總結(jié)
以上是生活随笔為你收集整理的java 字符串缓冲池 String缓冲池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java对.txt文件进行读取方法实战-
- 下一篇: StringBuilder与String