HashSet源码分析

由哈希表实现,实际底层为HashMap。

public HashSet(Collection<? extends E> c) {
      map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
      addAll(c);
    }
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<E,Object>(initialCapacity, loadFactor);
    }
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

PRESENT:傀儡值,Object类型,做判断是否包含过用

Map的key存的对象就是Set中的值,这块就是为什么Set不能存储重复元素的原因。

-1,Set:存入Set的每个元素必须是唯一的。加入Set的元素必须定义equals方法,以确保其唯一性。Set接口不保证维护元素的顺序。

-2,HashSet:为快速查找而设计的Set。存入HashSet的元素必须实现hashCode方法。HashSet是使用Set的默认首选。

-3,TreeSet:保持次序的Set,底层为树结构。使用它可以从Set中提取有序集合,元素必须实现Comparable接口。

-4,LinekdHashSet:具有HashSet的查询速度,且内部使用链表维护顺序。在迭代遍历的时候会以插入的顺序来展示集合。

时间: 2024-10-23 12:51:15

HashSet源码分析的相关文章

Java集合系列之HashSet源码分析

一.HashSet简介 HashSet是Set接口典型实现,它按照Hash算法来存储集合中的元素,具有很好的存取和查找性能.主要具有以下特点: 不保证set的迭代顺序 HashSet不是同步的,如果多个线程同时访问一个HashSet,要通过代码来保证其同步 集合元素值可以是null 当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该值确定对象在HashSet中的存储位置.在Hash集合中,不能同时存放两个相等的

死磕 java集合之HashSet源码分析

问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5)HashSet是同步的吗? (6)什么是fail-fast? 简介 集合,这个概念有点模糊. 广义上来讲,java中的集合是指java.util包下面的容器类,包括和Collection及Map相关的所有类. 中义上来讲,我们一般说集合特指java集合中的Collection相关的类,不包含Map相

java.util.HashSet源码分析

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable HashSet实现Set接口,内部维护一个HashMap实例变量.不保证顺序,允许null元素. 对于基本的操作,如add,remove,contains,size,只需要常量的时间复杂度. 不是线程安全的,如果在多线程环境下,需要被同步化,如调用方法Collections.s

HashSet源码分析 jdk1.6

Set的特点:Set元素无顺序,且元素不可以重复. 1.定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable Set接口定义: public interface Set<E> extends Collection<E> { // Query Operations int size(); boolean

HashSet 源码分析

HashSet 1)HashSet 是基于 HashMap 的 Set 接口实现,元素的迭代是无序的,可以使用 null 元素. 创建实例 /** * HashSet基于HashMap实现 */ private transient HashMap<E,Object> map; // 用于在支持的 HashMap 中关联键的傀儡对象 private static final Object PRESENT = new Object(); /** * 创建一个初始容量为 16,加载因子为 0.75

Java8集合框架——HashSet源码分析

本文的目录结构: 一.HashSet 的 Javadoc 文档注释和简要说明 二.HashSet 的内部实现:内部属性和构造函数 三.HashSet 的 add 操作和扩容 四.HashSet 的 remove 操作 一.HashSet 的 Javadoc 文档注释和简要说明 截个图,然后来观摩 HashSet 的javadoc,照样是几点总结摘抄: Set 接口的实现类,内部使用了一个 HashMap 实例:不保证 set 的迭代顺序(无序):允许存储 null 通常情况下(假如 hash 分

集合之HashSet(含JDK1.8源码分析)

一.前言 我们已经分析了List接口下的ArrayList和LinkedList,以及Map接口下的HashMap.LinkedHashMap.TreeMap,接下来看的是Set接口下HashSet和LinkedHashSet,其实在分析完了HashMap.LinkedHashMap之后,再来看HashSet和LinkedHashSet就会非常简单. 二.hashSet的数据结构 因为hashSet的底层是基于hashMap或linkedHashMap的(new hashSet的时候可以指定),

知识链-源码分析

源码分析 HashSet源码分析 HashMap源码分析 源码解析Servlet和HttpServlet

死磕 java集合之PriorityQueue源码分析

问题 (1)什么是优先级队列? (2)怎么实现一个优先级队列? (3)PriorityQueue是线程安全的吗? (4)PriorityQueue就有序的吗? 简介 优先级队列,是0个或多个元素的集合,集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素. 一般来说,优先级队列使用堆来实现. 还记得堆的相关知识吗?链接直达[拜托,面试别再问我堆(排序)了!]. 那么Java里面是如何通过"堆"这个数据结构来实现优先级队列的呢? 让我们一起来学习吧. 源码分析 主要属性