我们用如下代码来证明两个版本intern方法的区别。
jdk1.6
String ab = new String("a") + new String("b"); //在堆中创建"a","b","ab"; String ab2 = ab.intern();//先判断常量池中是否有"ab",如果有直接返回常量池中的地址,如果没有则拷贝一份ab对象放入常量池。 String ab3 = "ab";//因为常量池中有"ab",此时直接返回常量池中地址。 System.out.println( ab2 == ab3 );//true System.out.println( ab == ab3 );//false 此时ab还是返回堆中的地址
jdk1.8
String ab = new String("a") + new String("b"); //在堆中创建"a","b","ab"; String ab2 = ab.intern();//先判断常量池中是否有"ab",如果有直接返回常量池中的地址,如果没有则将该对象放入常量池中。 String ab3 = "ab";//因为常量池中有"ab",此时直接返回常量池中地址。 System.out.println( ab2 == ab3 );//true System.out.println( ab == ab3 );//true 此时ab已经被放入常量池中,所以地址相同
原文地址:https://www.cnblogs.com/pastjx/p/12321431.html
时间: 2024-10-08 09:05:37