2 sinat 32906793 sinat_32906793 于 2016.03.01 20:57 提问

string创建对象问题字符串常量池问题

String a=new String("aaaa")如果之前常量池没有aaaa字符串,那么这句代码具体创建的是几个对象?,

7个回答

u012216727
u012216727   Ds   Rxr 2016.03.01 21:11
已采纳

string是比较特殊的。
new String就好比开了一个空间里面装着aaa而且有了自己的地址符。也就是说是一个对象了。
而String a也是一个对象,你要记得每个类型都有默认值的,但是后面的等于号是将new String的地址符给了a,这时a也指向那个空间,于是它的值也是aaa.
其实在工作编程中是不用这么计较的,用一个定义一个就好。
String是类型,也就是说它有默认值,你记得这一点就行了。只不过它也可以像实例化对象一样赋值。
希望回答对你有帮助

yeduanxian
yeduanxian   2016.03.01 21:36

String 要看是怎么赋值的
1.String str = new String("aaaaa");这样通过new 关键字实例化的 内存中会重新分配一个空间 如果还有一个String str2 = new String("aaaaa"); 仍旧是重新分配空间。
两个虽然都是“aaaaa”但是指向不同的地址。这和普通了没什么区别
2.String str3 = "aaaaa";这样赋值的话,你可以这样理解:把“aaaaa”这个常量赋值给str3,就是指向常量的地址。所以str4=“aaaaa”;则str3和str4都指向该常量的地址。

jwhtxwdws
jwhtxwdws   2016.03.01 21:05

一个对象,变量a是对象的引用

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.01 21:40

创建了两个对象,一个对象存在于堆内存中,还有一个对象存在于常量池中,堆中对象的值就是指向常量池中的地址的。

xionglangs
xionglangs   Rxr 2016.03.02 11:16

String a=new String("aaaa"),当这个主线程没有走完的时候,创建这个a对象它会先在栈内存中创建一个a对象,之后会去常量池中查看是否有个String类型的aaaa,如果没有,就会创建一个,如果有的话,就会直接使用这个值,但要注意,你这里用了一个new关键字,这时候,它会在把常量池里面的aaaa值重新复制一遍到堆里面去,这时候又在堆里面创建了一个对象。因此应该有2个或3个对象。
String a = "aaaa";
String b = "aaaa";
String c = new String("aaaa");
System.out.println(a==b);
System.out.println(a==c);
打印出来的结果就是a,b都是用的常量池里面的aaaa对象,地址相同。a,c中a用的是常量池里面的aaaa地址,c用的是复制的aaaa放在堆中的地址,因此地址不同,所以答案是true,false。

w89h06q22
w89h06q22   2016.03.01 21:10

如果常量池没有"aaaa"字符串,那么通过new关键字来创建一个String时,创建的会是两个对象。

在执行String a=new String("aaaa")时,首先会在String池中创建一个可共享的字符串对象;然后通过new关键字,在内存中会创建一个包含了"aaaa"的String对象

w89h06q22
w89h06q22 http://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html
接近 2 年之前 回复
w89h06q22
w89h06q22 http://sarin.iteye.com/blog/603684
接近 2 年之前 回复
w89h06q22
w89h06q22 https://www.douban.com/group/topic/34278518/
接近 2 年之前 回复
w89h06q22
w89h06q22 这个问题是一个非常经典的熟悉JAVA虚拟机相关问题,可以参考以下网址:
接近 2 年之前 回复
qq_26482855
qq_26482855   2016.03.02 09:08

两个
String a=new String("aaaa");
第一步会在堆中创建一个String对象,这是使用new关键字的必然结果。
第二步会在字符串池中也创建一个String对象。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!