1、何为compareTo,==,equals?
这三个都是用来比较大小的,但是具体的比较形式和结果不一样。
compateTo:主要是根据字典编码来比较位子,比如A和a的大小比较,结果就是一个编码值的差值;
==:如果是基本数据类型(byte,short,int,long,float,double,boolean,char),是比较值。
//"=="的比较
int a = 10;
int b = 10;
System.out.println("a==b"+(a==b));//true
如果是引用类型的变量,比如String,比较的是此时所指向的对象的地址
String a = "a";
String b = "a";
System.out.println("a==b"+(a==b));//true 此时拿的地址是一样的,内容也是
String a = new String("a");
String b = new String("a");
System.out.println("a==b"+(a==b));//false 因为这时新建了对象,两个值属于全新对象
equals:如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
//equals的比较
System.out.println("a.equals(b)"+a.equals(b));//true
2、拓展:关于equals的重写
equals的底层实现逻辑里有一个函数instanceof,用来判断对象是否一致。
equals重写的时候,hashcode方法也要重写。
a. 在java应用程序运行时,无论何时多次调用同一个对象时的hsahCode()方法,这个对象的hashCode()方法的返回值必须是相同的一个int值
b. 如果两个对象equals()返回值为true,则他们的hashCode()也必须返回相同的int值
c. 如果两个对象equals()返回值为false,则他们的hashCode()返回值也必须不同
我们在定义类时,我们经常会希望两个不同对象的某些属性值相同时就认为他们相同,所以我们要重写equals()方法,按照原则,我们重写了equals()方法,也要重写hashCode()方法,要保证上面所述的b,c原则;所以java中的很多类都重写了这两个方法,例如String类,包装类(借鉴其他人的话)
总结:用equals时要注意空指针。