String a = new String("xyz");
String b = new String("xyz");
String c = new String(a);
String d = b;以上代码总共声明了几个String对象?希望能看到分析的过程
String b = new String("xyz");
String c = new String(a);
String d = b;以上代码总共声明了几个String对象?希望能看到分析的过程
每次使用new就会创建一个对象,
最后一次是传引用。System.out.println(a==b);
System.out.println(a==c);
System.out.println(a==d);
System.out.println(d==b);
结果
false
false
false
true
在String a = new String("xyz"); 中,首先,左边的部分开辟了一块内存,申明a,a在栈中被初始化,之后()中"xyz"首先被加载到java的字符串池中,为一个对象的创建。之后又new了一个String类型的对象,又在堆中开辟了一块内存,内存的中值为"xyz"指向a,这个值在被垃圾回收前将一直存在,之后再如String a = new String("xyz");这样的变量赋值不会再创建"xyz".这个值取自java自带的字符串池。这里创建了两个对象"xyz"以及指向a的对象。
所以String b = new String("xyz");同上,只是不再创建"xyz"这个对象,因为他已经存在于字符串池中了。这里创建了一个指向b的对象
String c = new String(a);这里告诉你,凡是new的对象一定是新开辟的一块内存,也就是一个新的对象。在这里这个对象引用了a对象里的值。创建了一个指向c的对象。这里创建了一个对象
String d = b,在这里并没有new对象,只是声明了一个引用d,并且把引用b的对象同样指向d。这里b==d都是指向同一个对象,这里没有创建对象。
所以一共创建了四个对象
String b = new String("xyz"); //2
String c = new String(a); //3
String d = b; //4声明了4个对象引用(开辟了四个栈内存):String a,String b,String c,String a;
实例化了三个对象(开辟了三个堆内存);new String(xyz);new String(xyz);new String(a);
1,2,3请结合上面看,4直接将引用指向2中堆内存。
第一个new是时候是两个
然后以后每次new的时候一个
String b = new String("xyz"); //创建2个对象 b , xyz
String d = b; //创建一个对象d ------------------------------
String c = new String(a);
楼主就是纠结在这里了.. 由
String a = new String("xyz");
String c = new String(a);
System.out.println(a == c); //输出false.可以得出, a 与 c 是不同的对象.实际上String c = new String(a); 最终 相当于 String c = new String("xyz");
所以最后结果是7个..有不同意见可以丢砖.
如:
String a = new String("xyz");
到底是a ,xyz, 还是xyz(heap), xyz(Strings pool) 我也需要人解惑..
不过我看了两遍thinging in java,也没纠结这种问题嘛。
书没问题,读书的人有问题,分不清啥是精华,啥是鸡肋。
String b = new String("xyz");
String c = new String(a);
String d = b;String a 1
new String("xyz") 1
String b 1
new String("xyz") 0 这个引用 上面的一个
String c 1
new String(a) 1
String d 1
-------------------------
6一共是6个对象