zoukankan      html  css  js  c++  java
  • 谈谈HashSet的存储原理

    HashSet的存储原理:

      1、将要传入的数据根据系统的hash算法得到一个hash值;

      2、根据hash值可以得出该数据在hash表中的位置;

      3、判断该位置上是否有值,没有值则把数据插入进来;如果有值则再次判断传入的值与原值是否地址或equals相同,如果相同则不存,否则通过链表的方式 存储到该位置。

    比如:

    Set<Integer> set = new HashSet<Integer>();

      set.add( e );//add方法是return map.put( e , PRESENT) == null;

    本质是实例化医个HashMap对象 ---->map = new HashMap<>();

    然后是map.put()方法,

    public V put(K key,V value){

      if(table == EMPTY_TABLE){

        inflateTable(threshold);  //此处是初始化一张哈希表,表为数组结构

      }

      int hash = hash(key);  //根据key值,计算出对应的int类型的hash值

      int i = inexFor(hash,table.length):  //通过hash值在table表中得到一个存储的位置

      //判断指定下标的位置是否为空,如果为空则跳出循环,直接添加

      //否则与该位置上的链表元素一一比较,如果哈希值相同且地址或equals相同,则返回

      //否则添加进来

      for(Entry<K,V> e = table[i]; e != null; e = e.next){

        Object k ;

        //如果哈希值相等并且地址相等(需重写equals)

        if(e.hash == hash && ((k = e.key) == key || key.equals(k)){

          V oldValue = e.value;

          e.value = value;

          e.recordAccess(this);

          return oldValue;

        }

      }

      modCount++;

      addEntry(hash, key, value, i);   //以链表的方式添加元素

      return null;

    }

  • 相关阅读:
    调用同一个类的另一个方法,导致该方法的事物失效问题。。做记录
    JS点名功能
    JS复制功能
    js局部刷新
    基于 Token 的身份验证方法
    JS获取URL“#”后的值
    JS批量打包下载图片(笔记)
    九阴真经
    弹框播放腾讯视频(Iframe)
    js sessionStorage会话存取/删除
  • 原文地址:https://www.cnblogs.com/wuhu/p/7081686.html
Copyright © 2011-2022 走看看