Java实现二树杈_HashSet的hashCode方法和equals方法的重写,TreeSet中compareTo方法的重写,Comparator在treeSet中的应用。...

HashSet的hashCode方法和equals方法的重写,TreeSet中compareTo方法的重写,Comparator在treeSet中的应用。

HashSet:

首先,hashset底层是hash值的地址,它里面存的对象是无序的。

当需要在HashSet中存入自定义对象时,就需要重写hashset和equals方法。

至于现象出现的原因,先分析hashset存入非自定义对象的机制:

第一个对象进入集合时,hashset会调用object类的hashcode根据对象在堆内存里的地址调用对象重写的hashcode计算出一个hash值,然后第一个对象就进入hashset集合中的任意一个位置。

第二个对象开始进入集合,hashset先根据第二个对象在堆内存的地址调用对象的计算出一个hash值,如果第二个对象和第一个对象在堆内存里的地址是不同的,那么得到的hash值也是相同的,直接返回true,hash得到true后就不把第二个元素加入集合(这段是hash源码程序中的操作)。如果第二个对象和第一个对象在堆内存里地址是不同的,这时hashset类会先调用自己的方法遍历集合中的元素,当遍历到某个元素时,调用对象的equals方法,如果相等,返回true,则说明这两个对象的内容是相同的,hashset得到true后不会把第二个对象加入集合。

然后,分析为什么自定义对象加入hashset时需要重写hashcode和equals方法:

自定义类需要先重写object的hashcode用以获取一个hash值,当两个对象的内存地址相同时,直接返回true,hashset不执行加入操作。当两个对象的内存地址不相同时,hashset会把新加入的对象与已经存在的对象逐一对比,对比时,需要调用对象的equals方法,因为自定义对象里没有复写equals方法,所以需要复写。当equals返回的是true时,表明两个对象的内容相同,不对对象执行加入操作。这个判断需要在自定义对象的equals方法里来完成。

TreeSet:

首先,TreeSet的底层是通过二叉树来完成存储的,无序的集合。

当往treeset集合中加入自定义对象时,需要重写compareTo方法。

先分析treeset集合对象的加入过程:

当我们将一个对象加入treeset中,treeset会将第一个对象作为根对象,然后调用对象的compareTo方法拿第二个对象和第一个比较,当返回至=0时,说明2个对象内容相等,treeset就不把第二个对象加入集合。返回>1时,说明第二个对象大于第一个对象,将第二个对象放在右边,返回-1时,则将第二个对象放在左边,依次类推,就是treeset的底层运行方式。

因为自定义对象没有复写compareTo方法,所以需要对象所在的类里复写compareTo方法,方法的定义参照上面描述的即可。

Treeset比较的是元素的自然顺序,有一种情况,当元素本身不具备比较性,或者说具备的比较性是我们不需要的,我们就需要一个一个比较器来定义元素比较的方式。

比较器的定义只要符合treeset执行的即可实现,即:返回的是大于0的数,就放在树杈的右边,等于0就不操作,小于0就放在树杈的左边。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值