String Tab
1、String基本特性
-
final修飾、不可繼承
-
實作Serializable:可序列化
-
實作Comparable:可排序比較大小
-
jdk8及以前使用final char value[]存盤,之后改為byte[]
- 原因:char占兩個位元組,byte占一個位元組,大部分情況下使用的都是拉丁字符(占一個位元組)、避免浪費
-
字串常量池中不會存盤相同內容的字串
-
String Pool是一個固定大小的HashTable,String過多容易hash沖突、鏈表過長 、tring.intern性能下降
-
設定長度:-XX:StringTableSize
-
String Table默認大小1009(jdk6,設定大小無要求),60013(jdk7)、jdk8開始1009是可設定的最小值

c如果設定最小值小于1009、報錯

-
2、String記憶體分配
-
Java 6及以前,字串常量池存放在永久代,
-
Java 7 中 Oracle 的工程師對字串池的邏輯做了很大的改變,即將字串常量池的位置調整到Java堆內,
所有的字串都保存在堆(Heap)中,和其他普通物件一樣,這樣可以讓你在進行調優應用時僅需要調整堆大小就可以了,字串常量池概念原本使用得比較多,但是這個改動使得我們有足夠的理由讓我們重新考慮在Java7中使用string.intern(), -
Java8元空間,字串常量在堆
為什么調整位置?
3、字串拼接操作
1.常量與常量(常量參考,如final修飾的常量)的拼接結果在常量池,原理是編譯期優化


2.常量池中不會存在相同內容的常量,
3.只要其中有一個是變數,結果就在堆中,變數拼接的原理是stringBuilder


StringBuilder拼接字串與 ‘+’ 拼接字串差別
- StringBuild的append方式:
- 自始至終只創建一個StringBuilder物件
- 優化:可以根據實際情況,給出一個限定值作為引數來創建構造器,避免多次擴容
- ‘+’拼接的方式:
- 呼叫了多少次拼接就創建了多少個StringBulider和String物件、導致記憶體占用過多,GC需要更多時間
4.如果拼接的結果呼叫intern()方法,則主動將常量池中還沒有的字串物件放入池中,并回傳此物件地址,
4、intern()使用
回傳的是字串在常量池中的地址(如果沒有該字串將會加載一個、再回傳)
native方法
Interned string就是確保字串在記憶體里只有一份拷貝,這樣可以節約記憶體空間,加快字串操作任務的執行速度,注意,這個值會被存放在字串內部池(String Intern Pool),
- jdk1.6中,將這個字串物件嘗試放入串池,
- 如果串池中有,則并不會放入,回傳已有的串池中的物件的地址
- 如果沒有,會把此物件復制一份,放入串池,并回傳串池中的物件地址
- Jdk1.7起,將這個字串物件嘗試放入串池,
- 如果串池中有,則并不會放入,回傳已有的串池中的物件的地址
- 如果沒有,則會把物件的參考地址復制一份,放入串池,并回傳串池中的參考地址
對于程式中存在大量重復字串、使用intern方法能夠接合適呢個記憶體空間
面試題
new String(“ab”)會創建幾個物件?
答案:兩個,一個是通過new關鍵字在堆空間創建的;另一個是字串在常量池中的物件
拓展:new String(“a”)+new String (“b”)呢?
答案:6個,
new StringBuilder()
new String(“a”)
“a”
new String(“b”)
”b”
new String(“ab”)
注意:常量池中并不存在“ab”

拓展:

拓展:

拓展:

String tab的垃圾回收
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13886.html
標籤:Java
上一篇:Java基礎之集合
