String和常量池
生活随笔
收集整理的這篇文章主要介紹了
String和常量池
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
jdk1.6之前常量池屬于永久代,jdk1.7以后移到堆中。
String s1 = "abc";// 放在常量池中String s2 = "abc";// 從常量池中查找String s3 = new String("abc");//new放在堆中String s4 = new String("abc");String s5 = s1.intern();String s6 = s3.intern();System.out.println(s1 == s2);System.out.println(s1 == s3);System.out.println(s1 == s5);System.out.println(s1 == s6);System.out.println(s3 == s4);System.out.println("==================");System.out.println(s1.equals(s2));System.out.println(s1.equals(s3));System.out.println(s1.equals(s5));System.out.println(s3.equals(s4));
==:比較引用地址一樣
equals:比較的是兩個對象的內容是否一樣
當調用 intern 方法時,如果池已經包含一個等于此 String 對象的字符串(該對象由 equals(Object) 方法確定),則返回池中的字符串。否則,將此 String 對象添加到池中,并且返回此 String 對象的引用。
String.intern()方法獲得在常量池中的字符串引用,如果常量池中沒有則會將字符串加入,然后將該引用放入list持有
確保不會被回收,jdk報錯permgem space發生在永久代 jdk7報錯 java heap space發生在堆
List<String> list = new ArrayList<>();int i = 0;while (true) {list.add(String.valueOf(i++).intern());}
總結
以上是生活随笔為你收集整理的String和常量池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM内存溢出的几种情形
- 下一篇: Tomcat定时任务