String s = new String("abc"); 在运行时涉及几个String实例?

 2023-02-06
原文作者:蒋先森 原文地址:https://jlj98.top/

如果有不正确的,欢迎指正。

String,StringBuilder,StringBuffer源码分析
上面这篇是之前写的关于 String 的一些介绍,有兴趣可以看下。

今天重新翻看 《Effective Java》这本书的时候,看到第五条:避免创建不必要的对象。文中是以 String s = new String(“stringette”); 拿来举例的。看到这里,就想起以前看一些面经中看到的一个问题,对于上面的的语句,在运行时涉及几个String实例?

对于上面的答案: 两个,一个是字符串 “abc” 锁在常量池中的实例,另一个是通过 new String(String) 创建并初始化、内容与 “abc” 相同的实例。

202212301147468461.png

但是对下面的代码:

    public class StringDemo {
    
        public static void main(String[] args) {
            String s1 = "abc";
            String s = new String("abc");
            System.out.println(s == s1);
        }
    }

202212301147489772.png

字节码 ldc:将常量值从常量池中取出压入栈中。

通过查看上面代码的字节码的第0行和第7行可以看出,该字符串变量的值已经确定了,并没有重新创建一个变量,而是从缓冲区中取出,同时让该变量指向该字符串值。

Reference