Java 中 List 与 HashSet 的对比



首先看微软的介绍:
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面试题目: 1-10题: 1、java==和equals和hashCode的区别 2、int与integer的区别 3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,finalize的区别 7、Serializable 和Parcelable 的区别 8、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因? 9、成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目的应用 10、string 转换成 integer的方式及原理 11-20题: 11、哪些情况下的对象会被垃圾回收机制处理掉? 12、静态代理和动态代理的区别,什么场景使用? 14、Java实现多态的机制是什么? 16、说说你对Java反射的理解 17、说说你对Java注解的理解 18、JavaString的了解 19、String为什么要设计成不可变的? 20、Object类的equal和hashCode方法重写,为什么? 21-40题 21、List,Set,Map的区别 26、ArrayMap和HashMap的对比 29、HashMap和HashTable的区别 30、HashMap与HashSet区别 31-40题 31、HashSet与HashMap怎么判断集合元素重复? 33、ArrayList和LinkedList区别,以及应用场景 34、数组和链表的区别 35、开启线程的三种方式? 36、线程和进程的区别? 38、run()和start()方法区别 39、如何控制某个方法允许并发访问线程的个数? 40、在Javawait和seelp方法的不同 41-50题 41、谈谈wait/notify关键字的理解 42、什么导致线程阻塞?线程如何关闭? 43、如何保证线程安全? 44、如何实现线程同步? 45、线程间操作List 46、谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解 49、synchronized 和volatile 关键字的区别 51-58题 51、ReentrantLock 、synchronized和volatile比较 53、死锁的四个必要条件? 56、什么是线程池,如何使用? 56、什么是线程池,如何使用? 58、有三个线程T1,T2,T3,怎么确保它们按顺序执行?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值