Map集合

来源:互联网 发布:漫画本子在淘宝怎么搜 编辑:程序博客网 时间:2024/06/08 23:53

  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

原创粉丝点击