1、“==”
“==” 用于匹配内存单元上的内容,其实就是一个数字。在 Java 语言中,“==” 其实就是对比连个内存单元的内容是否一样。如果是8大原始类型(byte、short、int、long、float、double、char、boolean),就是直接比较他们的值。
如果是引用,比较的就是引用的值,即是对象的地址。两个引用用 “==” 判断,比较的是两个对象的地址值是否一致。关于对象的引用,举一个例子如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 String a = "a" + "b" + "c"; 2 String b = "abc"; 3 String c = new String("abc"); 4 System.out.println(a == b); // true 5 System.out.println(a == c); // false 6 System.out.println(b == c); // false
2、equals()
equals() 方法是在Object 类中被定义的,它的源码中是使用 “==” 方法来判断的。如下所示:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public boolean equals(Object obj) { 2 return (this == obj); 3 }
从中可看出,如果不去重写 equals() 方法,并且对应的类的父类中都没有重写equals()方法,那么默认的操作就是对比对象的地址。equals()方法之所以存在,是希望子类去重写这个方法,实现对比值的功能。
那么再来看看String 类中的equals() 方法:(先对比地址,再对比长度)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** The value is used for character storage. */ 2 private final char value[]; // String类中用于存储的char 数组 3 4 public boolean equals(Object anObject) { 5 if (this == anObject) { // 先对比对象的地址 6 return true; 7 } 8 if (anObject instanceof String) { 9 String anotherString = (String)anObject; 10 int n = value.length; 11 if (n == anotherString.value.length) { //char数组长度一样再进行判断 12 char v1[] = value; 13 char v2[] = anotherString.value; 14 int i = 0; 15 while (n-- != 0) { 16 if (v1[i] != v2[i]) 17 return false; 18 i++; 19 } 20 return true; 21 } 22 } 23 23 return false; 24 24 }
之所以要自己去实现equals() 方法,是因为两个对象需要根据具体业务的关键属性值来进行对比,以此来确定它们是否是“一致的货相似的”。两个对象的值是否相同时根据自己的业务决定的,而不是Java语言来决定的。