问题描述
- string创建对象问题字符串常量池问题
-
String a=new String("aaaa")如果之前常量池没有aaaa字符串,那么这句代码具体创建的是几个对象?,
解决方案
string是比较特殊的。
new String就好比开了一个空间里面装着aaa而且有了自己的地址符。也就是说是一个对象了。
而String a也是一个对象,你要记得每个类型都有默认值的,但是后面的等于号是将new String的地址符给了a,这时a也指向那个空间,于是它的值也是aaa.
其实在工作编程中是不用这么计较的,用一个定义一个就好。
String是类型,也就是说它有默认值,你记得这一点就行了。只不过它也可以像实例化对象一样赋值。
希望回答对你有帮助
解决方案二:
String 要看是怎么赋值的
1.String str = new String("aaaaa");这样通过new 关键字实例化的 内存中会重新分配一个空间 如果还有一个String str2 = new String("aaaaa"); 仍旧是重新分配空间。
两个虽然都是“aaaaa”但是指向不同的地址。这和普通了没什么区别
2.String str3 = "aaaaa";这样赋值的话,你可以这样理解:把“aaaaa”这个常量赋值给str3,就是指向常量的地址。所以str4=“aaaaa”;则str3和str4都指向该常量的地址。
解决方案三:
一个对象,变量a是对象的引用
解决方案四:
创建了两个对象,一个对象存在于堆内存中,还有一个对象存在于常量池中,堆中对象的值就是指向常量池中的地址的。
解决方案五:
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。
解决方案六:
如果常量池没有"aaaa"字符串,那么通过new关键字来创建一个String时,创建的会是两个对象。
在执行String a=new String("aaaa")时,首先会在String池中创建一个可共享的字符串对象;然后通过new关键字,在内存中会创建一个包含了"aaaa"的String对象
解决方案七:
两个
String a=new String("aaaa");
第一步会在堆中创建一个String对象,这是使用new关键字的必然结果。
第二步会在字符串池中也创建一个String对象。