Java 中 List 与 HashSet 的对比

本文对比了HashSet与List两种数据结构在添加、删除和查找操作上的性能差异。HashSet利用哈希值实现高效查找,适用于不关注顺序且需避免重复元素的情况;而List则提供了有序的数据存储,但在查找操作上效率较低。


首先看微软的介绍:
HashSet<T>:HashSet<(Of <(T>)>) 类基于数学 set 的模型,可提供类似于访问 Dictionary<(Of <(TKey, TValue>)>) 或 Hashtable 集合的键的高性能 set 运算.
List:表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。

方法:
Add(T t):
HashSet集合中的对象是唯一的。在添加对象的时候使用对象的哈希值来判断在集合中是否已存在。存在则报错。
List<T>集合对添加的对象无要求。

Remove(object o):
HashSet 首先查找对象o 的哈希值在HashSet中的位置是否有相同的对象,找不到则返回false.找到后在调用两个对象的Equals做对比,相同则移除该位置的对象。HashSet不用遍历集合则能快速找出对象。
List<T> 从第一个元素开始遍历集合元素,调用每一个元素的Equals与o做对比,直到找到相同的对象。

Conatains(object o):
HashSet 与remove一样,通过o的哈希值来快速查找在o在集合中的位置,然后再通过Equals来判断相等。
List 使用遍历的方法查找相同的元素。

心得:
  当使用到直接以哈希值做判断的方法时(如:remove(objcet o),contains(objcet o)),HashSet的查找效率是比LIST表要高的。但是使用到扩展方法时,由于是通过遍历而不是哈希值对对象作比较,HashSet的效率不如List表。
  根据哈希表的存储方式,每一个元素添加到集合中时,都会把该元素插入到对应的哈希值位置,所以有可能会引起集合元素的重新排列。故HashSet与HashTable都是无序集合。
  在上面的几个方法中,List表查找元素的方式都是直接遍历(可通过重写类的Equals方法来查看),可见微软并没有做查找上的算法优化,如果需要提高查找效率,可能还得自己写算法。其他扩展方法是否有对集合的查找做优化,有待进一步实验。


原址:http://blog.sina.com.cn/s/blog_6fb3ca810100uqiz.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值