概述
==是关系操作符,计算操作之间值的关系
equals方法是java.lang.Object类的方法
compareTo方法是java.String类和java.Integer类等多个对象都实现的方法
1.功能不同
"=="是判断两个变量或实例是不是指向同一个内存空间(适用于所有基本数据类型)。
"equals"是判断两个变量或实例所指向的内存空间的值是不是相同(不适用于”基本数据类型“)
“compareTo"是比较两个字符串是否相同
== 和 equals的区别:
对于普通变量,如:int a=10; int b= 10; a==b,返回为 true。
而对于下面情况:
Circle i1 = new Circle(47);
Circle i2 = new Circle(47);
System.out.println(i1 == i2);//false
System.out.println(i1 != i2);//true
因为在Java对象的比较中,它比较的是对象的引用,显然i1和i2不是同一个,即使他们的内容相同
那么问题来了,如何比较对象的内容呢?这就要用到equals方法了,如下图:
LinkedList linkedList = new LinkedList(Collections.singleton(53));
LinkedList linkedList1 = new LinkedList(Collections.singleton(53));
System.out.println(linkedList == linkedList1);//false
System.out.println(linkedList.equals(linkedList1));//true
其中两个LinkedList引用不同,但是内容相同,故此==和equals区别可见一斑
那么又有一个问题来了:来自Object的equals方法能比较所有对象的内容吗?
理论上来说确实是可以的,但有一种特殊(基本不会想到的)情况例外——那就是由我们自己创建的对象的equals方法是默认比较引用,所以除非自己在新类中覆盖equals方法,否则,不可能表现出我们希望的行为。
如下代码所示(自己创建的Circle类):
Circle i1 = new Circle(47);
Circle i2 = new Circle(47);
System.out.println(i1 == i2);//false
System.out.println(i1 != i2);//true
System.out.println(i1.equals(i2));//false
CompareTo与前两者的区别
从其继承的父类就可以推测出,适用范围小于==和equals
通常,仅仅知道两个字符串是否相同是不够的。对于排序应用来说,必须知道一个字符串是大于、等于还是小于另一个。字符串(String)的
compareTo() 方法实现了这种功能。
compareTo比较值是否相同-按字典顺序比较
注意:compareTo排序是根据两个字符串之间的顺序比值来排列的,
(变量1).<方法>(变量2),返回的值是变量1比变量2的字典顺序(int类型)
如下代码所示
String str1 = "abc", str2 = "ab",str3 = "abe";
System.out.println("str1.compareTo(str2):" + str1.compareTo(str2));
System.out.println("str2.compareTo(str1):" + str2.compareTo(str1));
System.out.println("str1.compareTo(str3):" + str1.compareTo(str3));
//结果
//str1.compareTo(str2):1
//str2.compareTo(str1):-1
//str1.compareTo(str3):-2
好,现在问题又来了,开头我们说compareTo方法是java.String类和java.Integer类等多个对象都实现的方法
那么compareTo的功能仅仅局限于此吗?
当然不是:实际排序中,我们更喜欢重写适应我们需求的compareTo方法,来比较一些其他情况
有耐心的小伙伴可以看看下面的代码
//创建Circle类重写comparable接口里的compareTo方法
public class Circle implements Comparable{
double radius;//圆的半径
static double PI = 3.14;
public Circle(double r){radius = r;}
public Circle() {}
double findArea(){return PI * radius * radius;}
double GetRadius(){return radius;}
@Override
public int compareTo(Object o) {
System.out.println("圆的面积"+findArea());
return 0;
}
}
class ComparableCircle extends Circle{
public ComparableCircle(double redius) {
super(redius);//通过super关键字给Circle以构造器形式赋值
}
@Override //重写比较方法
public int compareTo(Object o) {
// 运算符预判
if (o instanceof Circle){
//如果不进行预判出现ClassCastException 类转换异常
// 然后进行面积比较
if(this.findArea() == ((Circle) o).findArea()){
return 0;
}else if(this.findArea() < ((Circle) o).findArea()){
return -1;
}else {
return 1;
}
}
return 2;
}
public static void main(String[] args) {
ComparableCircle c1 = new ComparableCircle(34);
// 可以使用多态和本态,优先使用多态(站高望远)
ComparableCircle c2 = new ComparableCircle(12);
int compRs = c1.compareTo(c2);
System.out.println(compRs);
switch (compRs) {
case 0:
System.out.println("面积相等");
break;
case 1:
System.out.println("左边面积大");
break;
case -1:
System.out.println("右边面积大");
break;
default:
break;
}
}
}
结果:
总结建议:
(1)比较数字 建议使用compareTo,但是也有条件:必须是包装器类型才能使用。
(2)比较字符String类型 建议使用equals,因为比较的是值这样避免了地址的不同。
(3)== 一般建议使用在基本类型比较中。