Java 集合类——Collections(3)

Set接口

set接口的特点:

  • 不允许出现重复的元素
  • 集合中的元素位置无顺序
  • 有且只有一个值为null的元素

因为set是一个抽象的接口,所以不能直接实例化一个set对象。(Set s = new Set()是错误的)

Set接口的两大实现:HashSet、TreeSet

常用方法:

  • add():向集合添加元素
  • clear():清除集合中所有元素
  • contains():判断集合是否包括某一元素
  • isEmpty():判断集合是否为空
  • iterator():用于遍历集合
  • remove():从集合中去掉特定的对象
  • size():返回集合的大小

HashSet

HashSet是基于HashMap来实现的,使用了HashMap的key来实现各种特性,而HashMap的value始终是PRESENT。

HashSet存储元素的顺序并不是按照存入时的顺序,是按照哈希值来存的,所以取数据也是按照哈希值取的。

构造方法

//构造一个新的空Set,底层是HashMap
public HashSet() {
    map = new HashMap<>();
}

//构造一个包含指定collection中的所有元素的新Set
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

//构造一个新的空Set,其底层的HashMap实例具有指定的初始容量和默认的加载因子
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

//构造一个新的空Set,其底层的HashMap实例具有指定的初始容量和指定的加载因子
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}复制代码

HashSet是如何判断两个元素重复:

通过hashCode()方法和equals方法来保证元素的唯一性,add方法返回boolean类型。

判断两个元素是否相同,先判断元素的hashCode值是否一致。如果一致,就会调用equals方法。如果equals返回true,HashSet就视为同一元素;返回false,则不是同一元素。

HashSet和ArrayList集合都有判断是否有相同元素的方法。

//HashSet,底层用hashCode和equals方法判断
public boolean contains(Object o) {
    return map.containsKey(o);
}

//ArrayList的contains方法,底层用equals方法判断
public boolean contains(Object o) {
    return indexOf(o) >= 0;
}
public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}
复制代码

TreeSet

TreeSet是一个有序集合,可以按任何顺序将元素插入该集合,当对该集合进行迭代时,元素按照升序排序。

TreeSet的底层使用的是TreeMap,TreeMap的底层实现是红黑树。

构造方法:

public TreeSet() {
    this(new TreeMap<E,Object>());
}
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}
public TreeSet(Collection<? extends E> c) {
    this();
    addAll(c);
}
public TreeSet(SortedSet<E> s) {
    this(s.comparator());
    addAll(s);
}复制代码


参考资料:

Java Set集合的详解


转载于:https://juejin.im/post/5c84a51ef265da2d8a55e79c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值