HashSet、TreeSet的区别与联系

本文对比分析了HashSet和TreeSet两种集合类的实现原理、存储方式、序列化机制、克隆机制、保证元素相同的方式及元素顺序。深入探讨了它们在Java编程中的应用差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.继承实现关系

都继承了

AbstractSet

都实现了

Cloneable, java.io.Serializable

二.存储方式

HashSet:

 TreeSet:

三.序列化机制 

两者内部都有readObject和writeObject方法

源码中两者都有一个不同的backing:

自己写序列化的原因也是因为避免序列化了缓存中没有实际存储元素的空间 

四.克隆机制

HashSet:将Set强转为Map,调用的是Object中的clone,属于浅拷贝,如果要实现深拷贝,可以序列化或者遍历HashSet中的每个值然后一个个的clone并且重写目标类的clone方法。

TreeSet:也是浅拷贝差不多。

五.保证元素相同的方式 

HashSet:通过对象的hashCode和equals方法来完成对象唯一性的判断。

如果对象的hashCode值不同,则不用判断equals方法,就直接存到HashSet中。

如果对象的hashCode值相同,需要用equals方法进行比较,如果结果为true,则视为相同元素,不存,如果结果为false,视为不同元素,进行存储,因为哈希码已被占用,所以采用链接的方式链接。

TreeSet:根据比较方法的返回结果是否为0,如果是0,则是相同元素,不存,如果不是0,则是不同元素,存储。

六.元素顺序 

HashSet不能保证元素存储顺序,也不能在内部进行排序

TreeSet:

1.自然排序:

1.让元素自身具备比较性,

2.实现Compareable接口,覆盖其CompareTo方法

 2.自然排序:

1.当元素自身不具备比较性时,或者具备的比较性不是所需要的。

2.这时就要让集合自身具备比较性,在初始化时,就有了比较方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值