关于String的intern的一个题目

public static void main(String[] args) {
    String str1 = new StringBuilder("计算机").append("软件").toString();
    System.out.println(str1.intern() == str1);
    String str2 = new StringBuilder("ja").append("va").toString();
    System.out.println(str2.intern() == str2);
}

输出结果
true
false

intern方法之前是在常量池寻找有没有这个字符串,如果有就返回它,没有就在常量池
创建一个,但是在jdk1.7之后,只是在常量池中记录首次出现的实例引用,
也就是 例如有 堆中的一个字符串对象,他只会把这个引用给复制过去

在这个题目里

 public synchronized String toString() {
        return new String(value, 0, count);
    }

第一个当调用toString方法的时候,会在堆中创建一个对象,当第二次调用intern方法的时候,会返回这个对象的引用,因此为true

第二个因为java这个字符串已经在常量池中存在了,所以返回的肯定不会是你新创建的对象,所以为false
加载java这个字符串应该是在System类中,有个静态变量
private static final String launcher_name = “java”;

new String(value, 0, count); 和 new String(“XX”)是不同的,不用去考虑这个。

猜你喜欢

转载自blog.csdn.net/a1065712890/article/details/79947167
今日推荐