- 集合的基本接口之二是Map接口,与Collection接口不同,Map接口存储的是双列数据。
- Map接口中的key是无序的、不可重复的,使用Set接口存储;value是无序的、可重复的,使用List接口存储;entry(key-value)是无序的、不可重复的,使用Set接口存储。
- Map的底层实现原理:调用map.put(key,value)时,先调用key.hashCode()计算key的哈希值,根据哈希值计算出该键值对在entry[]中的存放位置,如果此位置上为空,则直接添加,否则比较key与该位置上的所有键值对的key的哈希值,若都不相同,则直接添加,否则调用equals()与哈希值相同的key比较,若都不相同,则直接添加,否则用该value替换原来的value。
- key需要重写equals()和hashCode(),value需要重写equals()。
- 当数组某一个位置上的元素以链表形式存储的个数大于8,且当前数组长度大于64时,则该位置上的所有数据改为红黑树存储。
- HashMap类是线程不安全的,但是效率高,可以存储null的key和value。
- Hashtable类是线程安全的,但是效率低,不能存储null的key和value。
- LinkedHashMap类继承自HashMap类,但是在底层结构上添加了一对指针,分别指向前一个元素和后一个元素,方便遍历时按照添加的顺序遍历,适合频繁遍历。
- TreeMap类底层使用红黑树存储,按照key自然排序或定制排序。
- Properties类继承自Hashtable类,一般作为配置文件,key和value都是String类型。
- 可以调用Collections.synchronizedMap()返回线程安全的HashMap对象。
import java.util.*;
public class MapTest {
public static void main(String[] args) {
System.out.println("---HashMap---");
Map<String, String> hashMap = new HashMap<>();
hashMap.put(null, null);
hashMap.put("b", null);
hashMap.put("c", "3");
System.out.println(hashMap);
Set<String> keySet = hashMap.keySet();
Collection<String> values = hashMap.values();
Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
System.out.println(keySet);
System.out.println(values);
System.out.println(entrySet);
Map<String, String> map = Collections.synchronizedMap(hashMap);
System.out.println(map);
System.out.println("---Hashtable---");
Map<String, String> hashtable = new Hashtable<>();
hashtable.put("a", "1");
hashtable.put("b", "2");
hashtable.put("c", "3");
System.out.println(hashtable);
System.out.println("---LinkedHashMap---");
LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(null, null);
linkedHashMap.put("b", null);
linkedHashMap.put("c", "3");
System.out.println(linkedHashMap);
System.out.println("---TreeMap---");
TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put("a", "1");
treeMap.put("c", "2");
treeMap.put("b", "3");
System.out.println(treeMap);
System.out.println("---Properties---");
Properties properties = new Properties();
properties.put("a", "1");
properties.put("b", "2");
properties.put("c", "3");
System.out.println(properties);
}
}