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