Java--集合框架之Set接口

Java集合框架总图
在这里插入图片描述
Set接口和具体实现类
在这里插入图片描述
Set接口继承Collection,集合元素不重复。与List一样,它同样允许null存在但仅可有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同。
注:关于重复性问题,Set接口中的不重复是有特殊要求的。
两个不同的对象A和B,正常情况下是能够放入到Set里面的,但如果A和B都重写了hashcode和equals方法,且重写后的hashcode和equals方法是相同的,那么A和B不能同时放入到Set集合中去,这也就验证了Set集合中的去重和hashcode、equals方法直接相关。

List基本上都以Array为基础,Set则在HashMap基础上来实现。
一、HashSet
1、继承关系

extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable

2、重点
(1)HashSet是一个没有重复元素的集合,且允许null。
HashSet由HashMap实现,不保证元素的顺序,即元素插入的顺序与输出的顺序不一致。
(2)HashSet是非同步的。
(3)HashSet按Hash算法来存储集合的元素,因此具有很好的存取和查找性能。
3、实现方式
通过HashMap存储元素,元素存放在HashMap的Key中,而Value统一使用一个Object对象。
4、易错点
(1)关于HashSet中存放null值
HashSet中允许存入null值,但在HashSet中只能够存入一个null值。
(2)HashSet中存储元素的位置是固定的
HashSet底层基于Hash算法实现,使用了hashcode,所以HashSet中相应元素的位置是固定的。
二、LinkedHashSet
1、继承关系

extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable

2、构造方法

public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }
 
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }

    public LinkedHashSet() {
        super(16, .75f, true);
    }

    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }
}

LinkedHashSet底层是基于LinkedHashMap实现。

public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }
//dummy用来区别创建的是HashMap还是LinkedHashMap
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

注:当前HashSet构造函数不能被直接调用。
3、重点
(1)LinkedHashSet继承自HashSet,底层基于LinkedHashMap实现。
(2)LinkedHashSet非同步。
(3)LinkedHashSet有序,根据元素的hashCode值决定元素的存储位置,同时使用链表维护元素的次序,因此当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
4、适用场景
由于HashSet是无序的,为了使哈希表在某种需求需要有序时使用,数据插入有一定顺序且不重复。
三、TreeSet
1、继承关系

public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable

2、构造方法

//默认的构造函数,使用该构造函数,TreeSet中的元素使用自然排序。
public TreeSet() {
        this(new TreeMap<E,Object>());
    }
//创建的TreeSet包含collection
public TreeSet(Collection<? extends E> c) {
        this();
        addAll(c);
    }
//指定TreeSet的比较器
public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }
//创建的TreeSet包含set
 public TreeSet(SortedSet<E> s) {
        this(s.comparator());
        addAll(s);
    }

3、重点
(1)插入无序,按顺序输出,不可为null,不可重复。
(2)TreeSet是一个包含有序的且没有重复元素的集合,底层基于TreeMap实现。
(3)TreeSet中含有一个NavigableMap类型的成员变量m(m实际上是TreeMap的实例)。
(4)TreeSet非线程安全。
(5)TreeSet支持两种排序方式,自然排序(默认的排序方式)和定制排序。
当构造TreeSet时,若使用不带参数的构造函数,则TreeSet的使用自然比较器。若需要使用自定义的比较器,则需要使用带比较器的参数。
注:TreeSet集合不通过hashcode和equals函数来比较元素,而是通过compare或comparaeTo函数来判断。compare函数通过判断两个对象的id,相同的id判断为重复元素而不被加入。
4、适用场景
需要按特定顺序排序且不重复。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值