`
yuyajian
  • 浏览: 15536 次
社区版块
存档分类
最新评论

HashMap、HashTable源码分析

    博客分类:
  • java
 
阅读更多

java.util

 

接口 Map<K,V>

 

类型参数:

 

K - 此映射所维护的键的类型

 

V - 映射值的类型

 

所有已知子接口:

 

Bindings, ConcurrentMap<K,V>, ConcurrentNavigableMap<K,V>, LogicalMessageContext, MessageContext, NavigableMap<K,V>, SOAPMessageContext, SortedMap<K,V>

 

所有已知实现类:

 

AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap

主要分析一下:HashMap, TreeMap, Hashtable, SortedMap, ConcurrentHashMap

 

 

HashMap

HashTable

 

 

 

数据结构

Entry<?,?>[] table

Size

Entry<K,V>[] table

count

 

 

 

初始值

初始容量默认 16,加载因子是 0.75

初始容量默认 11,加载因子是 0.75

 

 

 

是否有序

无序

无序

 

 

 

安全性

不安全

安全

 

 

 

扩容机制

当前容量的两倍扩容

当前容量的两倍+1扩容

 

 

 

性能分析

插入慢,查询、删除速度一样(计算获得index,遍历table

rehash时性能慢,插入慢,查询、删除速度一样(计算获得index,遍历table

 

 

 

容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。

 加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。

 当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。

 

1HashMap    基于哈希表的 Map 接口的实现。

Put():添加方法

 

  • 1,初始化哈希表


  • 2,计算hash

  • 3rehash容量2倍扩容

 

  • 4,计算索引

 

 

hash表的数据结构为:链表式数组。

 

Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

 

Entry<K,V>

说明

K key

key

V value

value

int hash

keyhash

Entry<K,V> next

Next Entry

索引冲突处理方式为将新值放在第一位,并将next指向旧值.

 

Get():查询方法

计算KeyHash值遍历获取当前keyvalue

 

Remove():删除方法

 

使用建议:

  • 创建线程安全的HashMap方式如下:

Map m = Collections.synchronizedMap(new HashMap(...));

  • 指定map大小

在知道map大小情况下,建议在创建时指定map大小    

  • 遍历方式

使用for循环遍历,效率高于Iterator

 

2HashTable

 

Put():添加方法

 

  • Rehash容量2+1 扩容

 

3TreeMap

 

基于红黑树(Red-Black tree)的 NavigableMap实现。该映射根据其键的自然顺序进行排序

 

Put():添加方法

 

//修复红黑树

 

  /** From CLR */

 

    private void fixAfterInsertion(Entry<K,V> x) {

 

        x.color = RED;

 

 

 

        while (x != null && x != root && x.parent.color == RED) {

 

            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {

 

                Entry<K,V> y = rightOf(parentOf(parentOf(x)));

 

                if (colorOf(y) == RED) {

 

                    setColor(parentOf(x), BLACK);

 

                    setColor(y, BLACK);

 

                    setColor(parentOf(parentOf(x)), RED);

 

                    x = parentOf(parentOf(x));

 

                } else {

 

                    if (x == rightOf(parentOf(x))) {

 

                        x = parentOf(x);

 

                        rotateLeft(x);

 

                    }

 

                    setColor(parentOf(x), BLACK);

 

                    setColor(parentOf(parentOf(x)), RED);

 

                    rotateRight(parentOf(parentOf(x)));

 

                }

 

            } else {

 

                Entry<K,V> y = leftOf(parentOf(parentOf(x)));

 

                if (colorOf(y) == RED) {

 

                    setColor(parentOf(x), BLACK);

 

                    setColor(y, BLACK);

 

                    setColor(parentOf(parentOf(x)), RED);

 

                    x = parentOf(parentOf(x));

 

                } else {

 

                    if (x == leftOf(parentOf(x))) {

 

                        x = parentOf(x);

 

                        rotateRight(x);

 

                    }

 

                    setColor(parentOf(x), BLACK);

 

                    setColor(parentOf(parentOf(x)), RED);

 

                    rotateLeft(parentOf(parentOf(x)));

 

                }

 

            }

 

        }

 

        root.color = BLACK;

 

    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 40.3 KB
  • 大小: 18.9 KB
  • 大小: 18.4 KB
  • 大小: 18.8 KB
  • 大小: 20.6 KB
  • 大小: 5 KB
  • 大小: 8.1 KB
  • 大小: 16.6 KB
  • 大小: 28.3 KB
  • 大小: 44.4 KB
  • 大小: 46.1 KB
  • 大小: 22 KB
分享到:
评论

相关推荐

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...

    HashMap与HashTable的区别(含源码分析)

    5. 源码分析: 查看`HashTable`和`HashMap`的源码,可以发现两者在内部实现上也有所不同。`HashTable`直接使用了数组+链表的方式,而`HashMap`在Java 8及以后版本引入了红黑树优化,当链表长度达到一定阈值(8)时...

    HashMap 源码分析

    然而,HashMap与HashTable的主要区别在于线程安全性:HashTable是线程安全的,而HashMap则不是。 JDK1.8之后,HashMap进行了性能优化,引入了红黑树的数据结构。当链表的长度超过一个阈值(默认为8)时,HashMap会...

    HashMap源码分析

    ### HashMap源码分析 #### 一、概述 `HashMap`是Java编程语言中非常重要的一个数据结构,它属于`java.util`包的一部分,是`Map`接口的一个具体实现类。`HashMap`允许存储键值对,并且支持使用`null`作为键或值,这...

    Java容器之Hashtable源码分析

    【Java容器之Hashtable源码分析】 在Java编程中,`Hashtable`是一个古老的容器类,它继承自`Dictionary`接口,并实现了`Map`接口,同时也实现了`Cloneable`和`Serializable`接口。`Hashtable`与`HashMap`类似,都是...

    HashMap源码分析系列-第四弹:HashMap多线程解决方案.docx

    #### 二、HashMap线程安全问题分析 在多线程环境中,`HashMap`的主要线程安全问题包括但不限于: 1. **链表死循环问题**:在JDK 1.7中,当多个线程同时进行`put`操作时,可能会出现链表死循环的情况,这是一个严重...

    并发编程atomic&collections-课上笔记1

    本文主要讲述了 Java 中的并发编程,包括 atomic 包的介绍、CAS 算法的原理、ABA 问题的解决方案,以及 collections 中的 HashMap、HashTable 和 ConcurrentHashMap 的源码分析。 Atomic 包的介绍 ----------------...

    HashMap资料.zip

    10. **面试常见问题**:面试中常问的问题包括HashMap的扩容机制、哈希冲突解决策略、线程安全性、迭代器的使用等,还可能涉及HashMap的源码分析。 通过深入学习和理解HashMap,不仅可以提高代码的编写效率,也能在...

    深入解读大厂java面试必考点之HashMap全套学习资料

    HashMap是Java编程语言中最常用的集合类之一,尤其在面试中,HashMap的相关知识是考察...这套学习资料应该包含了HashMap的实例分析、源码解读、常见面试题以及实战演练等内容,确保你全面掌握这一核心Java数据结构。

    对java基础集合部分(List、HashMap、HashSet、ArrayList等)底层源码的分析与总结

    Java集合框架是Java编程中非常重要的部分,它提供了一种高效、灵活的数据组织方式。本文主要探讨了几个关键...通过对源码的深入分析,我们可以更好地掌握Java集合框架的工作原理,并根据实际需求选择最适合的数据结构。

    Java并发系列之ConcurrentHashMap源码分析

    Java并发系列之ConcurrentHashMap源码分析 ConcurrentHashMap是Java中一个高性能的哈希表实现,它解决了HashTable的同步问题,允许多线程同时操作哈希表,从而提高性能。 1. ConcurrentHashMap的成员变量: ...

    Java集合框架源码剖析:HashSet 和 HashMap

    因此本文将重点分析HashMap。  HashMap实现了Map接口,允许放入null元素,除该类未实现同步外,其余跟Hashtable大致相同,跟TreeMap不同,该容器不保证元素顺序,根据需要该容器可能会对元素重新哈希,元素的顺序...

    全面解析Java中的HashMap类

    本文将深入探讨HashMap的基本特性、哈希表数据结构以及JDK 1.7版本中的HashMap源码分析。 首先,HashMap的基本特性如下: 1. **允许null值**:HashMap允许键和值为null,而Hashtable则不允许。 2. **非线程安全**...

    java7hashmap源码-to-be-architect:成为Java架构师,你应该学习这些

    hashmap源码 to-be-architect to be a Java architect,you should learn these.This page is updated irregularly. Java基础 深入分析 Java SPI 机制和原理 并发编程专题 Executors线程池 线程池ThreadPoolExecutor...

    java8集合源码分析-Outline:大纲

    集合源码分析 JAVA: 基本语法 static 修饰变量 方法 静态块(初始化块 构造函数 ) 静态内部类() 静态导包 final() transient() foreach循环原理() volatile底层实现() equals和hashcode(, ) string,stringbuffer和...

    第二章 ConcurrentHashMap源码分析(JDK8版本)1

    这种设计使得它在处理高并发场景时,性能远超传统的线程安全容器如`Hashtable`。在实际开发中,`ConcurrentHashMap`常被用于构建高性能的并发数据结构,例如在Spring框架中,就广泛使用`ConcurrentHashMap`作为缓存...

    java8集合源码分析-Petal:面试复习及面试经验

    集合源码分析 开发面试常见问题整理 算法题:这个一般不难,剑指offer或者LeetCode easy题目,喜欢考排序,链表,树(红黑树、二叉排序树、完全二叉树、B+树区别) Java基础:集合类、HashMap/HashTable/...

    java技术指南

    文档内容丰富,既包括了Java的基本语法、源码分析、多线程处理、IO流操作、设计模式、常用框架、数据库技术、数据结构与算法、JVM原理、Web开发技术,也包括了Linux操作系统、Redis数据库、UML绘图以及JDK的新特性等...

Global site tag (gtag.js) - Google Analytics