1,jvm爲了提高性能和減少內存開銷,在進行實例化字符串常量時做了一些優化。
首先,爲了減少在jvm中創建的字符串的數量,字符串類就維護了一個字符串池,每當代碼創建字符串常量時,jvm會首先檢查字符 串常量池。
然後,如果字符串已經在池內,就返回池中的實例引用。
如果字符串不在池內,就會實例化一個字符串放到池中,java能夠進行這樣的優化時因爲字符串不可變的,可以不用擔心數 據衝突進行共享。
原理:實現該優化的基礎是因爲字符串是不可變的,可以不用擔心數據衝突進行共享;
運行時實例創建的全局字符串常量池中會有一個表,總是爲池中每個唯一的字符串對象維護一個引用,這就意味着它們一 直引用着字符串常量池中的對象,所以,在常量池中這些字符串不會被垃圾收集器回收。
存儲位置:在JDK6.0及之前版本,字符串常量池是放在Perm Gen區(也就是方法區)中
在JDK7.0版本,字符串常量池被移到了堆中了。至於爲什麼移到堆內,大概是由於方法區的內存空間太小了
如何操作:String.intern();
通過new操作符創建的字符串對象不指向字符串池中的任何對象,但是可以通過字符串的intern()方法來指向其中的某一個,java.lang.String.intern()返回一個保留池字符串,就是一個在全局字符串池中有了一個入口。如果以前沒有在全局字符串池中,那麼它就會被添加到裏面。
String s1 = "Hello";
String s2 = new String("Hello");
String s3 = s2.intern();
System.out.println("s1 == s3? " + (s1 == s3)); // true