ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

2021年JAVA面试~初识集合Set

2021-05-31 21:05:46  阅读:357  来源: 互联网

标签:Set JAVA HashMap HashSet initialCapacity boolean 2021 集合 public


前言

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
那么有没有人告诉你Set本质是什么?

Map

在这里插入图片描述
上一回我们说完Queue,
没看过的老铁可以看看我整理的系列:光头佳的求职之旅

https://blog.csdn.net/u013351145/category_11030408.html

在这里插入图片描述

Set

set是无序、不可重复的
主要方法基本和Colletion接口一致

 /**
		    * 返回当前集合的个数,如果超过2147483647
		    * (即Integer的最大值)后也只能返回这个数值)
		    */
		    int size();
		    
		    // 判断当前集合是否为空,如果为空就返回true
	        boolean isEmpty();
	        
	        // 判断当前集合是否包含输入参数对象
            boolean contains(Object o);
            
            // 迭代器(至于迭代的时候的顺序,要看你当前的集合,例如List可以保证顺序)
            Iterator<E> iterator();
			
			// 将集合转化为数组
			Object[] toArray();
			
			// 在集合中新增一个元素
			boolean add(E e);
			
			// 删除一个元素,这里提供的方法有个坑,后面再提
			boolean remove(Object o);
			
			//  判断当前集合是否包含另一个集合
   		    boolean containsAll(Collection<?> c);
			
			//  在当前集合里新增输入的集合元素
			boolean addAll(Collection<?> c);

   			// 在当前集合里删除输入的集合元素
   			boolean removeAll(Collection<?> c);
   			
			//此处和Collection接口由区别
				Spliterator<E> spliterator() {
			       return Spliterators.spliterator(this, Spliterator.DISTINCT);
			 }

HashSet

HashSet中的Hash是HashMao的Hash
在这里插入图片描述
下方为继承关系图
在这里插入图片描述

初始化

	// 使用HashMap来存储HashSet的元素
    private transient HashMap<E,Object> map;
	// HashMap中存储的value值
    private static final Object PRESENT = new Object();
	// 构造一个空的hashSet,实际会初始化一个空的HashMap 
    public HashSet() {
        map = new HashMap<>();
    }
	// 构造一个包含指定集合中元素的新集合
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
	// 以指定的initialCapacity和loadFactor构造一个空的HashSet。
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }
	
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

新增元素

实际将将该元素作为key放入HashMap,Value为默认的PRESENT。
由于HashMap的put()方法添加key-value对时,当新放入HashMap的Entry中key与集合中原有Entry的key相同(hashCode()返回值相等,通过equals比较也返回true),
新添加的Entry的value会将覆盖原来Entry的value,但key不会有任何改变,
因此如果向HashSet中添加一个已经存在的元素时,新添加的集合元素将不会被放入HashMap中,
原来的元素也不会有任何改变,这也就满足了Set中元素不重复的特性。

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
	// 删除也是同样的原理
    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

小结

HashSet中底层依靠HashMap实现,因此它的默认是加载因子(0.75),默认长度16,你可以认为HashSet就是一个value固定而key在变化的特殊HashMap。

LinkedHashSet

下图为继承关系
在这里插入图片描述

初始化

LinkedHashSet是HashSet的子类,基本方法和HashSet区别不大,
唯一的不同点在于LinkedHashSet中用于存储值的实现LinkedHashMap,
而HashSet使用的是HashMap。

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

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

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

小结

LinkedHashSet中用LinkedHashMap来实现存储值。

最后

在这里插入图片描述

标签:Set,JAVA,HashMap,HashSet,initialCapacity,boolean,2021,集合,public
来源: https://blog.csdn.net/u013351145/article/details/117373390

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有