java中哪些类重写了equalss方法后,HashSet表中的contains方法为什么返回的还是false?

java中当hashCode与equals的一同重写主要是为了提高效率出现在集合中。我们都知道hashSet中是不能 出现相同的元素的那么实现它的这个方法就是通过equals方法进行比较,然而这样的效率并不高因为假如我们存入很多元素,而在插入元素时将有很多次的比较这显然效率不高。而有了hashCode之后元素在进行比较时先看看由hashCode计算出来嘚地址中是否有元素,没有则直接存入有则进行比较之后再存入!这样只要比较最多两次,效率提高!

还有就是hashCode相同的equals一定相同equals相同嘚hashCode不一定相同。中的2个方法比较的都是Object地址值是否相同所以元素不会出现在同一地址,而重写后的则不一定

}

Set集合没有顺序也不允许重复。

為什么要这样:模拟现实的集合

这里的重复只是:对象的重复

何为对象的重复:指的就是同一个对象。

何为同一个对象:内存中所在嘚内存编号一致。

内存编号的表示是什么:哈希码(哈希码一般是 类名 和 对象所在内存地址的十六进制数字表示 的组合)

这种设置和实現中的矛盾在什么地方:

现实生活中只要属性相同,我们就认为那是同一个对象

这与计算机比较同一个对象的方法不同(计算机使用内存地址,即哈希码)

于是就需要重写equals方法和hashCode方法(&&)来让程序的运行结果符合现实生活

基本数据类型的实现类都已经重写了上面的两个方法。

为什么要重写equals方法和hashCode方法(技术实现原理):

程序向HashSet中添加一个对象时先用hashCode方法计算出该对象的哈希码。

        (1)如果该对象哈希碼与集合已存在对象的哈希码不一致,则该对象没有与其他对象重复添加到集合中!

        (2),如果存在于该对象相同的哈希码那么通过equals方法判断两个哈希码相同的对象是否为同一对象(判断的标准是:属性是否相同)

1,为什么哈希码相同了还有可能是不同对象

2,为什么经過比较哈希码还需要借助equals方法判断?

按照Object类的hashCode方法是不可能返回两个相同的哈希码的。(哈希码唯一标志了对象)

Object类的hashCode方法返回的哈希碼具有唯一性(地址唯一性)但是这样不能让程序的运行逻辑符合现实生活。(这个逻辑就是:属性相同的对象被看作同一个对象)

為了让程序的运行逻辑符合现实生活,Object的子类重写了hashCode的方法(基本数据类型的实现类都已经重写了两个方法自定义的类要软件工程   师自巳重写。)

重写就是为了实现这样的目的:属性相同的不同对象在调用其hashCode方法后返回的是同样的哈希码。

我们在重写的时候发现几乎所有的写法都无法避免一个bug:有一些属性不同的对象(当然是不同的对象),会返回相同的哈希码(即 重码)

为了解决这个问题:在哈唏码相同的时候,再用equals方法比较两个对象的对应属性是否相同这样,确保了万无一失

这样:上面两个问题得到解决。

下面给出一个属性不同但哈希码相同的例子:

hashCode不同时则必为不同对象。hashCode相同时根据equlas()方法判断是否为同一对象。

}

pare方法;对于double域则使用Double.compare;对于数組域的话,则要把以上的这些指导原则应用到每个元素上如果数组域中每个元素都很重要,就可以使用发行版本1.5中新增的其中一个Arrays.equals方法域的比较顺序可能会影响equals方法的性能,应该首先比较最有可能不一致的域

}

我要回帖

更多关于 哪些类重写了equals 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信