转载
在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是Java编程中的基础工具,掌握其工作原理和常见面试题,不仅能帮助我们应对面试,更能提升在实际开发中的问题解决能力。深入理解HashMap,有助于我们更好地利用数据结构,提高代码的执行效率。
* HashMap 和 ConcurrentHashMap 的实现原理是什么?ConcurrentHashMap 是如何保证线程安全的? * ArrayList 和 LinkedList 的底层实现是什么?它们之间的区别是什么? * HashMap 和 Hashtable 的区别是什么?...
2. HashMap:了解 HashMap 的数据结构和实现原理。 3. HashSet:了解 HashSet 的实现原理和使用场景。 4. Hashtable:了解 Hashtable 的实现原理和使用场景。 本文对 Java 面试题进行了总结,涵盖了 Java 基础、多...
1. HashMap的内部结构、内部原理和HashTable的区别 * HashMap的内部结构主要是数组和链表的结合,通过hash函数将键映射到数组中的索引上,然后使用链表解决冲突的问题 * HashTable和HashMap的区别在于,HashTable...
* HashMap、Hashtable、ArrayList、LinkedList、Vector等集合类的理解 * JDK源码中的集合类实现 5. JVM和类加载机制: * JVM的结构和类加载原理 * 类加载机制的理解 6. 设计模式: * 观察者模式的实现 * 其他...
对比:Hashtable、HashMap、LinkedHashMap、ConcurrentHashMap、TreeMap (看第六条就可以) HashMap 用什么数据结构实现的 加载因子是什么 HashMap 初始化传入的容量参数的值是就是 HashMap 实际分配的空间么 ...
这篇文章记录在准备Java后端面试复习过程中网上常见的考题,同时也会标明题目出现频率...Java Map高频hashtable和hashmap的区别及实现原理,请你说明HashMap和Hashtable的区别?HashMap 和 ConcurrentHashMap?如何使Has
71. **HashMap原理**:基于哈希表实现,以数组+链表的形式存储数据。 72. **HashTable原理**:与HashMap类似,但它是线程安全的。 73. **LinkedList原理**:双向链表结构,适合频繁的插入和删除操作。 74. **...
多线程和JVM是Java编程中非常重要的概念,特别是对于进行面试准备的开发者来说,掌握这些知识至关重要。本篇内容将对多线程和JVM的相关知识点进行详细阐述,帮助开发者在面试中更有信心。 首先,多线程是Java中实现...
HashTable 和 HashMap 都是 Java 中常用的映射集合类,它们的实现基本相同,但有所不同。 HashTable 是线程安全的,内部的方法基本都是同步的,而 HashMap 是非线程安全的。 HashTable 不允许有 null 值的存在,而 ...
Java Map 集合中,我们常用的 Map 集合有 HashMap、HashTable、TreeMap、LinkedHashMap 等。 Spring 是一个容器,因为它可以管理 Java Bean,并将其存储在一个 Map 中。 最后,让我们讨论 Java 虚拟机的生命周期及...
2. **HashMap与HashTable**:对比两者的异同,理解线程安全和非线程安全的区别。 3. **ConcurrentHashMap**:了解其在多线程环境下的优势,以及Segment和Node的结构。 4. **TreeSet与TreeMap**:基于红黑树实现,...
对于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 的...
`Map`接口的实现如HashMap和Hashtable,HashMap非线程安全,性能较高,允许null键值对;Hashtable线程安全,不允许null键值对。 HashMap和Hashtable的主要区别在于线程安全性和null处理,HashMap提供了`...
1. **HashTable 和 HashMap**: - **存储**:两者都是键值对存储容器,HashMap允许键和值为null,而HashTable不允许。 - **线程安全**:HashTable是线程安全的,适合多线程环境,HashMap不是线程安全的,适用于单...
3、HashMap与Hashtable:HashMap是Java 1.2引入的Map接口实现,而Hashtable更早,基于Dictionary类。HashMap不保证线程安全,适合速度优先的场景;Hashtable则是线程安全的,但可能较慢。此外,HashMap允许null键值...
`Hashtable`和`HashMap`都是基于哈希表实现的数据结构,用于存储键值对。`Hashtable`是线程安全的,而`HashMap`不是。此外,`HashMap`允许键和值为`null`,而`Hashtable`不允许。 #### 4. forward与redirect `...
不同集合类的性能特点,如ArrayList与LinkedList、HashMap与Hashtable、HashSet与HashMap、HashMap与ConcurrentHashMap的区别;以及并发环境下HashMap的死循环问题和HashDOS攻击问题的讨论。此外,还提供了对...
Map接口的实现类有HashMap、TreeMap、Hashtable、ConcurrentHashMap等,而List接口的实现类有ArrayList、LinkedList、Stack和Vector等。HashMap和Hashtable之间的主要区别在于同步性:HashMap是非线程安全的,而...