Map
java.util.Map
特点:
- Map集合是一个双列集合,一个元素包含了两个值(key和value);
- Map集合中的元素,key和value可以相同,也可以不同;
- Map集合中的元素,key是不允许重复的,value是可以重复的;
- Map中的元素,key和value是一一对应的;
HashMap
java.util.HashMap
implements Map<k,v>接口;
特点:
- HashMap集合底层是哈希表,查询速度特别快,多线程的集合,线程不安全;
JDK1.8以前: 数组+单向链表
JDK1.8以后: 数组+单向链表/红黑树(链表的长度超过8):提高查询速度; - HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致,并且可以存储null键和null值;
LinkedHashMap
java.util.LinkedHashMap
<k,v>集合 extends HashMap<k,v>集合
特点:
- LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序);
- LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是有序的;
HashTable
java.util.LinkedHashtable
<K,V>集合 implements Map<K,V>接口
底层也是一个哈希表,是线程安全的集合,是单线程的集合,速度慢,不能存储null值null键;
JDK1.2版本后被HashMap取代;
Map集合常用API
public V put(K key , V value) : 把指定的键与指定的值添加到Map集合中;
存储键值对的时候,k不重复的情况下,返回的v是null;
存储键值对的时候,k重复的情况下,会使用新的value替换重复的k对应的value,然后返回被替换的value;
/**
* public V put(K key , V value) : 把指定的键与指定的值添加到Map集合中;
* 返回值 : v
* 存储键值对的时候,k不重复的情况下,返回的v是null;
* 存储键值对的时候,k重复的情况下,会使用新的value替换重复的k对应的value,然后返回被替换的value;
**/
public static void method01(){
Map<String, String> map = new HashMap<>();
String put = map.put("张三", "苹果");
//结果为 null;k不重复的情况下,返回的v是null
System.out.println(put);
String put1 = map.put("张三", "香蕉");
//结果为 苹果;k重复的情况下,会使用新的value替换重复的k对应的value,然后返回被替换的value;
System.out.println(put1);
//{张三=香蕉}
System.out.println(map);
}
public V remove(Object key) : 把指定的键所对应的键值对元素,在Map集合中删除,返回被删除元素的值;
如果key存在,v返回被删除的值;
如果Key不存在,v返回null;
/**
* public V remove(Object key) : 把指定的键所对应的键值对元素,在Map集合中删除,返回被删除元素的值
* 如果key存在,v返回被删除的值;
* 如果Key不存在,v返回null;
* */
public static void method02(){
Map<String, String> map = new HashMap<>();
map.put("张三","苹果");
map.put("李四","香蕉");
map.put("王五","榴莲");
String str = map.remove("张三");
//打印结果 : 苹果 ;返回被删除元素的值
System.out.println(str);
//{李四=香蕉, 王五=榴莲}
System.out.println(map);
}
public V get(Object key) : 根据指定的键,在Map中获取对应的值;
如果key存在,v返回被对应的值;
如果Key不存在,v返回null;
/**
* public V get(Object key) : 根据指定的键,在Map中获取对应的值;
* 如果key存在,v返回被对应的值;
* 如果Key不存在,v返回null;
*/
public static void method03(){
Map<String, String> map = new HashMap<>();
map.put("张三","苹果");
map.put("李四","香蕉");
map.put("王五","榴莲");
//key存在
String str = map.get("张三");
//打印结果为 : 苹果;
System.out.println(str);
//key不存在
String str1 = map.get("王小二");
//打印结果 : null;
System.out.println(str1);
}
boolean containsKey(Obejct key) : 判断集合中是否包含指定的key;
包含返回true;
不包含返回false;
/**
* boolean containsKey(Obejct key) : 判断集合中是否包含指定的key;
* 包含返回true;
* 不包含返回false;
* */
public static void method04(){
Map<String, String> map = new HashMap<>();
map.put("张三","苹果");
map.put("李四","香蕉");
map.put("王五","榴莲");
//存在的key
boolean key = map.containsKey("张三");
//打印结果 : true
System.out.println(key);
//不存在的key
boolean str = map.containsKey("王小二");
//打印结果 : false
System.out.println(str);
}
Map集合遍历方法:
方法一 :键找值
Set keySet()
思路:
- 使用Map集合中的keySet(),把Map集合中所有的key取出来存储到一个set集合中;
- 遍历set集合,获取Map中的每一个key;
- 通过Map集合的get()方法,获取key对应的value;
/**
* 方法一 :键找值
* Set<K> keySet()
* 思路:
* 1. 使用Map集合中的keySet(),把Map集合中所有的key取出来存储到一个set集合中;
* 2. 遍历set集合,获取Map中的每一个key;
* 3. 通过Map集合的get()方法,获取key对应的value;
* */
private static void method05() {
Map<String, String> map = new HashMap<>();
map.put("张三","苹果");
map.put("李四","香蕉");
map.put("王五","榴莲");
//1. 使用Map集合中的keySet(),把Map集合中所有的key取出来存储到一个set集合中;
Set<String> set = map.keySet();
//2. 遍历set集合,获取Map中的每一个key;
for (String s : set) {
//3. 通过Map集合的get()方法,获取key对应的value;
String str = map.get(s);
//打印结果 : 香蕉 苹果 榴莲
System.out.println(str);
}
}
方法二 :键值对
Set<Map.Entry<K,V>> entrySet()
使用Entry对象遍历
思路
- 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中;
- 遍历Set集合,获取每一个Entry对象;
- 使用Entry对象中的方法,getKey(),getValue()获取键与值;
/**
* 方法二 :键值对
* Set<Map.Entry<K,V>> entrySet()
* 使用Entry对象遍历
* 思路
*
* 1. 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中;
* 2. 遍历Set集合,获取每一个Entry对象;
* 3. 使用Entry对象中的方法,getKey(),getValue()获取键与值;
* */
private static void method06() {
Map<String, String> map = new HashMap<>();
map.put("张三","苹果");
map.put("李四","香蕉");
map.put("王五","榴莲");
//1. 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中;
Set<Map.Entry<String, String>> set = map.entrySet();
//2. 遍历Set集合,获取每一个Entry对象;
for (Map.Entry<String, String> entry : set) {
//3. 使用Entry对象中的方法,getKey(),getValue()获取键与值;
String key = entry.getKey();
String value = entry.getValue();
//李四:香蕉 张三:苹果 王五:榴莲
System.out.println(key+":"+value);
}
}
注意 : Map存储自定义对象时一定要重写equals()和hashcode()方法;