public class Test1 {
private String s1;
private String s2;
public test1() {
super();
}
public test1(String s1, String s2) {
super();
this.s1 = s1;
this.s2 = s2;
}
public String getS1() {
return s1;
}
public void setS1(String s1) {
this.s1 = s1;
}
public String getS2() {
return s2;
}
public void setS2(String s2) {
this.s2 = s2;
}
//为什么返回 s 时两个对象返回的地址值不一样,返回 s1 地址值一样了呢
//为什么返回 s1 + s2 答案是false,只返回 s1 答案是true
public String toString(){
/* String s = s1 + " " + s2;
return s;*/
/* return s1 + " " + s2;*/
return s1;
}
public boolean equals(Test1 t){
String s11 = this.toString();
String t1 = t.toString();
//System.out.println(s11);
//System.out.println(t1);
if(s11 == t1){
return true;
}
return false;
}
public class Test{
public static void main(String[] args) {
Test1 t1 = new Test1("11","22");
Test1 t2 = new Test1("11", "22");
System.out.println(t1.equals(t2));
System.out.println("------------");
String s1 = new String(new test().toString());
String s2 = new Test().toString();
System.out.println(s1 == s2);
}
public String toString(){
return "a" + " " + "b";
}
}
A:字符串进行拼接的时候,如果直接以赋值的形式(字符串对象本身)进行拼接,就不会在堆内存中开辟空间,可以直接比较地址值。
B:如果以创建对象的形式(成员变量或者局部变量)进行拼接,就会在堆内存开辟空间,此时==进行比较的是堆内存的地址值。C:如果不进行字符串拼接,始终传递的都是常量池地址值,可以用==比较。
T.T你原来有两个地址分别存的是S1和S2,那你觉得S1和S2拼接起来该存在于哪个地址?
在常量池创建一个新地址啊,但是另外对象返回字符的时候也需要在常量池中去寻找是否有这个字符串啊,如果有,也是返回的同一个地址啊