String和常量池
生活随笔
收集整理的這篇文章主要介紹了
String和常量池
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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:比較的是兩個(gè)對(duì)象的內(nèi)容是否一樣
當(dāng)調(diào)用 intern 方法時(shí),如果池已經(jīng)包含一個(gè)等于此 String 對(duì)象的字符串(該對(duì)象由 equals(Object) 方法確定),則返回池中的字符串。否則,將此 String 對(duì)象添加到池中,并且返回此 String 對(duì)象的引用。
String.intern()方法獲得在常量池中的字符串引用,如果常量池中沒有則會(huì)將字符串加入,然后將該引用放入list持有
確保不會(huì)被回收,jdk報(bào)錯(cuò)permgem space發(fā)生在永久代 jdk7報(bào)錯(cuò) java heap space發(fā)生在堆
List<String> list = new ArrayList<>();int i = 0;while (true) {list.add(String.valueOf(i++).intern());}
總結(jié)
以上是生活随笔為你收集整理的String和常量池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM内存溢出的几种情形
- 下一篇: Tomcat定时任务