【前面的话】
早上起来好瞌睡哈,最近要注意一样作息状态。
HashMap好好学习一下。
【定义】
HashMap继承了AbstracMap类,实现了Map接口和Cloneable接口,以及Serializable接口。
1) HashMap:
1 public class HashMap<K,V> 2 extends AbstractMap<K,V> 3 implements Map<K,V>, Cloneable, Serializable
2) AbstractMap
1 public abstract class AbstractMap<K,V> implements Map<K,V>
3) Map
1 public interface Map<K,V>
4) Cloneable
1 public interface Cloneable { //空接口 2 }
5) Serializable
1 public interface Serializable {//空接口 2 }
【知识点】
一、HashMap的数据结构
java中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本的结构来构造的,hashMap也不例外。Hashmap实际上是一个“链接散列”的数据结构,也就是数组和链表的结合体。
从下图可以看出,HashMap底层是一个数组结构,数组中的每一项又是一个链表,当新建一个HashMap的时候,就会初始化一个数组。
如下:
源代码如下:
1 static class Entry<K,V> implements Map.Entry<K,V> { 2 final K key; 3 V value; 4 Entry<K,V> next; 5 int hash; 6 ??? 7 }
可以看出,这就是java泛型的一个使用。就是一个key-value对,并且拥有指向下一个Entry的next,这就构成了一个链表。并且是一个单项链表。
二、HashMap的构造函数
1 public HashMap(int initialCapacity, float loadFactor)
指定容器大小和加载因子的构造函数
1 public HashMap(int initialCapacity)
指定容器大小的构造函数,加载因子默认为0.75
1 public HashMap()
默认构造函数,构造一个默认初始容量为16,默认加载因子为0.75的空HashMap
1 public HashMap(Map<? extends K, ? extends V> m)
构造一个映射关系与指定Map相同的新的HashMap
三、HashMap的API
类型 |
函数和功能 |
|
从此映射中移除所有映射关系。 |
|
返回此 HashMap 实例的浅表副本:并不复制键和值本身。 |
|
如果此映射包含对于指定键的映射关系,则返回 true。 |
|
如果此映射将一个或多个键映射到指定值,则返回 true。 |
Set<Map.Entry<K,V>> |
返回此映射所包含的映射关系的 |
|
返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回
|
|
如果此映射不包含键-值映射关系,则返回 true。 |
|
返回此映射中所包含的键的 |
|
在此映射中关联指定值与指定键。 |
|
将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。 |
|
从此映射中移除指定键的映射关系(如果存在)。 |
|
返回此映射中的键-值映射关系数。 |
|
返回此映射所包含的值的 |
四、HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。
1. 容量是哈希表中数组的长度。初始容量只是哈希表在创建时的长度默认为16
1 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
2. 加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。默认加载因子是 0.75,
1 static final float DEFAULT_LOAD_FACTOR = 0.75f;
五、HashMap的resize(rehash)
六、Hashmap的实现不是同步的,这意味着它不是线程安全的。它的key,value都可以为null。此外,HashMap中的映射不是有序的。
在有拉链法建立散列表的时候,最终建立的散列表和最初的关键字码中的顺序是不一样的。
关键字码为:{06,12,15,26,36,38,41,44,51,68},散列函数为H(key)=key%13。用拉链法处理冲突建立的表如下:
【参考资料】
2. Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例 (推荐这篇文章)
http://www.cnblogs.com/skywang12345/p/3310835.html
3. HashMap的工作原理
http://www.importnew.com/7099.html
【后面的话】
好好学习。
——TT
Java学习笔记(二二)——Java HashMap,布布扣,bubuko.com
原文:http://www.cnblogs.com/xt0810/p/3666101.html