Collection->Set->HashSet、TreeSet实现原理

  Collection下面除了一个常用的List接口,还有另外一个容器接口Set,不过Set目前本人使用的不多,但作为知识梳理还是要进行了解。

环境:JDK8

一、实现原理

1、HashSet内存存储原理

HashSet类的成员变量以及构造函数

    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

    private static final Object PRESENT = new Object();

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

很明显HashSet是以HashMap的key值作为存储容器的,那么联想到到HashMap的存储结构数组--链表(或二叉树)形式的存储结构,不难推测出HashSet的特性。

2、TreeSet内存存储原理

二、功能实现分析

1、add(e)方法

(1)HashSet的add(e)方法

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

2、remove(o)方法

(1)HashSet的remove(o)方法

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

3、contains(Object o)方法

(1)HashSet的contains(Object o)方法

    public boolean contains(Object o) {
        return map.containsKey(o);
    }

具体的HashMap操作过程可以参考源码解析:http://www.cnblogs.com/liushi805347332/p/java_map_HashMap-Hashtable.html

那么关于HashSet的性能、存储结构、扩容方式、线程安全性就很容易区分了,同HashMap一样的,至于TreeSet的分析,因为是基于ConcurrentSkipListMap进行存储的,所以等了解并发编程里面的容器Concurrent包后再进行补充。

原文地址:https://www.cnblogs.com/liushi805347332/p/8429862.html

时间: 2024-10-20 07:45:16

Collection->Set->HashSet、TreeSet实现原理的相关文章

Collection Set&amp;HashSet&amp;TreeSet(HashMap实现,去重特性)

一.HashSet 1. 虑重功能特性(HashMap实现) 2. put(key) 如果重复返回false /** * Adds the specified element to this set if it is not already present. * More formally, adds the specified element <tt>e</tt> to this set if * this set contains no element <tt>e2

hashSet的实现原理去重

/* 集合 的体系: ------------| Collection 单例集合的根接口 ----------------| List 如果是实现了List接口的集合类,具备的特点: 有序,可重复. -------------------| ArrayList ArrayList 底层是维护了一个Object数组实现的. 特点: 查询速度快,增删慢. -------------------| LinkedList LinkedList 底层是使用了链表数据结构实现的, 特点: 查询速度慢,增删快

Leetcode: LFU Cache &amp;&amp; Summary of various Sets: HashSet, TreeSet, LinkedHashSet

Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the following operations: get and set. get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1. s

转:深入Java集合学习系列:HashSet的实现原理

0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个private static final Object PRESENT

Java面试题之HashSet 的实现原理?

HashSet 的实现原理?首先,我们需要知道它是Set的一个实现,所以保证了当中没有重复的元素.一方面Set中最重要的一个操作就是查找.而且通常我们会选择 HashSet来实现,因为它专门对快速查找进行了优化.HashSet使用的是散列函数,那么它当中的元素也就无序可寻.当中是允许元素为null的. 先对实现原理进行一个总结:(1)基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap.封装了一个 HashMap 对象来存储所有的集合元素,所有放入

HashSet TreeSet 源码

1 HashSet 1.1 父类 java.lang.Object 继承者 java.util.AbstractCollection<E> 继承者 java.util.AbstractSet<E> 继承者 java.util.HashSet<E> 类型参数: E - 此 set 所维护的元素的类型 所有已实现的接口: Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>

java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)

说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长度固定 既可以存储基本数据类型,也能存储引用数据类型 一个数组中的元素类型必一致 集合 长度可变 只能存储引用数据类型 一个集合中的元素类型可以是任意的引用类型 一.集合概述 Collection<E> 父接口 List<E> 子接口 ArrayList<E>类 Vecto

HashSet,TreeSet和LinkedHashSet的区别

Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象. HashSet: 顺序是不确定性的. LinkedHashSet:按照输入的顺序进行输出. TreeSet:SortedSet 接口的唯一实现类,保证集合元素处于排序状态. 1.HashSetHashSet有以下特点    不能保证元素的

Set下面HashSet,TreeSet和LinkedHashSet的区别

Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象. HashSetHashSet有以下特点? 不能保证元素的排列顺序,顺序有可能发生变化? 不是同步的? 集合元素可以是null,但只能放入一个null当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方