1.先来做一道面试题
1.1声明一个实体类
package com.lhj.demo.entity;
public class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1.2写一个测试类
package com.lhj.demo.base;
import com.lhj.demo.entity.Cat;
import org.junit.Test;
public class StringDemoTest {
@Test
public void test1() {
Cat cat = new Cat("Kity");
Cat cat1 = new Cat("Kity");
System.out.println("测试一");
System.out.println(cat.equals(cat1));
}
@Test
public void Test2() {
String name = "abc";
String name2 = "abc";
String name3 = new String("abc");
System.out.println("测试二");
System.out.println(name.equals(name2));
System.out.println("---------------------------------------");
System.out.println(name.equals(name3));
}
}
1.3 我们来公布一下答案
测试一运行结果
测试二运行结果
下面来分析一下
首先我们大家都知道 ==和equals的区别:
我在这里在回忆一下:
2.1.1
==的比较分基本数据类型和应用数据类型的区分,
基本数据类型比较的是值是否相等
引用数据类型比较的是引用是否相等
equals
equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。
我们来看一下test1的equals方法的源码
源码如下:
由此可见,两个对象用equsls方法比较的话equals()方法和== 在本质上面的相同的,都是比较值的引用是否相同。
下面再来看一下Test2
两个相同值的 String 对象,为什么返回的是 true?
我们继续看一下源码:
重点看一下红线圈住的地方,如果比较的对象是String类型,那么进入,我们可以看到第二个红线圈住的地方的意思是:将要被比较的String字符串转换成char数组,然后挨个比较数组的每一个元素,又因为char数组的元素是char,是基本数据类型,所以,两者比较的是数值。所以也就有了我们常说的 String,Integer实现了java.lang.Object的equals方法,从而比较的是值。
就这样。