精华内容
下载资源
问答
  • hashSet底层去重原理
  • HashSet 底层数据结构

    2021-07-10 11:53:39
    HashSet 底层数据结构HashSet源码HashSet的 add(E e) 方法 HashSet 底层数据结构是HashMap ,无参构造方法会创建一个初始容量为16,加载因子为0.75的HashMap HashSet源码 public class HashSet extends AbstractSet ...

    HashSet 底层数据结构

    HashSet 底层数据结构是HashMap ,无参构造方法会创建一个初始容量为16,加载因子为0.75的HashMap

    HashSet源码

    public class HashSet extends AbstractSet implements Set, Cloneable,Serializable {
                  private transient HashMap map;
                  private static final Object PRESENT = new Object();
                   
                  public HashSet() {
                      map = new HashMap();
                  }
                  public Iterator iterator() {
                      return map.keySet().iterator();
                  }
                  public boolean add(E e) {
                      return map.put(e, PRESENT)==null;
                  }
                  public boolean remove(Object o) {
                      return map.remove(o)==PRESENT;
                  }
              }
    

    HashSet的 add(E e) 方法

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

    从源码中可以看出,add(E e)方法中的元素是作为HashMap中的key值, value值是一个Object类型的常量 PRESENT

    private static final Object PRESENT = new Object();
    

    HashSet底层的数据结构是一个哈希表,存在HashSet中的元素应该重写其hashCode()方法,故存在HashMap中的key,应该 重写其hashCode()方法。

    展开全文
  • HashSet底层原理

    2020-06-14 22:27:24
    HashSet底层就是HashMap,具体见代码截图 ![HashSet底层原理图 但是为什么HashSet的add是添加一个元素,HashMap的put是添加k/v键值对呢? 再看一下HasnSet的add方法的底层原理。 我们看到,其实HashSet的add其实...

    HashSet底层就是HashMap,具体见代码截图
    ![HashSet底层原理图
    但是为什么HashSet的add是添加一个元素,HashMap的put是添加k/v键值对呢?
    再看一下HasnSet的add方法的底层原理。
    HashSet的add方法底层原理图
    我们看到,其实HashSet的add其实就是HashMap的put方法,add的值就是put的key,但是put中value的PRESENT是什么呢?我们再看一下。
    PRESENT值
    我们看到,PRESENT其实就是new Object(),其实并不关心value值是什么,所有的value值都是一个这玩意,只是键不同而已。

    展开全文
  • HashSet底层是一个HashMap,HashSet只是用到了HashMap的key,将HashMap的值设为虚拟的值 手动实现HashSet package cn.GTMStudio.MyConnection; import java.util.HashMap; public class GTMHashSet { //HashSet的...

    HashSet底层是一个HashMap,HashSet只是用到了HashMap的key,将HashMap的值设为虚拟的值
    在这里插入图片描述

    手动实现HashSet

    package cn.GTMStudio.MyConnection;
    
    import java.util.HashMap;
    
    public class GTMHashSet {
        //HashSet的底层是一个HashMao
        HashMap map;
        //创建为HashMap的值关联的虚拟对象
        private static final Object PRESENT = new Object();
    
        public GTMHashSet() {
            map = new HashMap();
        }
    
        public int size() {
            return map.size();
        }
    
        public void add(Object o) {
            map.put(o, PRESENT);
        }
    
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append("[");
            for (Object key : map.keySet()) {
                sb.append(key+",");
            }
            sb.setCharAt(sb.length()-1,']');
            return sb.toString();
        }
    
        public static void main(String[] args) {
            GTMHashSet set = new GTMHashSet();
            set.add("aaa");
            set.add("bbb");
            set.add("ccc");
            System.out.println(set);
        }
    
    }
    

    总结

    HashSet实质上是特殊的HashMap,掌握了HashMap的底层原理就可以轻松掌握HashSet了。

    展开全文
  • HashSet底层存储

    2020-03-15 10:58:10
    HashSet底层的实现其实是一个HashMap,是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。 在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储...

    java.util.HashSet 属于单列集合(Collection是单列集合类的根接口),特点是元素无序,而且不可重复。HashSet底层的实现其实是一个HashMap,是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。

    在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。 但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现。

    HashSet是如何保证存储元素的唯一性呢?这依赖于内部的hashCode 与 equals 方法

    当插入一个元素时,首先调用对象的hashCode方法计算插入的数组索引,如果该位置为空,便直接插入。

    那么问题来了,仅使用hashCode方法能否保证元素的不可重复?这引出了哈希冲突的概念,哈希冲突是指哈希函数算出来的地址被别的元素占用了,即具有一样的哈希值,例子如下:

    System.out.println("ABCDEa123abc".hashCode());  // 165374702
    System.out.println("ABCDFB123abc".hashCode()); //  165374702
    

    两个不同的字符串调用hashcode得到的哈希值却是一样的。在HashMap中为了解决哈希冲突,采用了链地址法,当发生冲突的时候,它会在哈希函数找到的当前数组内存地址位置下添加一条链表,开始遍历链表进行插入,当链表长度超过阈值(8)时,将链表转换为红黑树,减少了遍历和查表的时间,增加了效率。在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。

    tips:如果想要存储的元素有序,那么需要使用LinkedHashSet进行存储,在hashset的基础上增加了一条记录节点的链,保证的存取元素的有序性。

    展开全文
  • HashSet底层实现

    千次阅读 2018-05-28 14:34:41
    1. HashSet概述: HashSet实现Set接口,由哈希表(实际上是一...2. HashSet的实现: 对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet...
  • hashSet底层去重原理

    2021-08-22 15:43:59
    hashSet底层去重原理 step1-->存入元素时,先比较要存入的元素的哈希值和集合中元素的哈希值是否一样 step2-->如果要存入的元素哈希值不同直接存入集合 step3-->如果存入元素的哈希值和集合元素的哈希值...
  • HashSet底层实现原理

    2021-10-10 12:34:13
    HashSet底层实现原理 基于HashMap实现 ,下面来看一下构造方法 //Constructs a new, empty set; the backing HashMap instance has default initial capacity (16) and load factor (0.75). public HashSet() { ...
  • HashSet底层存储原理

    2021-05-02 11:09:04
    Hash存储数据原理: ...如果要向HashSet中添加元素a,首先HashSet会调用元素a所在类的hashCode()方法,计算元素a的哈希值,接着通过算法计算出此哈希值在HashSet底层数组中的存放位置,判断此位..
  • HashSet底层和内存泄漏

    2021-10-20 13:00:02
    1.什么是HashSet: ...2.HashSet底层: HashSet的底层其实是一个HashMap; HashSet数据结构:一个对象数组,数组中存有链表; HashSet初始容量为16,加载因子为0.75; 问题1.为什么说Ha...
  • HashSet 底层源码分析

    2020-07-12 17:50:17
    原文链接 HashSet 底层源码分析 更多文章欢迎访问 我的独立博客站点 HashSet 是Jdk提供一种对象容器,元素不可重复的数据结构,经常被用于去重或者着重声明集合为不重复的集合的作用,其类图如下所示。 和 ...
  • 真正认识HashSet底层

    千次阅读 2019-11-15 11:17:05
    java.util.HashSet底层的实现其实是一个java.util.HashMap支持。 HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:hashCode与eq...
  • HashSet底层解析(11)

    2020-04-26 14:46:34
    3、HashSet底层实现。 4、HashSet常见面试题。 "你听那秋末的落叶,你听那叹息的离别...",这首歌今天在我脑海中一直回荡。明明是春天,心里却些许惆怅!明明在城市,却感受不到繁华。时常在想,外面的世界如此...
  • hashSet底层竟然是hashMap!! 首先 hashSet是一个单链集合,存储无序,不能有重复元素,但他的底层却是一个双链集合!简直是无稽之谈呀,但事实就是这样; 顺带一提,hashSet底层是基于哈希表存储的: JDK1.8中,...
  • HashSet底层HashMap的value为何是PRESENT?

    千次阅读 2021-01-12 15:49:12
    HashSet底层的HashMap所存的value为什么不是null?而是一个静态常量PRESENT? HashSet底层add方法 底层源码 public boolean add(E e) { return map.put(e, PRESENT)==null; } 可以看出底层是调用了HashMap的put...
  • 这两点刚好和我们常用的ArrayList相反,ArrayList中的元素通常都是允许重复且有序的,从两个集合类的底层数据结构来看,就能明白为什么是这样了,ArrayList底层是数组,而HashSet底层实际上是HashMap来实现的,所以...
  • jdk7.0源码解析HashSet底层实现原理 一、HashSet的概述 HashSet是Set接口的实现类,用于存储多个元素,存储特点是无序、无下标,元素不可以重复, 同时允许null作为元素;而且线程不安全,因为内部方法为非同步...
  • HashSet 底层原理

    2018-07-12 15:28:41
    HashSetHashSet 是一个不允许存储重复元素的集合,它的实现比较简单,只要理解了 HashMap,HashSet 就水到渠成了。成员变量首先了解下 HashSet 的成员变量: private transient HashMap<E,Object>...
  • 对于Set集合中存储无序的、不可重复的数据理解3.HashSet底层详解(面试常问) 前面我们学习完Collection接口中子接口List中的所有内容,今天来学习下Collection集合中另外一个子接口:Set接口。 1. Set集合的概述 ...
  • public HashSet() { map = new HashMap<>(); }
  • 以后我们会发现HashSet底层是HashMap 源码截图: 那我们不禁想到Map是以key,value键值对存在的,而set只有一个值,所以我们继续看set.add()源码: 所以我们从源码中add()确实调用了put(),我们set.add()时添加到map...
  • HashSet 底层分析

    2018-10-08 13:38:21
    HashSet 是一个不允许存储重复元素的集合,它的实现比较简单,只要理解了 HashMap,HashSet 就水到渠成了。 成员变量 private transient HashMap&lt;E,Object&gt; map; // Dummy value to associate with...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,906
精华内容 22,762
关键字:

hashset底层