List和Set的区别

List和Set都是Collection集合的子类,List下面的集合类有:ArrayList、LinkedList和Vector。Set下面的集合类有HashSet和TreeSet。


List集合类:

1、ArrayList

ArrayList是通过数组实现的,所以查询快,增删慢。它是一种线程不安全,效率高的集合类。

2、LinkedList

LinkedList是通过链表实现的,所以查询慢,增删快。它是一种线程不安全,效率高的集合类。

3、Vector

Vector是通过数组实现的,所以查询快,增删慢。它是一种线程安全,效率低的集合类。(但是已经不推荐使用了)。

Set集合类

1、HashSet

HashSet通过哈希码来保存元素,所以可以防止元素重复。它是一种无序的,线程不安全,运行效率低,常用的集合类。

2、TreeSet

TreeSet基于树状结构,可以实现排序功能,支持自然排序(即对于基本数据类型可以实现默认升序排列)。但是如果是特殊类型,比如对象、数组、集合,则需要通过比较器对象自定义排序规则。

HashSet的底层原理

HashSet保证元素唯一性的原理

1、某个obj对象。即将要存储到HashSet集合的时候,首要要计算对象的哈希码值

2、在集合中所有元素的哈希码值,都和obj对象的哈希码值不同,就直接存储obj对象在集合中

3、如果集合中存在和obj对象相同的哈希码值,并不能说明obj对象在集合中重复

4、会进而调用equals方法,判断obj对象的属性值是否一致

5、如果不相等直接存储,如果相等,会覆盖原有的内容

保证元素唯一性操作

1、重写hashCode方法,让不同的对象具有相同的哈希码值,不同的对象尽量要有不同的哈希码值 2、重写equals方法,通过属性值来区分不同的对象

HashSet的底层是通过HashMap来实现的,是基于数组+链表+红黑树(jdk1.8才出现红黑树)。把所有存入的数据都转换为HashCode,如果HashCode不同,HashSet会认为是不同的元素,就会存在不同的哈希桶(相当于数组中是一个元素)中。当每一次存值时,判断新的元素的HashCode是否跟HashSet集合中元素有没有HashCode相同的,如果不同则存入新的元素。如果存在HashCode相同,会再判断值是否相同。如果值还相同,HashSet会认为是重复的元素,会替换元素。如果值不同,会在哈希桶的下面拼一个链表来保存元素。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值