复习源码分享——Map集合的便利

package com.atguigu.JavaImportant;

import org.junit.Test;

import java.util.*;

/**

  • @auther Elding_xrl
  • @create 2020-06-07-14:26
  • 一、
    |---->Map:双列数据,存储key-value对的数据 —类似于高中的函数:y=f(x)
    |---->HashMap:作为Map的主要实现类。线程不安全,效率高;能存储null的Key-value
    |---->LinkedHashMap:在原有的HashMap底层上,可以按照添加的顺序实现遍历
    原因:在原有的HashMap底层结构基础上,添加了一对指针,
    指向前一个和后一个,对于频繁的便利操作,此类执行效率高于HashMap
    |---->TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序。
    底层采用的红黑树。
    |---->Hashtable:古老的实现类。线程安全,效率低;不能存储null的Key-value
    |---->Properties:常用来处理配置文件。key和value都是Strng类型。

HashMap的底层:数组+链表 (jdk7及之前)
数组+链表+红黑树(jdk8)

  • 二、Map结构理解:
    key:无序不可重复的,使用set存储所有key ---->key所在类要重写equals()和Hashcode() (以HashCode为例)
    value:无序可重复的,使用Collection存储所有的value ---->value所在的类要重写equals()
    一个键值对:key-value构成了一个Entry对象
    Map中的entry:无序的、不可重复的,使用set存储

*三、HashMap的底层实现原理?JDK7为例
HashMap map =new HashMap();
在实例化以后,底层创建了一个entry对象的数组,Entry [] table;
map.put(key1,value1);
首先,在调用key1所在类的HashCode()计算code的值,此哈希值经过某种算法运算后,在Entry数组中的存放位置。
如果此位置上的数据为空,此时的key1,value1添加成功。 ----> 情况1
如果此位置上的数据不为空,(意味着此位置上存在一个或多个数据(以链表形式存在),比较key1和已存在一个或多个数据的哈希值):
如果key1的哈希值与已经存在的数据哈希值都不相同,则添加成功 ----> 情况2
如果key1的哈希值与已经存在的某一个数据(key2-value2)的哈希值相同,继续比较:调用key1所在类的equals(key2):
如果equals()返回false:此时添加成功;
如果equals()返回true:则将value1覆盖到value2; ----> 情况3

补充:关于情况2和情况3:此时key1-value1和原来的数据以链表的方式存储。
*
在不断的添加过程中,会涉及扩容,默认扩容为原来的2倍。并将原来的数据复制过来。
*

  • jdk7与jdk8在底层实现方面的区别:
  • 1、jdk7new HashMap():在底层创建一个长度为16的数组;
  • 2、JDK8的底层数组是node []而不是entry [];
  • 3、jdk8首次用put()方法时,底层创建一个长度为16的数组;
  • 4、jdk7的底层结构式:数组+链表。JDK8的底层结构:数组+链表+红黑树;
    当数组中的某一个索引位置上的数据个数 > 8 且 数组长度 > 64时:此时此索引位置上的所有数组存储方式改为红黑树。
  • 总结:常用方法()
  • 添加:put();
  • 删除:remove();
  • 修改:put();
  • 查询:get();
  • 长度:size();
  • 遍历:keySet()/values()/entrySet()

*/
public class MapTest {
@Test
public void Test1(){
HashMap map = new HashMap();
map.put(“111”,“撒旦撒旦”);
map.put(“222”,“牛逼克拉斯”);
map.put(“333”,“小鸟伏特加”);
map.put(“1112”,“撒旦撒旦”);
map.put(232323,“撒旦撒旦”);

    //遍历所有的key集:keySet()
/*    Set set = map.keySet();
    Iterator it = set.iterator();
    while (it.hasNext()){
        Object next = it.next();
        System.out.println(next);
    }*/



    //遍历所有的value集:values();
    Collection values = map.values();
    for (Object cc:values ) {
        System.out.println(cc);
    }


    //遍历所有的key-value:entrySet();
    //方式一
    Set set1 = map.entrySet();
    Iterator iterator = set1.iterator();
    while (iterator.hasNext()){
        Object next = iterator.next();
        //entrySet集合中的元素都是entry
        Map.Entry entry = (Map.Entry) next;
        System.out.println(entry.getKey()+"---->"+entry.getValue());
    }

    //方式二
    Set set = map.keySet();
    Iterator it = set.iterator();
    while (it.hasNext()){
        Object next = it.next();
        Object o = map.get(next);
        System.out.println(next+"====="+o);
    }
}

}

你可能感兴趣的:(java复习)