关于equals()和 ==
在网上搜索equals和 == 的区别时
equals比较的是两个字符串内容是否相等;==比较的是两个字符串的内存地址是否相同
于是做了测试
1.用String s = xxxx; 创建对象
public static void main(String[] args) {
// Student student01 = new Student("111", 20);
// Student student02 = new Student("121", 21);
// Student s1=student01;
String s1="qihong";
String s2="qihong";
String s3= s1;
System.out.println(s1==s2); // true
System.out.println(s1.equals(s2)); //true
System.out.println(s1==s3); //true
System.out.println(s1.equals(s3)); //true
}
看到这里很疑惑 == 不是比较对象地址的吗,为何s1==s2 为true?
其实是因为String s1 = “qihong” 这条语句是在 堆内存中的常量池里面创建了一个内容为"qihong"的字符串,s1指向这个空间的地址, 当执行 String s2=“qihong”; 时 s2 也指向这个地址,如图
因为s1 s2 指向同一个地址,所以不管是equals 还是 == 都是true
2.用String s1 = new String(“xxxx”);创建对象
public static void main(String[] args) {
// Student student01 = new Student("111", 20);
// Student student02 = new Student("121", 21);
// Student s1=student01;
String s1 = new String("qihong");
String s2 = new String("qihong");
String s3 =s1;
System.out.println(s1==s2); // false
System.out.println(s1.equals(s2)); //true
System.out.println(s1==s3); //true
System.out.println(s1.equals(s3)); //true
}
这个结果就符合预期了,流程图如下
String s1 = new String("qihong");
String s2 = new String("qihong");
创建了两个不同的对象,s1 s2 分别指向这两个对象的地址,String s3 =s1; 把s1 指向的对象的地址给了s3 ,所以s1==s3