Java 中的 “==”、“compareTo ()” 和 “equals ()” 的区别

在比较两个对象或者数据大小的时候,经常会用到 ==、compareTo () 和 equals (), 尤其是在接入了 Comparable 接口后重写 compareTo 方法等场景,所以我们来理一下这三个的区别。

等号 “==”:

  等号是最简单也最容易理解的,如果等号的两边是基本数据类型,比如 int,double,那么等号就用来单纯的比较他们的数值大小

  如果等号两边放的是两个对象,那么就会比较他们在内存当中的地址。

  例如:

  String a=”abc”;

  String b=”abc”;

  System.out.println(a==b);

  答案是:true

  因为相同的字符串内容,在地址上是一样。在 Java 中,String 是有一个 String pool 的,里面存放了可以共享的字符串对象,在声明一个 String 对象后,会首先去找是否存在相同的 String 内容,如果有的话是不会创建新的对象的。在这里 b 实际上是引用了 a 的对象的值,他自己并没有创建对象,所以这里的答案是 true。

  但是如果我们接着

  String c=new String(“abc”);

  再

  System.out.println(a==c);

  那答案就是 false,因为这二者的地址并不是一致的。

compareTo()

  在 Java 里观察 compareTo () 的源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public int compareTo(String anotherString) {

  int len1 = value.length;

  int len2 = anotherString.value.length;

  int lim = Math.min(len1, len2);

  char v1[] = value;

  char v2[] = anotherString.value;

  int k = 0;

  while (k < lim) {

  char c1 = v1[k];

  char c2 = v2[k];

  if (c1 != c2) {
  return c1 - c2;
  }
  k++;
  }
  return len1 - len2;
  }

  

  可以观察出,这里实际上是获取的字符串 (也可以是其他对象) 的长度,然后作减法,这里的减法就是 ASCII 码的减法,所以 compareTo () 会返回数字,如果两个字符串内容相同,会返回 0,字符串 a 大于字符串 b,会返回相差的 ASCII 码的正数,字符串 a 小于字符串 b,会返回相差的 ASCII 码的负数。

  所以 System.out.println (a.compareTo (b)) 的答案是:0

equals()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public boolean equals(Object anObject) {

  if (this == anObject) {

  return true;

  }

  if (anObject instanceof String) {

  String anotherString = (String)anObject;

  int n = value.length;

  if (n == anotherString.value.length) {

  char v1[] = value;

  char v2[] = anotherString.value;

  int i = 0;

  while (n-- != 0) {

  if (v1[i] != v2[i])

  return false;

  i++;

  }

  return true;

  }

  }

  return false;

  }

  依旧是来观察 Java 中 equals () 的源码

  可以观察出,equals 是先用等号 (==) 直接来比较两个对象在内存当中的地址,如果相等会直接返回 true,如果这两个对象的地址不一样,就会考虑这两个对象是不是 String 类型的,如果是 String 类型的,那先比较两个字符串长度是否一样,如果长度不一致,那 100% 不相等,直接返回 false。长度一致则逐个比较

compareTo () 和 equals 的区别

  compareTo () 会返回二者的差值,即返回的是一个数字;而 equals 就简单一些,只返回 true 或者 false。

  最后,compareTo () 和 equals () 都可以判断其他基本数据类型,比如说 Integer,Java 的源码中对这两者方法都做了一些重载,可以根据参数的类型去自动匹配相应的方法,他们的原理也非常简单,只是一些简单的减法或者 (?:) 这类判断。

-------------本文结束感谢您的阅读-------------