String str = new String("xyz") 创建了几个对象?

首先在看这个问题之前先要知道一下String创建对象的过程。
String 在创建对象的时候jvm首先会去字符串常量池中找这个对象是否存在,如果存在直接返回这个对象的引用,如果不存在则创建一个新对象。

看下下面的代码:

    public static void main(String[] args) {
        String str1 = "Hello";
        // System.identityHashCode(s) 方法可以返回对象内存地址,不管对象是否重写hashCode()方法
        System.out.println(System.identityHashCode(str1));// 1112280004

        str1 = "java";
        System.out.println(System.identityHashCode(str1));// 1013423070

        String str2 = "Hello";
        System.out.println(System.identityHashCode(str2));// 1112280004

        String str3 = new String("Hello");
        System.out.println(System.identityHashCode(str3));// 380936215

        String str4 = "Hello";
        System.out.println(System.identityHashCode(str4));// 1112280004
    }
  • 在执行String str1 = "Hello"的时候,jvm首先在字符串常量池中寻找"Hello",显然是没有的,所以创建一个对象,并将这个对象的引用返回给str1。
  • 在执行str1 = "java"的时候,jvm创建一个对象 "java" 并将这个对象的引用返回给 str1。
  • 在执行 String str2 = "Hello" 时,jvm去字符串常量池中找"Hello",找到了内存地址为1112280004的对象,直接将这个对象的引用返回给str2,所以没有重新创建对象。
  • 在执行 String str3 = new String("Hello")的时候,jvm首先去字符串常量池中寻找"Hello"对象,因为之前已经存在了,所以不会再去创建。因为new 关键字,会在内存中重新开辟一个空间,创建一个对象。所以他的内存地址为:380936215
  • 最后执行 String str4 = "Hello" 的时候,因为jvm中存在这个对象,所以直接返回内存地址为1112280004的对象引用。

回归问题:
如果只是单纯的 String str = new String("xyz") ,那么jvm首先会去字符串常量池中查找这个对象,不存在,创建"xyz"这个对象(第一次创建),之后new 关键字会在内从中重新开辟一个新的空间,创建一个新的对象(第二次创建)。

\color{blue}{所以 String str = new String("xyz") 会创建两个对象。}

推荐阅读更多精彩内容