java关于字符串拼接的问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 10:36:12
“编译时无法确定的字符串拼接需要创建新的对象”,请问这句话是什么意思?
String a = "test";
String b = "3";
String c = a + b;
String d = "test" + "3";
String e = a + 2 + 1;
String f = a + (2 + 1);
String g = a.concat("3");
System.out.println(c == d);
System.out.println(c == f);
System.out.println(c == g);
System.out.println(d == f);
System.out.println(d == g);
System.out.println(f == g);
输出结果均为false,请结合这个例子说一下上面那句话的意思,谢谢!
我的意思是不明白“编译时无法确定的字符串拼接需要创建新的对象”这句话的意思,为什么c==d会是false,即:String c = a + b,那么c为test3,String d = "test" + "3",为什么d不是指向c所指向的对象呢?

String c=a+b;
java中字符串的“+”操作实际上相当于以下的C操作的 c=concat(a,b)。
char * concat(char *a,char *b)
{
int aLen,bLen,cLen,i;
char *c;
aLen=strlen(a);
bLen=strlen(b);
cLen=aLen+bLen;
c=(char*)malloc(sizeof(char)*(cLen+1));
for(i=0;i<aLen;i++)
{
c[i]=a[i];
}
for(i=0;i<bLen;i++)
{
c[i+aLen]=b[i];
}
c[aLen+bLen]='\0';
return c;
}

随手写的C代码,应该不能编译的,看明白意思就成。

这是描述Java编译器对字符串常量的优化方法。
众所周知,数据内容是要定义在数据段的,假设下面的代码:
String s1 = "abc" ;
String s2 = "abc" ;
假如不进行优化的话,结果就是内存中有两个重复的"abc"内容,也就是说有两个“对象”。
Java编译器会针对这种情况进行优化,对于常量字符串"abc",java编译器会只产生一个"abc"对象。这样,s1和s2是指向同一个内存区域的。

但假如字符串的值无法在编译时确定,如:String g = a.concat("3");
那么Java编译器将会为g变量分配一个空间。注意也不是立即分配,因为Java编译器是在全局对动态分配内存。

补充: 编译器不会检查 "test" + "3" 的结果是否就是"