zoukankan      html  css  js  c++  java
  • JDK 1.8源码阅读 HashMap

    一,前言

      HashMap实现了Map的接口,而Map的类型是成对出现的。每个元素由键与值两部分组成,通过键可以找对所对应的值。Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

      存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。

    二,HashMap结构

        我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。实际上HashMap是一个“链表散列”,如下是它数据结构:

      

    三,HashMap源码阅读

      3.1 HashMap的继承关系

        

      3.2 HashMap的构造方法

    public HashMap(int initialCapacity, float loadFactor) {}  // 初始容量,和加载因子
    
    public HashMap(int initialCapacity) {} // 初始容量
    
    public HashMap() {} // 空参构造
    
    public HashMap(Map<? extends K, ? extends V> m) {} // 将Map对象进行构造

      初始容量,加载因子。这两个参数是影响HashMap性能的重要参数,其中容量表示哈希表中桶的数量,初始容量是创建哈希表时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,它衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。对于使用链表法的散列表来说,查找一个元素的平均时间是O(1+a),因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。系统默认负载因子为0.75,一般情况下我们是无需修改的。

      3.3 HashMap的常用方法

    public int size() {} // 长度
     
    public boolean isEmpty() {} // 是否为空
    
    public V get(Object key) {} // 根据key获取值
    
    public boolean containsKey(Object key) {} // 判断是否含某key
    
    public V put(K key, V value) {} // 添加Key Value
    
    public void putAll(Map<? extends K, ? extends V> m) {}  // 添加多个
    
    public V remove(Object key) {} // 删除
    
    public void clear() {} // 清空
    
    public boolean containsValue(Object value) {} // 判断是否有value
    
    public Set<K> keySet() {} // 将key转换成Set
    
    public Collection<V> values() {} // 将values转换成collection对象
    
    // Overrides of JDK8 Map extension methods
    
    @Override
    public V getOrDefault(Object key, V defaultValue) {} // 根据key获取,若不存在则设置该值
       
    
    @Override
    public V putIfAbsent(K key, V value) {} // 若key对于的值为空则设置该值,并返回
    
    @Override
    public boolean remove(Object key, Object value) {} //删除key value
    
    @Override
    public boolean replace(K key, V oldValue, V newValue) {} // 指定值替换 
    
    @Override
    public V replace(K key, V value) {} // 直接替换
    
    @Override
    public V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction) {}
    
    public V computeIfPresent(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {}
    
    @Override
    public V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {}
    
    @Override
    public V merge(K key, V value,hash, key, value, first);
          
    @Override
    public void forEach(BiConsumer<? super K, ? super V> action) {} // 提供迭代
    
    @Override
    public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {}
    
    @SuppressWarnings("unchecked")
    @Override
    public Object clone() {} // 复制
    
    private void writeObject(java.io.ObjectOutputStream s)}
    
    private void readObject(java.io.ObjectInputStream s){}

    四,总结

      HashMap集合中的key不能重复,通过重写hashCode() 与 equals()方法来保证键的唯一。不能保证元素存与取的顺序完全一致

  • 相关阅读:
    Spring IoC和AOP使用扩展(二)
    Spring核心概念(一)
    MyBatis的动态SQL(五)
    MyBatis的SQL映射文件(四)
    初始myBatis(三)
    初始myBatis(二)
    微信小程序学习九 事件系统
    微信小程序学习八 wxs
    微信小程序学习七 视图层wxml语法
    微信小程序学习六 模块化
  • 原文地址:https://www.cnblogs.com/tashanzhishi/p/10617078.html
Copyright © 2011-2022 走看看