关于compareTo,==,equals的问题

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时要注意空指针。

你可能感兴趣的:(jk)