共计 2043 个字符,预计需要花费 6 分钟才能阅读完成。
package com.study.java;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
/**
* /----Map: 双列数据 存储 key-value 对的数据
* /----HashMap: 作为 Map 的次要实现类;线程不平安,效率高,存储 null 的 key 和 value
* /----LinkedHashMap: 保障遍历 map 元素时,能够按增加程序实现遍历
* 起因:在原有的 HashMap 底层构造根底上,增加了一对指针,指向前一个和后一个元素。* /----TreeMap: 保障依照增加的 key-value 对进行排序,实现排序遍历。此时思考 key 的天然排序或订制排序
* 底层应用红黑树
* /----Hashtable: 作为古老的实现类,线程平安,效率低;不能存储 null 的 key 和 value
* /----Properties: 罕用来解决配置文件。key 和 value 都是 string 类型
*
*
* HashMap 底层:数组 + 链表(jdk7 及以前)* 数组 + 链表 + 红黑树 (jdk8)
*
* Map 构造的了解:* Map 中的 key:无序的、不可反复的,应用 Set 存储所有的 key key 所在的类要重写 equals 和 hashCode 办法
* Map 中的 value:无序的,可反复,应用 Collection 存储所有的 value value 所在类要重写 equals 办法
* 一个键值对:key-value 形成一个 Entry 对象
* Map 中的 Entry: 无序的、不可反复的,应用 Set 存储所有的 entry
*
*
* HashMap 的底层实现原理,jdk7 为例:* HashMap map = new HashMap();
* 在实例化后,底层创立了长度为 16 的一维数组 Entry[]table
* ......
* map.put(k1, v1)
* 首先,调用 k1 所在类的 hashcode() 计算 k1 的哈希值,此哈希值通过某种算法计算后,失去 Entry 数组寄存的地位
* 如果此地位上数据为空,此时 K1-v1 增加胜利
* 如果此地位上的数据不为空,(意味着此地位上寄存一个或多个数据(以链表模式存在)),比拟 k1 和曾经存在的一个或多个数据的哈希值:4
* 如果 k1 的哈希值和曾经存在的数据哈希值都不雷同,此时 K1-v1 增加胜利。状况 1
* 如果 k1 的哈希值和曾经存在的某一个数据(k2-v2)的哈希值雷同,持续比拟:调用 k1 所在类的 equals(k2) 办法,比拟:* 如果 equals 返回 false:增加胜利 状况 2
* 如果 equals 返回 true:将 v1 替换雷同 key 的 value 值
* 补充:对于状况 2 和状况 3,此时 key1-value1 和原来的数据以链表的模式存储
* 在一直增加过程,会波及扩容问题,默认扩容形式:扩容为原来容量的两倍,并将原有的数据复制过去
*
* jdk8 相较于 jdk7 在底层实现方面的不同:* 1. new HashMap(): 底层没有创立一个长度为 16 的数组
* 2. jdk8 底层的数组是 Node[], 而非 Entry[]
* 3. 首次调用 put 办法时,底层创立长度为 16 的数组
* 4. jdk7 底层构造:数组 + 链表 jdk8:数组 + 链表 + 红黑树
* 当数组的某一个索引地位上的元素以链表模式存在的数据个数 > 8,且以后数组的长度 > 64 时,* 此时此索引地位上的所有数据改为应用红黑树存储。*
* DEFAULT_INITIAL_CAPACITY :HashMap 的默认容量:16
* DEFAULT_LOAD_FACTOR :HashMap 的默认加载因子:0.75
* threshold : 扩容的临界值:= 容量 * 填充因子:16 * 0.75 => 12
* TREEIFY_THRESHOLD:Bucket 中链表长度大于该默认值,转化为红黑树:8
* MIN_TREEIFY_CAPACITY: 桶中的 Node 被树化时最小的 hash 表容量
*
*
* LinkedHashMap 的底层实现原理:,增加数据时,还保护了两个援用,记录前一个和后一个数据
*
* TreeMap 中增加 key-value, 要求 key 必须是由同一个类创立的对象
* // 因为要依照 key 进行排序:天然排序、订制排序
*
* Properties: 罕用来解决配置文件。key 和 value 都是 string 类型
*/
public class MapTest {
@Test
public void test1() {HashMap hashMap = new HashMap();
hashMap.put(null, 123);
hashMap.put(222, "aa");
hashMap.put(223, "bb");
System.out.println(hashMap);
}
@Test
public void test2() {HashMap hashMap = new HashMap();
hashMap.put(null, 123);
hashMap.put(222, "aa");
hashMap.put(223, "bb");
System.out.println(hashMap);
}
}
正文完