String str1 = "a" + "b" + "c"; 1个String str2 = new String("a" + "b"+ "c"); 6个
每一次“ ”都会创建一个String对象,每一次 + 又会因连接产生一个新的String对象。
你这样说的话,String s = "a" + "b" +"c";//这是三个对象. String abc = "abc";//这是一个对象? System.out.print(s==abc);//true 那么这个是怎么来的? String a = "a";//一个对象 String b = "b";//一个对象 String c = "c";//一个对象 String x = a + b + c;//这里三个对象. System.out.print(x==abc);//false
str2 创建了1个吧
和
String str2 = "abc";两者是相同的对象 都是字符串池中的"abc"对象。
而每new一个string,都会在栈创建一个引用,这个引用指向常量池中的对象,如果常量池中有这个对象,就不创建,没有则创建。
如:String str1 = new String("a");String str2 = new String("a");
在栈中创建2个引用,在常量池中创建一个对象
第一:常量池中有一个String类型字面值的常量表CONSTANT_String(标志值8),"a"、"b"、c"就存在里面。但我不认为常量表中存放的是String对象,或者是String对象的引用。应该存储的就是String的字面值。第二:每new一个string,一定会指向常量池中的东西吗,如果真像你所说的:
String str1=new String("aaa"); //str1指向常量池中的"aaa"
String str2=new String("aaa"); //str2也指向常量池中的"aaa"
试问一下: str1==str2应该就是true了哦??我刚写了篇博客:《String in Java》,欢迎大伙来扔砖头....
String str2 = new String("a"+"b"+"c"); 2个对象
如果认为STRING POOL中的常量是对象的话
String str1 = "a"+"b"+"c";
创建一个对象"abc"
在编译期于string pool中创建,执行期不创建,只是返回其引用
String str2 = new String("a"+"b"+"c");
创建两个对象,内容都是"abc"
在编译期由于new无法确定,所以不创建任何对象,执行期搜索string pool
如果这2个语句是分开执行,则string pool中没有"abc",所以在string pool中创建"abc"常量,并且在堆区创建"abc"对象(该对象可以说是string pool中"abc"的副本),返回堆中对象的引用。
如果这2个语句是顺序执行,则string pool中有"abc",于是直接在堆中创建"abc"对象,返回堆中对象的引用。
这个创建了:
1、"a"
2、"b"
3、"c"
4、"ab"
5、"abc"
总计5个
String str2 = new String("a"+"b"+"c");
这个比上面还多一个new创建的对象其实计算对象时把握几点:
1、每个字符串都是常量,所以"a"、"b"、"c"都是一个个的对象
2、每次操作都会产生新的字符串对象,例如"ab"和"abc"
3、遇到new则申请内存,创建新的对象
String abc = "abc";//这是一个对象?
System.out.print(s==abc);//true
那么这个是怎么来的?
String a = "a";//一个对象
String b = "b";//一个对象
String c = "c";//一个对象
String x = a + b + c;//这里三个对象.
System.out.print(x==abc);//false
0 ldc <String "abc"> [16]
2 astore_1 [s]
我认为编译阶段就已经将常量a,b,c合并起来生成了一个新的常量abc。然后在将abc所在内存的位置存放在字符串引用s中。
String str2 = new String("a" + "b"+ "c"); 2个
而String str2 = new String("a"+"b"+"c")会得到两个对象,一个时stack池中的“abc”,一个是
new 出来的,会存放到heap池中