java中判相等

判相等的三种方法

##行为等价性(==)
1.解释:两者可相互替换,实质是两者指向同一个对象才是相等
2.适用范围:
(1)基本数据类型:int,double,long… ,值相同就是同一个。
(2)mutable object:因为可改变,所以如果只是看起来一样则会在使用mutator后变得不一样,例如:StringBuilder类
3.实质:调用的是Object类中的equals方法
##观察等价性(重写equals)
1.解释:从用户角度看,对两个对象调用任何相同的操作,都是一样的结果。
注意:没有操作方法的类不能使用观察等价性
2.使用范围:
(1)immutable object:属性值不可变,如果值相等则可判断相等,如果改变值需要新建对象 例如:String, Integer等基本数据类型的封装类
(2)个别mutable object: Date,Set,List…
(3)(not null)object.equals(null) -->false
3.实质:重写equals和hashcode方法,使得当两个对象equal时hashcode值也相同。
4.判断重写的equals方法是否合理:方法是否满足自反,对称,传递的等价关系,一般出错在传递。
##AF判相等
(1)解释:representation value 通过AF映射到abstraction value是一样的,则是相等。
(2)实质:a和b是否一样其实是判断f(a)和 f(b)是否相等

重要数据结构讲解

##Integer (immutable)
1.观察一致性

Integer x = new Integer(3);
Integer y = new Integer(3);
x.equals(y);//true
(int)x==(int)y;//true,拆包
x==y;//false

x,y为两个对象,地址不一样,==判是不相等,equals是调用的是Integer的重写是equals方法,只要两个对象的值是相等的(都是3)则可判相等。

Integer x = 3;
Integer y = 3;
x=y;//true 封包
x.equals(y);

这里用到了Integer的valueof将(int)3封装成Integer,同时在Java中存在内存池,里面有数值为-127~128的Integer对象,所有封装的Integer对象指向同一个一个Interger对象。
##mutable对象包含在set集合中

List<String> list = new List<>();
list.add("a");
Map<List<String>> map = new Map<>();
list.add("b");

List是mutable的,当它储存的内容改变后,其hashcode会改变,hashcode就储存到了别的hashbucket,set再按照原来的地址去匹配hashcode就找不到相应的hashcode。
##判相等在java中的应用
1.getClass():判断的是实际指向的对象的类型 A.getClass()==B.getClass();
2.clone:
(1)对于基本数据类型的clone:clone的是值(深层克隆)

int x = 1;
x.clone()==y;
x.clone().equals(y);

(2)对于对象数据类型的clone:clone的是引用(浅层克隆)

Integer x = new Interger(1);
x.clone()!=x;
x.clone().equals(x);
x.clone().getClass()==x.getClass()

你可能感兴趣的:(java中判相等)