文章目录
正文1(equal与==)
1.==解读
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型,有byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。
2.引用类型(类、接口、数组)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见’=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。
2.==与equals的不同之处
1.功能不同
"=="是判断两个变量或实例是不是指向同一个内存空间。
"equals"是判断两个变量或实例所指向的内存空间的值是不是相同。
最令大家疑惑的可能是这个,这个例子将完美诠释上边的说法:
原因是因为:
String s1="hello"; //是在字符串常量池中开辟了内存空间
String s2=new String("hello");//在堆中开辟了内存空间
他两自然指向的内存空间不是一个
2.定义不同
-
equals():是Java超类Object中的方法。
-
"=="在Java中只是一个运算符合。
3.运行速度不同
- equals():没有==运行速度快。
- 运行速度比equals()快,因为只是比较引用。
正文2(equals与hashcode)
1.hashCode解读
- hashCode是用来鉴定两个对象是否相等,Object类中的hashCode方法返回对象在内存中地址转换成的一个int值,所以如果没有重写hashCode方法时,任何对象的hashCode方法都是不相等的。
- 设计hashCode()的一个因素是:对同一个对象调用hashCode都应该产生同一个值。hash码的主要用途是在对对象进行散列的时候作为key输入,我们需要每个对象的hash码尽可能不同这样才能保证散列的存取性能。
- 所有的散列函数都有这样的一个特性:
1.如果a==b,则hash(a)==hash(b)
2.如果a!=b,则hash(a)可能得到与hash(b)相同的散列值 - hashCode的作用:
2.equals解读
equals()方法特点:
-
自反性:x.equals(x)返回true;
-
对称性:若x.equals(y)为true,则y.equals(x)亦为true;
-
传递性:若x.equals(y)为true且y.equals(z)也为true,则x.equals(z)亦为true;
-
一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n次调用也均为true,前提条件是没有修改x也没有修改y;
-
对于非空引用x,x.equals(null)永远返回为false。
3.hashCode与equals不同之处
- 如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
- 如果两个对象不equals,他们的hashcode有可能相等。
- 如果两个对象hashcode相等,他们不一定equals。
- 如果两个对象hashcode不相等,他们一定不equals。
- 若重写equals(Object obj)方法,必须重写其hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable。