Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组用于保存Map里的key,另外一组用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。
Key和value是一一对应的关系,即通过指定的key,总能找到唯一的value对象。Map里的key放在一可以看成一个Set集合,实际上Map中包含了一个keySet()方法,用于返回Map里所有key组成的Set集合。
Map中的所有value放在一起可以看成一个list集合,元素与元素之间可以重复,每个元素可以根据索引来查找。只是Map中的索引不再使用整数值,而是以另外一个对象作为索引。如果需要从Map中取出元素,则需要提供该元素的key索引。
Map接口中定义了如下常用方法:
Map中包含一个内部类Entry,该类封装了一个key-value对。Entry包含了如下方法:
1. HashMap与HashTable
HashMap和Hashtable都是Map的典型实现类,两者之间的关系完全类似于ArrayList和Vector。除此之外两者之间的典型区别:
1、Hashtable是一个线程安全的Map实现,但HashMap是线程不安全。所以HashMap比Hashtable性能更高一点。
2、Hashtable不允许使用null作为key和value,而HashMap则可以。
HashMap的几种便利方法:
System.out.println("forEach便利值************************");
Collection<User> collection = map.values();
for(User user:collection){
System.out.println(user);
}
System.out.println("forEach便利keySet()************************");
Set<String> set = map.keySet();
for(String s:set){
System.out.println(s);
System.out.println(map.get(s));
}
System.out.println("Iterator便利keySet()的迭代器************************");
Iterator<String> iterator = map.keySet().iterator();
while(iterator.hasNext()){
String key = iterator.next();
System.out.println(key);
System.out.println(map.get(key));
}
System.out.println("forEach便利map.entrySet()************************");
Set<Map.Entry<String,User>> entries = map.entrySet();
for(Map.Entry<String,User> entry:entries){
System.out.println(entry.getKey());
if("pig".equals(entry.getKey())){
System.out.println(entry.setValue(new User("肉","46546565",45)));
}
System.out.println(entry.getValue());
}
System.out.println("Iterator便利map.entrySet()的迭代器************************");
Iterator<Map.Entry<String,User>> iterator1 = map.entrySet().iterator();
while(iterator1.hasNext()){
Map.Entry<String,User> entry = iterator1.next();
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
LinkedHashMap是HashMap的子类,同LinkedHashSet一样,LinkedHashMap在存储数据元素时同样使用了链表来维护key-value对的存放顺序,该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序保持一致。
WeakHashMap与HashMap的用法基本相似,区别在于HashMap的key保留了对实际对象的强引用。即:只要HashMap不被销毁,该HashMap的所有key所引用的对象就不会被垃圾回收,HashMap也不会自动删除这些key所对应key-value对。WeakHashMap的key只保留了对实际对象的弱引用,即:WeakHashMap的对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。
2. TreeMap
TreeMap是Map接口的一个实现类,是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序。TreeMap保证所有的key-value对都处于有序的状态。
TreeMap的两种排序方式:
1、自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则抛出ClassCastException(类型转换异常)。
2、定制排序:创建TreeMap对象时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。采用定制排序时不需要key实现Comparable接口。
TreeMap提供的常用方法如下:
3 . EnumMap
EnumMap是一个与枚举类一起使用的Map实现,EnumMap中所有的key都必须是单个枚举类的枚举值。创建EnumMap时必须显示或隐式指定它对应的枚举类。
EnumMap根据key的自然顺序,即在枚举类中的定义顺序来维护key-value对的顺序。调用Map的方法keySet()、entrySet()、values()遍历EnumMap时可以看到这种顺序。
EnumMap不允许使用null作为key,但允许使用null作为value。
创建EnumMap时必须指定一个枚举类,从而与使EnumMap和指定枚举类关联起来。
源代码:
https://github.com/wolf521/demo/tree/master/src/main/java/com/example/demo/collection