1、Map 的主要实现
-
Map :双列数据,存储key-value 对的数据
-
===HashMap:主要实现类,线程不安全;线程不安全,效率高。可存储null的key 和value
-
======LinkedHashMap:保证遍历map 元素时可以按添加的顺序遍历。原因:底层使用双向链表的数据结构。两个指针可以一个指向前,一个指向后。对于频繁的遍历操作,此类执行效率高于HashMap。
-
===TreeMap:保证按照添加的key -value 对进行排序,实现排序遍历。此时考虑key的自然排序或者定制排序
-
底层结构:红黑树
-
===HashTable:古老实现类,线程安全,效率低。
-
======Properties :常用来处理配置文件。key 和 value 都是String 类型。
HashMap 的底层:数组+链表(jdk 7 以前)
数组+链表+红黑树(jdk8)(为提高效率)
2、Map 结构的理解
- Map 中的key:无序的,不可重复的,使用set 存储所有的key 要求:key 所在类要重写equals()和hashCode()
- Map 中的value:无序的,可重复的,使用Collection储存所有的value。 --value 所在类要重写equals() 方法。
- 一个键值对:key - value 构成了一个Entry 对象。
- Map 中的entry :无序不可重复。使用set 存储所有的entry
3、HashMap 的底层原理(添加元素过程图
说明:
- 在不断添加元素的过程中会涉及到扩容:容量变为原来的两倍,并将数据复制过来。
- hash 计算得到的地址如果有计算,后续数据存储以链表形式。
jdk 7 与 jdk8 版本比较
4、Map 中的常用方法
5、代码查验学习
package com.test;
import org.junit.Test;
import java.util.*;
public class TestMap {
@Test
public void test(){
Map hashMap = new HashMap();
Map hashtable = new Hashtable();
//可以放空数据
hashMap.put(null, null);
hashMap.put(null, 3);
//报错java.lang.NullPointerException
// hashtable.put(null,2);
System.out.println(hashMap);
}
/*
添加、删除、修改:
*/
@Test
public void methodTest1(){
Map hashMap = new HashMap();
Map hashMap1 = new HashMap();
hashMap1.put("AA", 12);
hashMap1.put("BB", 13);
//1、添加一个
hashMap.put("key1", 12);
System.out.println("hashMap 存放的键值对:"+hashMap);
// 把另一个hashMap1对象的所有键值对存到 hashMap 中
hashMap.putAll(hashMap1);
System.out.println("存入后:"+hashMap);
//2、移除指定key的key-value对
hashMap.remove("AA");
System.out.println("移除AA后输出:"+hashMap);
//修改
//value 可以相同
hashMap.put("mou", 45);
hashMap.put("shou", 45);
System.out.println("value 可以重复:"+hashMap);
//3、修改
//key 相同时替换(即可用作修改值)
hashMap.put("zhou", 46);
hashMap.put("zhou", 47);
System.out.println("修改后的hashMap:"+hashMap);
//输出其键值对数
System.out.println("输出hashMap的大小:"+hashMap.size());
// 判断是否为空
System.out.println("是否为空:"+hashMap.isEmpty());
//判断当前map 和参数对象obj 是否相等
System.out.println("两个对象是否相等:"+hashMap.equals(hashMap1));
//4、清除所有
hashMap.clear();
System.out.println("--------------没有数据了哦-------------");
System.out.println(hashMap);
System.out.println("输出hashMap的大小:"+hashMap.size());
}
/*
元视图操作
Set keySet():返回所有key构成的Set 集合
Collection values():返回所有value 构成的Set 集合
Set entrySet():返回所有key - value1对 构成的集合
*/
@Test
public void methodTest2(){
Map hashMap = new HashMap();
hashMap.put("AA", 12);
hashMap.put("BB", 13);
hashMap.put(45, 14);
hashMap.put("CC", 12);
// 1、遍历所有key集
System.out.println("遍历所有key集:");
Set set = hashMap.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//2、遍历所有的value 集
//不考虑去重
System.out.println("遍历所有value集:");
Collection values = hashMap.values();
for (Object obj : values) {
System.out.println(obj);
}
//3、遍历所有的key-value
System.out.println("遍历所有的key-value");
Set set1 = hashMap.entrySet();
Iterator iterator1 = set1.iterator();
while (iterator1.hasNext()){
Object obj = iterator1.next();
//set1 中的元素都是entry
Map.Entry entry = (Map.Entry) obj;
System.out.println(entry.getKey()+" 键值对(此处可修改) "+entry.getValue());
}
//由 3 可知 输出key 集 value 集 还可以用第三种方法。
}
/**
* 总结:
* 添加
* 删除
* 修改
* 查询
* 长度
* 遍历
*/
}
运行结果:
hashMap 存放的键值对:{key1=12}
存入后:{key1=12, AA=12, BB=13}
移除AA后输出:{key1=12, BB=13}
value 可以重复:{key1=12, BB=13, mou=45, shou=45}
修改后的hashMap:{key1=12, BB=13, mou=45, zhou=47, shou=45}
输出hashMap的大小:5
是否为空:false
两个对象是否相等:false
--------------没有数据了哦-------------
{}
输出hashMap的大小:0
遍历所有key集:
AA
BB
CC
45
遍历所有value集:
12
13
12
14
遍历所有的key-value
AA 键值对(此处可修改) 12
BB 键值对(此处可修改) 13
CC 键值对(此处可修改) 12
45 键值对(此处可修改) 14
{null=3}