Java集合

Map接口

Map的实现类的结构:
|----Map:双列数据,存储key-value对的数据 ---类似于高中的函数:y = f(x)
   |----HashMap:作为Map的主要实现类;线程不安全的,效率高;存储null的key和value
      |----LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历。
         原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。对于频繁的遍历操作,此类执行效率高于HashMap。

   |----TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序,底层使用红黑树
   |----Hashtable:作为古老的实现类;线程安全的,效率低;不能存储null的key和value
      |----Properties:常用来处理配置文件。key和value都是String类型

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

面试题:

  1. HashMap的底层实现原理?
  2. HashMap 和 Hashtable的异同?
  3. CurrentHashMap 与 Hashtable的异同?(暂时不讲)

jdk8 相较于jdk7在底层实现方面的不同:

  1. new HashMap():底层没有创建一个长度为16的数组
  2. jdk 8底层的数组是:Node[],而非Entry[]
  3. 首次调用put()方法时,底层创建长度为16的数组
  4. jdk7底层结构只有:数组+链表。jdk8中底层结构:数组+链表+红黑树。
       4.1 形成链表时,七上八下(jdk7:新的元素指向旧的元素。jdk8:旧的元素指向新的元素)
       4.2 当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8 且当前数组的长度 > 64时,此时此索引位置上的所数据改为使用红黑树存储。

二、Map中常用方法:
添加、删除、修改操作:
Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
void putAll(Map m):将m中的所有key-value对存放到当前map中
Object remove(Object key):移除指定key的key-value对,并返回value
void clear():清空当前map中的所有数据

public static void main(String[] args) {
HashMap map = new HashMap();
// 添加
map.put("AA",11);
map.put("BB",22);
map.put("CC",33);
map.put(123,44567);
// 修改
map.put("CC","CC做了修改");
System.out.println(map); // {AA=11, BB=22, CC=CC做了修改, 123=44567}

    // 将map2中元素添加到map中
    HashMap map2 = new HashMap();
    map2.put("DD",11);
    map2.put("EE",22);
    map.putAll(map2);
    System.out.println(map);    // {AA=11, BB=22, CC=CC做了修改, DD=11, EE=22, 123=44567}
    
    map.remove("EE");
    map.clear();    // {},注意和map=null不同,只是清掉了数据!
}
posted @ 2020-12-22 15:33  郝艾北北SSE  阅读(80)  评论(0)    收藏  举报