Java HashSet的总结与代码演示

  • 时间:
  • 来源:互联网
  • 文章标签:

一、定义
HashSet是Java集合Set的一个实现类,Set是一个接口,其实现类除HashSet之外,还有TreeSet

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

二、构造函数
1、默认构造器,可以看出,底层实现其实就是HashMap,HashMap在本人其他博客有总结

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

2、将传入的集合添加到HashSet的构造器

public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

3、明确初始容器和装载因子的构造器
装载因子:加载因子是表示Hsah表中元素的填满的程度
若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.
反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.

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

4、仅明确初始容量的构造器(装载因子默认0.75)

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

三、集合元素不能重复
HashSet自身并没有独立的实现,而是在里面封装了一个Map,HashSet是作为Map的key而存在的,所以集合元素是不重复的

private static void testSet() {
		Set<String> set=new HashSet<String>();
		set.add("green");
		System.out.println(set);
		set.add("green");
//		第二次是插入不进去的
		System.out.println(set);
//		对比List  List是可以加入重复元素
		List<String> list =new ArrayList<String>();
		list.add("green");
		list.add("green");
		System.out.println(list);
	}

四、无序性
Set中的元素,没有顺序。严格的说,是没有按照元素的插入顺序排列

 private static void testSetSort() {
	Set<Integer> set=new HashSet<Integer>();
	set.add(1);
	set.add(9);
	set.add(5);
	System.out.println(set);
}

五、HashSet与HashMap的关系
通过源码可以发现,HashSet自身并没有独立的实现,而是在里面封装了一个Map。HashSet是作为Map的key而存在的
而value是一个命名为PRESENT的static的Object对象,因为是一个类属性,所以只会有一个

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    //HashSet里封装了一个HashMap
    private  HashMap<E,Object> map;
 
    private static final Object PRESENT = new Object();
 
    //HashSet的构造方法初始化这个HashMap
    public HashSet() {
        map = new HashMap<E,Object>();
    }
 
    //向HashSet中增加元素,其实就是把该元素作为key,增加到Map中
    //value是PRESENT,静态,final的对象,所有的HashSet都使用这么同一个对象
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
 
    //HashSet的size就是map的size
    public int size() {
        return map.size();
    }
 
    //清空Set就是清空Map
    public void clear() {
        map.clear();
    }
     
    //迭代Set,就是把Map的键拿出来迭代
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }
 
}

本文链接http://www.taodudu.cc/news/show-83159.html