标签:jdk1.7 ringbuf 中国 str 复制 常量池 jdk 固定 print
// jdk1.6 // false、true、false、true、false、true // jdk1.7 // false、true、true、true、false、true // jdk1.8 // false、true、true、true、false、true String str1 = new StringBuffer("ja").append("va").toString(); String intern1 = str1.intern(); System.out.println(intern1 == str1); System.out.println(intern1.equals(str1)); String str2 = new StringBuffer("我是").append("中国人").toString(); String intern2 = str2.intern(); System.out.println(intern2 == str2); System.out.println(intern2.equals(str2)); String str3 = new StringBuffer("我是").append("中国人").toString(); String intern3 = str3.intern(); System.out.println(intern3 == str3); System.out.println(intern3.equals(str3)); /** * "java"字符串常量比较特殊,它是固定存在字符串常量池中,所以都是返回了false * Java6中字符串常量池是在永久代区,intern方法会将首次遇到的字符串复制到那里,返回的也是永久代中这个字符串的引用。不建议使用这个方法。 * Java7中字符串常量池被放到了堆中,intern的实现也不再是复制实例,只是在常量池中记录首次出现的实例引用。 * Java8同7一致 */
代码解释:
(1)java1.6
str1、str2和str3都是指向堆内存的地址;
intern1、intern2和intern3都是指向永生代的常量池地址;
所以,“==”的地址比较肯定都是false,但是equals比较的都是内容,所以都是true;
(2)java1.7
str1、str2和str3都是指向堆内存的地址
由于“java”字符串的特殊性,intern1指向的常量池的地址,所以第一个地址的比较就是false;
intern2和str2都是指向同一块堆地址,所以第二个地址的比较就是true;
由于str3的字符串已经在常量池中存在,所以intern3就和intern2、str2的地址保持一致;
Java1.6、Java7和Java8关于itern()方法的使用
标签:jdk1.7 ringbuf 中国 str 复制 常量池 jdk 固定 print
原文地址:http://www.cnblogs.com/jgwmjz/p/6125026.html