==
我在实验中碰到了这样的一个问题,在进行两个类的比较的时候,我错用成了==,这导致我的程序一直出现bug,其原因就是这个if语句一直不能够通过。
关于==首先要明确java中的基本的数据类型 他和C语言的个人感觉没有区别
byte,short,char,int,long,float,double,boolean 对于比较他们,我们用 ==比较的是他们的值。而
对于类,数组 我们用==去比较他们的内存地址,显然 比较内存地址没有什么意义。
equals
Object类中定义的equals(Object)方法的情况下,
equals(Object)与“==”运算符一样,比较的是引用。而且equals可以被覆盖,让他们去进行数据内容的比较。若比较的是两个独立的对象,则总返回false。如果编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么必须覆盖equals()方法,由开发人员自己编写代码来决定在什么情况下即可认为两个对象的内容是相同的。
对于重写要注意一下几点:(在网上注意到的):
1 自反性:对任意引用值X,x.equals(x)的返回值一定为true.
2 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false
Hashcode
hashCode()方法返回的就是一个数值,从方法的名称上就可以看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此很容易推断出,我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能。事实上,Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)
再覆盖equals的时候我们要覆盖hashcode