先看两段程序:
C++:
string str1="hello";
string str2="world";
string str3="helloworld";
string str4=str1+str2;
cout<<"str3: "<<str3<<endl;
cout<<"str4: "<<str4<<endl;
if(str3==str4)
{
cout<<"相等"<<endl;
}
else
cout<<"不相等"<<endl;
结果是:相等。
再看Java:
String str1="hello";
String str2="world";
String str3="helloworld";
String str4=str1+str2;
System.out.println(str3==str4);
结果是:false。
两段程序都是使用+来连接字符串但是结果不一样。
先看Java解释:
注意:
1、在Java中如果==用于两个对象类型的变量,它是用于比较两个变量是否引用自同一个对象。使用+串联字符串会产生一个新的字符串对象。
2、在Java执行时会维护一个String池,每当定义一个字符串对象时,会先在String池中查找是否存在相同的String内容(字符相同),如果有则直接返回,而不是直接创建一个新的String对象,以减少内存的耗用。例如下面:
String str4="helloworld";
String str5="helloworld":
实际上str4和str5指向的是同一个字符串对象。所以如果要引用其中一个并且改变字符值,那么另一个就要跟着改变了。
3、在调用intern()方法的时候,如果池中有相同的String对象(相同与否由equals()决定),那么从池中返回该字符串,否则原String对象会被加入到池中并返回String对象的引用。例如:
string str1="hello";
string str2="world";
string str3="helloworld";
string str4=(str1+str2).intern();
System.out.println(str3==str4);
结果:true。
再看C++解释:
使用+连接字符串会创建一个新的字符串对象,使用==表示按照字典顺序比较字符串常量值,而不是比较是否引用同一对象。