String str = new String("abc")创建了几个对象?结合源码解析

时间:2021-09-29 16:15:42

String str = new String("abc")创建了几个对象?结合源码解析

  首先,我们看一下jdk源码: 

 1 /**
 2      * Initializes a newly created {@code String} object so that it represents
 3      * the same sequence of characters as the argument; in other words, the
 4      * newly created string is a copy of the argument string. Unless an
 5      * explicit copy of {@code original} is needed, use of this constructor is
 6      * unnecessary since Strings are immutable.
 7      *
 8      * @param  original
 9      *         A {@code String}
10      */
11     public String(String original) {
12         this.value = original.value;
13         this.hash = original.hash;
14     }

  大家都知道String本身就是个引用类型,我们可以将String str = new String("adc")分为四部分来看,String str 第一部分变量名,=为第二部分给str赋值使用的,new String()为第三部分创建对象,"abc"为第三部分对象内容,然而第一部分和第二部分并没有创建对象。第三部分new String()肯定是创建了对象的。那么另一个对象时从何来的呢?从上面的源码中我们会看到一个带参的String的构造器;如果方法区的常量池里面没有所传的参数对象,这个参数会在方法区的常量池里面创建一个,加上我们new出来的,会有两个对象;但是如果在方法区里面有该参数,那么就会直接获取,因此jvm只会在堆里面创建对象本身,栈里面引用地址,这个时候就只有一个对象存在。所以,至于有多少个对象被创建,这个主要看之前是不是String original参数传入,要是情况而定。

  如有错误请多多指出。