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

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

1.等号——"==":
等号是最简单也最容易理解的,若是等号的两边是基本数据类型,好比int,double,那么等号就用来单纯的比较他们的数值大小
若是等号两边放的是两个对象,那么就会比较他们在内存当中的地址。
例如:对象

String a="abc";
String b="abc";
System.out.println(a==b);
1
2
3
答案是:true
由于相同的字符串内容,在地址上是同样。在Java中,String是有一个String pool的,里面存放了能够共享的字符串对象,在声明一个String对象后,会首先去找是否存在相同的String内容,若是有的话是不会建立新的对象的。在这里b其实是引用了a的对象的值,他本身并无建立对象,因此这里的答案是true。接口

可是若是咱们接着
String c=new String(“abc”);

System.out.println(a==c);
那答案就是false,由于这两者的地址并非一致的。内存

2.compareTo()
在Java里观察compareTo()的源码字符串

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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
能够观察出,这里其实是获取的字符串(也能够是其余对象)的长度,而后做减法,这里的减法就是ASCII码的减法,因此compareTo()会返回数字,若是两个字符串内容相同,会返回0,字符串a大于字符串b,会返回相差的ASCII码的正数,字符串a小于字符串b,会返回相差的ASCII码的负数。原理

因此 System.out.println(a.compareTo(b))的答案是:0数据类型

3.equals()
依旧是来观察Java中equals()的源码引用

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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
能够观察出,equals是先用等号(==)直接来比较两个对象在内存当中的地址,若是相等会直接返回true,若是这两个对象的地址不同,就会考虑这两个对象是否是String类型的,若是是String类型的,那先比较两个字符串长度是否同样,若是长度不一致,那100%不相等,直接返回false。长度一致则逐个比较方法

4.compareTo()和equals的区别compareTo()会返回两者的差值,即返回的是一个数字;而equals就简单一些,只返回true或者false。最后,compareTo()和equals()均可以判断其余基本数据类型,好比说Integer,Java的源码中对这二者方法都作了一些重载,能够根据参数的类型去自动匹配相应的方法,他们的原理也很是简单,只是一些简单的减法或者(?:)这类判断。---------------------

相关文章
相关标签/搜索