Set集合

简介

无序,不可重复的集合

HashSet

①、HashSet:不能保证元素的顺序;不可重复;不是线程安全的;集合元素可以为 NULL;
②、对于 HashSet: 如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。
    1、当向HashSet集合中存入一个元素时,HashSet会先调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置
      1.1、如果 hashCode 值不同,直接把该元素存储到 hashCode() 指定的位置
      1.2、如果 hashCode 值相同,那么会继续判断该元素和集合对象的 equals() 作比较
          1.2.1、hashCode 相同,equals 为 true,则视为同一个对象,不保存在 hashSet()中
          1.2.2、hashCode 相同,equals 为 false,则存储在之前对象同槽位的链表上,这非常麻烦,我们应该约束这种情况,即保证:如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。

源码实现:

//创建hashSet,调用无参构造器
Set<String> hashSet = new HashSet<String>();
//添加元素方法
hashSet.add("123");

通过上面创建和添加元素,看源码中怎么实现:

// 无参构造器
public HashSet() {
    map = new HashMap<>();
}
// 添加元素方法
public boolean add(E e) {
   return map.put(e, PRESENT)==null;
}
// 上面一行中的PRESENT---> 空对象
private static final Object PRESENT = new Object();

通过源码可以看出,HashSet底层是通过维护一个HashMap来实现的, 存储的值相当于Map中的key,value默认为空对象。

linkedHashSet

不可以重复,有序
因为底层采用 链表 和 哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性

LinkedHashSet 继承 HashSet,底层也是通过维护一个 LinkedHashMap来实现功能的

//构造器
public LinkedHashSet() {
// 调用父类构造器
   super(16, .75f, true);
}

// 被调用的父类构造器
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
// 通过维护一个LinkedHashMap来实现LinkedHashSet 的功能
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

TreeSet

有序;不可重复,底层使用 红黑树算法,擅长于范围查询。

规则:

  1. 如果使用 TreeSet() 无参数的构造器创建一个 TreeSet 对象, 则要求放入其中的元素的类必须实现 Comparable 接口所以, 在其中不能放入 null 元素
  2. 必须放入同样类的对象.(默认会进行排序) 否则可能会发生类型转换异常.我们可以使用泛型来进行限制

源码实现同上:

public TreeSet() {
//通过维护一个TreeMap 来实现功能
   this(new TreeMap<E,Object>());
}
// 添加元素方法
public boolean add(E e) {
   return m.put(e, PRESENT)==null;
}
// 空对象,用来填充map中的value值
private static final Object PRESENT = new Object();

总结:
以上三个 Set 接口的实现类比较:
  共同点:
    1. 都不允许元素重复
    2. 都不是线程安全的类
  不同点:
    1. HashSet:不保证元素的添加顺序,底层采用 哈希表算法,查询效率高。判断两个元素是否相等,equals() 方法返回 true,hashCode() 值相等。即要求存入 HashSet 中的元素要覆盖 equals() 方法和 hashCode()方法
    2. LinkedHashSet:HashSet 的子类,底层采用了 哈希表算法以及 链表算法,既保证了元素的添加顺序,也保证了查询效率。但是整体性能要低于 HashSet    
    3. TreeSet:不保证元素的添加顺序,但是会对集合中的元素进行排序。底层采用 红-黑 树算法(树结构比较适合范围查询)

这里对Set集合不做过多介绍,因为都是通过Map来实现的,如果想对Set多一些了解,可以多看看Map集合中Key的规则限制

集合概述:http://blog.csdn.net/qq_19467623/article/details/78904666
List集合介绍:http://blog.csdn.net/qq_19467623/article/details/79530686
Map集合介绍:
集合同步以及排序等:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值