"==" 与 "euqals()"的区别

1、“==”

  “==” 用于匹配内存单元上的内容,其实就是一个数字。在 Java 语言中,“==” 其实就是对比连个内存单元的内容是否一样。如果是8大原始类型(byte、short、int、long、float、double、char、boolean),就是直接比较他们的值。

  如果是引用,比较的就是引用的值,即是对象的地址。两个引用用 “==” 判断,比较的是两个对象的地址值是否一致。关于对象的引用,举一个例子如下:

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 类中被定义的,它的源码中是使用 “==” 方法来判断的。如下所示:

1     public boolean equals(Object obj) {
2         return (this == obj);
3     }
Object 类中的equals源码

  从中可看出,如果不去重写 equals() 方法,并且对应的类的父类中都没有重写equals()方法,那么默认的操作就是对比对象的地址。equals()方法之所以存在,是希望子类去重写这个方法,实现对比值的功能。

  那么再来看看String 类中的equals() 方法:(先对比地址,再对比长度)

 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     }
String类中的equals() 方法

  之所以要自己去实现equals() 方法,是因为两个对象需要根据具体业务的关键属性值来进行对比,以此来确定它们是否是“一致的货相似的”。两个对象的值是否相同时根据自己的业务决定的,而不是Java语言来决定的

 

posted @ 2018-11-26 16:48  Eric_F  阅读(448)  评论(0编辑  收藏  举报