set集合类源码查看

一、博客背景

set接口下有两个主要常用地的实现子类hashset、linkedhashset和treeset,今天我们就一起来查看学习下

二、hashset

1.构造函数

private transient HashMap<E,Object> map;

private static final Object PRESENT = new Object();

public HashSet() {
	map = new HashMap<>();
}

public HashSet(Collection<? extends E> c) {
	map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
	//addAll方法为AbstractCollection定义,因hashset底层为hashmap,所以addAll方法也应为hashmap中实现的addAll方法
    addAll(c);
}

 public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
 }

public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
 }

//提供给LinkedHashSet调用的父类构造函数
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
	map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

可以从上面的构造函数看到,hashset的底层其实就是一个hashmap

2.常用方法

//set大小
public int size() {
	return map.size();
}

//set是否为空
public boolean isEmpty() {
	return map.isEmpty();
}

//判断是否包含某个数据
public boolean contains(Object o) {
	return map.containsKey(o);
}

//添加一个元素,本质上就是往一个map中添加value为空的object对象,key为e的元素
public boolean add(E e) {
	return map.put(e, PRESENT)==null;
}

//移除某个元素
public boolean remove(Object o) {
	return map.remove(o)==PRESENT;
}

//清空元素
public void clear() {
	map.clear();
}

从上面的代码看来,基于set的所有的操作都是在基于底层的map进行操作,调用的方法也是底层hashmap实现的方法

三、LinkedHashSet

1.类定义

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

LinkedHashSet继承hashset

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的构造函数都是调用HashSet中以LinkedHashMap为底层的一个构造函数,所以LinkedHashSet的底层其实就是一个LinkHashMap,同理基于它的所有增删改查的操作也是基于LinkedHashMap的操作

四、TreeSet

1.构造函数

private static final Object PRESENT = new Object();
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);
}

从上面的构造函数可以看出,TreeSet的构造函数都是以TreeMap为底层的一个构造函数,所以TreeSet的底层其实就是一个TreeMap,同理基于它的所有增删改查的操作也是基于TreeMap的操作

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值