`
yizhyi
  • 浏览: 61647 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JVM里面hashtable和hashmap实现原理

    博客分类:
  • java
阅读更多

转载

 

在hashtable和hashmap是java里面常见的容器类,

是Java.uitl包下面的类,

那么Hashtable和Hashmap是怎么实现hash键值对配对的呢,我们看看jdk里面的源码,分析下Hashtable的构造方法,put(K, V)加入方法和get(Object)方法就大概明白了。

一、Hashtable的构造方法:Hashtable(int initialCapacity, float loadFactor)

    public Hashtable(int initialCapacity, float loadFactor) {
 if (initialCapacity < 0)
     throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal Load: "+loadFactor);

        if (initialCapacity==0)
            initialCapacity = 1;
 this.loadFactor = loadFactor;
 table = new Entry[initialCapacity];
 threshold = (int)(initialCapacity * loadFactor);
    }

这个里面米内有什么好说的,要注意的是table一个是实体数组,输入的initialCapacity表示这个数组的大小,而threshold是一个int值,其中loadFactor默认是0.75,就是说明,当table里面的值到75%的阀值后,快要填满数组了,就会自动双倍扩大数字容量。

   而Entry<K,V> 来自与

private static class Entry<K,V> implements Map.Entry<K,V> {
            int hash;
            K key;
            V value;
            Entry<K,V> next;
是一个单项链表,

上图就是Hashtable的表,

二、put(K, V)加入方法

    public synchronized V put(K key, V value) {
 // Make sure the value is not null
 if (value == null) {
     throw new NullPointerException();
 }

 // Makes sure the key is not already in the hashtable.
 Entry tab[] = table;
 int hash = key.hashCode();
 int index = (hash & 0x7FFFFFFF) % tab.length;
 for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
     if ((e.hash == hash) && e.key.equals(key)) {
  V ld = e.value;
  e.value = value;
  return old;
     }
 }

 modCount++;
 if (count >= threshold) {
     // Rehash the table if the threshold is exceeded
     rehash();

            tab = table;
            index = (hash & 0x7FFFFFFF) % tab.length;
 }

 // Creates the new entry.
 Entry<K,V> e = tab[index];
 tab[index] = new Entry<K,V>(hash, key, value, e);
 count++;
 return null;
    }

这个看看起来很长,只要注意三点就可以了,

1.index,index是键值的hashcode和0x7FFFFFFF的&运算,然后根据数组长度求余值。这样可以定出所在队列名称,

2、

 for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
     if ((e.hash == hash) && e.key.equals(key)) {
  V ld = e.value;
  e.value = value;
  return old;
     }
 }

for语句里面是让e在tab某个队列名为index单项链表里面遍历,第几个单项链表的定义由index定义,看看该队列是否已经有同样的值,如果有,就返回该值。

3、如果没有,则加入

 Entry<K,V> e = tab[index];
 tab[index] = new Entry<K,V>(hash, key, value, e);

三、get(Object),获得

    public synchronized V get(Object key) {
 Entry tab[] = table;
 int hash = key.hashCode();
 int index = (hash & 0x7FFFFFFF) % tab.length;
 for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
     if ((e.hash == hash) && e.key.equals(key)) {
  return e.value;
     }
 }
 return null;
    }

这个就很好理解了 int index = (hash & 0x7FFFFFFF) % tab.length;

获得队列名称,

 for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
     if ((e.hash == hash) && e.key.equals(key)) {
  return e.value;
     }
 }

在该队里面遍历,根据hash值获得具体值。

 

总结下,一个是根据index确定队列,在由hash值获得具体元素值。

 

看完了hashtable, 我们在来看看hashMap
hashMap可以算作是hashtable的升级版本, 最早从1.2开始有的. 

但是, 两者之间最主要的不同有两点.
1.     hashMap的读写是unsynchronized, 在多线程的环境中要注意使用
而hashtable是synchronized
这两者的不同是通过在读写方法上加synchronized关键字来实现的.

第二个不同是hashMap可以放空值, 而hashtable就会报错.

这篇文章参考了

http://zhzhxiqi.广告.com/blog/208272

分享到:
评论

相关推荐

    hashmap面试题_hashmap_

    总结,HashMap是Java编程中的基础工具,掌握其工作原理和常见面试题,不仅能帮助我们应对面试,更能提升在实际开发中的问题解决能力。深入理解HashMap,有助于我们更好地利用数据结构,提高代码的执行效率。

    2022 最全 Java 面试笔试题汇总

    * HashMap 和 ConcurrentHashMap 的实现原理是什么?ConcurrentHashMap 是如何保证线程安全的? * ArrayList 和 LinkedList 的底层实现是什么?它们之间的区别是什么? * HashMap 和 Hashtable 的区别是什么?...

    2019蚂蚁金服面试题及答案

    2. HashMap:了解 HashMap 的数据结构和实现原理。 3. HashSet:了解 HashSet 的实现原理和使用场景。 4. Hashtable:了解 Hashtable 的实现原理和使用场景。 本文对 Java 面试题进行了总结,涵盖了 Java 基础、多...

    Java面试总结,Redis宕机数据丢失解决方案,看完这篇彻底明白了.docx

    1. HashMap的内部结构、内部原理和HashTable的区别 * HashMap的内部结构主要是数组和链表的结合,通过hash函数将键映射到数组中的索引上,然后使用链表解决冲突的问题 * HashTable和HashMap的区别在于,HashTable...

    超详细的阿里面试问题总结-错过无.docx

    * HashMap、Hashtable、ArrayList、LinkedList、Vector等集合类的理解 * JDK源码中的集合类实现 5. JVM和类加载机制: * JVM的结构和类加载原理 * 类加载机制的理解 6. 设计模式: * 观察者模式的实现 * 其他...

    java7hashmap源码-AndroidOffer:只为帮助您获得更好的报价

    对比:Hashtable、HashMap、LinkedHashMap、ConcurrentHashMap、TreeMap (看第六条就可以) HashMap 用什么数据结构实现的 加载因子是什么 HashMap 初始化传入的容量参数的值是就是 HashMap 实际分配的空间么 ...

    Java面试考题锦集之Java基础

    这篇文章记录在准备Java后端面试复习过程中网上常见的考题,同时也会标明题目出现频率...Java Map高频hashtable和hashmap的区别及实现原理,请你说明HashMap和Hashtable的区别?HashMap 和 ConcurrentHashMap?如何使Has

    java面试宝典

    71. **HashMap原理**:基于哈希表实现,以数组+链表的形式存储数据。 72. **HashTable原理**:与HashMap类似,但它是线程安全的。 73. **LinkedList原理**:双向链表结构,适合频繁的插入和删除操作。 74. **...

    多线程、JVM复习&面试&强化训练100题

    多线程和JVM是Java编程中非常重要的概念,特别是对于进行面试准备的开发者来说,掌握这些知识至关重要。本篇内容将对多线程和JVM的相关知识点进行详细阐述,帮助开发者在面试中更有信心。 首先,多线程是Java中实现...

    详解java各种集合的线程安全

    HashTable 和 HashMap 都是 Java 中常用的映射集合类,它们的实现基本相同,但有所不同。 HashTable 是线程安全的,内部的方法基本都是同步的,而 HashMap 是非线程安全的。 HashTable 不允许有 null 值的存在,而 ...

    鹅厂面试题、大厂面试题、JVM面试题

    Java Map 集合中,我们常用的 Map 集合有 HashMap、HashTable、TreeMap、LinkedHashMap 等。 Spring 是一个容器,因为它可以管理 Java Bean,并将其存储在一个 Map 中。 最后,让我们讨论 Java 虚拟机的生命周期及...

    java基础及中级面试题+jvm面试题+集合面试题

    2. **HashMap与HashTable**:对比两者的异同,理解线程安全和非线程安全的区别。 3. **ConcurrentHashMap**:了解其在多线程环境下的优势,以及Segment和Node的结构。 4. **TreeSet与TreeMap**:基于红黑树实现,...

    java常见面试题汇总(附答案).pdf

    对于Ajax,面试者需要理解异步通信的基本原理和应用场景,以及XML和JSON数据格式的特点,XML用于结构化数据交换,JSON则更轻量级且易于解析。 此外,面试中还会涉及到集合框架,如List、Set、Collection和...

    面试真题目录大全,详细版

    1. HashMap 和 Hashtable 的区别 2. HashMap 的底层实现(JDK 1.8 之前和之后) 3. ConcurrentHashMap 的底层原理(CAS+Synchronized) 4. Redis 的数据结构(String、List、Set、Hash、ZSet 等) 5. ZSet 和 Set 的...

    20练习1

    `Map`接口的实现如HashMap和Hashtable,HashMap非线程安全,性能较高,允许null键值对;Hashtable线程安全,不允许null键值对。 HashMap和Hashtable的主要区别在于线程安全性和null处理,HashMap提供了`...

    java面试宝典2021.docx

    1. **HashTable 和 HashMap**: - **存储**:两者都是键值对存储容器,HashMap允许键和值为null,而HashTable不允许。 - **线程安全**:HashTable是线程安全的,适合多线程环境,HashMap不是线程安全的,适用于单...

    应聘Java笔试时可能出现问题及其答案

    3、HashMap与Hashtable:HashMap是Java 1.2引入的Map接口实现,而Hashtable更早,基于Dictionary类。HashMap不保证线程安全,适合速度优先的场景;Hashtable则是线程安全的,但可能较慢。此外,HashMap允许null键值...

    j2ee面试

    `Hashtable`和`HashMap`都是基于哈希表实现的数据结构,用于存储键值对。`Hashtable`是线程安全的,而`HashMap`不是。此外,`HashMap`允许键和值为`null`,而`Hashtable`不允许。 #### 4. forward与redirect `...

    Java后端技术面试汇总-副本.pdf

    不同集合类的性能特点,如ArrayList与LinkedList、HashMap与Hashtable、HashSet与HashMap、HashMap与ConcurrentHashMap的区别;以及并发环境下HashMap的死循环问题和HashDOS攻击问题的讨论。此外,还提供了对...

    大数据面试题整理.docx

    Map接口的实现类有HashMap、TreeMap、Hashtable、ConcurrentHashMap等,而List接口的实现类有ArrayList、LinkedList、Stack和Vector等。HashMap和Hashtable之间的主要区别在于同步性:HashMap是非线程安全的,而...

Global site tag (gtag.js) - Google Analytics