概述
java.util.Map<k,v>
集合特点:
1)Map集合是一个双列集合,一个元素包含两个值;
2)Map集合中的元素,key和value的数据类型可以相同,也可以不同;
3)Map集合中的元素,key是不允许重复的,value可以重复(key重复了就会用新的value值将旧的value值替换掉);
4)Map集合中的元素,key和value是一一对应的;
Map常用子类
java.util.HashMap<K,V>
集合 implements Map<k,v>接口- HashMap的特点:
1)HashMap集合底层是哈希表:查询速度快
2)HashMap集合是一个无序的集合,存储元素和取出元素的顺序可能不一致; java.util.LinkedHashMap<k,v>
集合 extends HashMap<k,v>集合- LinkedHashMap集合的特点:
1)LinkedHashMap底层是哈希表+链表结构(保证迭代的顺序)
2)LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的;
Map接口中常用方法

- 第一种遍历方式:
1)使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个set集合中;
2)遍历set集合,获取Map集合中的每一个key;
3)通过Map集合中的get(key)方法,通过key找到value;
public class MapTest {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("林志颖",18);
map.put("林志玲",18);
Set<String> set = map.keySet();
for(String key:set){
Integer value=map.get(key);
}
}
}
- 第二种遍历方式:
- Map.Entry<k,v>:在Map接口中有一个内部接口Entry
作用:当Map集合一put个元素,那么就会在Map集合中创建一个Entry对象,用来记录键与值(键值对对象,键与值的映射关系)

- 实现步骤:
1)使用Map集合中的方法entryset(),把Map集合中多个Entry对象取出来,存储到一个set集合中;
2)遍历set集合,获取每一个Entry对象;
3)使用Entry对象中的方法getKey()和getValue()获取键与值;
public class MapTest {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("林志颖",18);
map.put("林志玲",18);
Set<Map.Entry<String,Integer>> set1 = map.entrySet();
Iterator<Map.Entry<String,Integer>> it= set1.iterator();
while (it.hasNext()){
Map.Entry<String,Integer> entry = it.next();
String key = entry.getKey();
Integer value = entry.getValue();
}
}
}
HashMap存储自定义类型键值
- map集合必须保证key是唯一的:作为key的元素,必须重写hashcode方法和equals方法,以保证key唯一;(put元素时会判断key是否重复通过hashcode方法和equals方法)
- 若自定义类型作为key,则需要重写hashcode方法和equals方法;若作为value,则无需重写hashcode方法和equals方法;
Map<Person,String> map1=new HashMap<>();
map1.put(new Person("ff",12),"中国");
map1.put(new Person("ff",12),"中国");
map1.put(new Person("gg",16),"中国");
System.out.printf(map1.toString());
LinkedHashMap集合
Hashtable<k,v>集合
java.util.Hashtable<k,v>
implements Map<k,v>接口- Hashtable:底层是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢;
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快; - HashMap集合(与及之前的所有集合):可以存储null值,null键
Hashtable集合,不能存储null值和null键 - Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了;
- Hashtable的子类Properties依然活跃在历史舞台
Properties集合是唯一一个和IO流相结合的集合
HashMap<String,String> map=new HashMap<>();
map.put(null,null);
Hashtable<String,String> map1 = new Hashtable<>();
map1.put(null,null);
JDK9对集合添加的优化
- List接口/Set接口/Map接口:里边增加了一个静态方法of,可以给集合一次性添加多个元素;
- static List of (E… elements)
使用前提:当集合中存储元素的个数已经确定了,不在改变时使用; - 注意:
1)of方法只适用于 List接口/Set接口/Map接口,不适用于接口的实现类;
2)of方法的返回值是一个不能改变的集合,集合不能在使用add/put方法添加元素,否则会抛出异常;
3)Set接口和Map接口在调用of方法的时候,不能有重复的元素,否则会抛出异常;
List<String> list = List.of("a","b","a","c","d");
list.add("w");
Set<String> set = Set.of("a","b","c","a","d");
set.add("w");