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);    }}