zoukankan      html  css  js  c++  java
  • Java——(八)Map之LinkedHashMap、TreeMap、EnumMap实现类

    ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

    1.LinkedHashMap实现类

      LinkedHashMap需要维护意识的插入顺序,因此性能略低于HashMap的性能;但因为它以

    链表来维护内部顺序,所以在迭代访问Map里的全部元素时将有较好的性能。下面示范了

    LinkedHashMap的功能。

     1 import java.util.LinkedHashMap;
     2 
     3 public class LinkedHashMapTest {
     4 
     5     public static void main(String[] args) {
     6 
     7         LinkedHashMap scores = new LinkedHashMap<>();
     8         scores.put("语文", 80);
     9         scores.put("数学", 82);
    10         scores.put("英语", 76);
    11         for (Object key : scores.keySet()) {
    12             System.out.println(key + "--->" + scores.get(key));
    13         }
    14     }
    15 
    16 }

    运行结果:

    语文--->80
    数学--->82
    英语--->76

    2.使用Properties读写属性文件

      Properties类是Hashtable类的子类,该对象在处理文件属性时特别方便。Properties类可以把

    Map对象和属性文件关联起来,从而可以把Map对象中的key—value对写入属性文件中,也可以把属

    性文件的中的“属性名=属性值”加载到Map对象中。由于属性文件里的属性名、属性值只能是字符串类

    型,所以Properties里的key、value都是字符串类型。该类型提供了如下三个方法来修改Properties

    里的key、value值。

    1)String getProperty(String key):获取Properties中指定属性名对应的属性值,类似于Map的

    get(Object key)方法。

    2)getProperty(String key, String defaultValue):该方法与前一个方法基本相似。该方法多一

    个功能,如果Properties中不存在指定的key时,则该方法指定默认值。

    3)Object setProperaty(String key, String value): 设置属性值,类似于Hashtable的put()方法。

    此外,它还提供了两个读写Field文件的方法。

    4)void load(InputStream inStream):从属性文件(以输入流表示)中加载key—value对,把加载

    到的key—value对追加到Properties里。

    5)void store(OutputStream out, String comments):将Properties中的key—value对输出到指定

    的属性文件(以输出流表示)中。

      下面程序示范了Properties类的用法。

     1 import java.io.FileInputStream;
     2 import java.io.FileNotFoundException;
     3 import java.io.FileOutputStream;
     4 import java.io.IOException;
     5 import java.util.Properties;
     6 
     7 
     8 public class PropertiesTest {
     9 
    10     public static void main(String[] args) throws FileNotFoundException, IOException {
    11 
    12         Properties props = new Properties();
    13         //向Properties中添加属性
    14         props.setProperty("uername", "暨雪");
    15         props.setProperty("password", "123456");
    16         //将Properties中的key—value对保存到a.ini文件中
    17         props.store(new FileOutputStream("a.ini"), "comment line");
    18         //新建一个Properties对象
    19         Properties props2 = new Properties();
    20         //向Properties中添加属性
    21         props2.setProperty("age", "20");
    22         //将a.ini文件中的key—value对追加到props2中
    23         props2.load(new FileInputStream("a.ini"));
    24         System.out.println(props2);
    25     }
    26 
    27 }

    运行结果:

    {age=20, password=123456, uername=暨雪}

      程序在当前路径下生成一个a.ini文件,该文件的内容如下:

    #comment line
    #Thu Jun 11 23:53:36 CST 2015
    password=123456
    uername=u66A8u96EA

    3.TreeMap实现类

      TreeMap就是一个红黑树数据结构,每个key—value即作为红黑树的一个节点。TreeMap存储

    key—value对时,需要根据key对节点进行排序。TreeMap可以保证所有的key—value对处于有序

    状态。TreeMap也有两种排序方式。类似TreeSet中判断元素相等的标准,TreeMap中判断两个key

    相等的标准是:两个key通过compareTo()方法返回0,TreeMap即认为这两个key是相等的。重写

    该类的equals()方法和compareTo()方法时应保持一致的返回结果:两个key通过equals()方法比较

    返回true时,它们通过compareTo()方法比较应该返回0,否则TreeMap与Map接口的规则就会冲突。

      以下提供了TreeMap根据key顺序来访问key—value对的方法。

    1)Map.Entry firstEntry():返回该Map中最小key所对应的key—value对,如果该Map为空,则返回null。

    2)Object firstKey():返回该Map中的最小key值,如果该Map为空,则返回null。

    3)Map.Entry lastEntry():返回该Map中最大key值,如果该Map为空或不存在这样的key—value,则都返回null。

    4)Object lastKey():返回该Map中的最大key值,如果该Map为空或不存在这样的key,则都返回null。

    5)Map.Entry higherEntry(Object key):返回该Map中位于key后一位的key值(即大于指定key的最小key值)。

    如果该Map为空,则都返回null。

    6)Object higherKey(Object key):返回该Map中位于key后一位的key值(即大于指定key的最小key值)。

    如果该Map为空或不存在这样的key,则都返回null。

    7)Map.Entry lowerEntry(Object key):返回该Map中位于key前一位的key值(即小于指定key的最大key所对应

    的key—value对)。如果该Map为空或不存在这样的key—value,则都返回null。

    8)Object lowerEntry(Object key):返回该Map中位于key前一位的key值(即小于指定key的最大key值)。如果

    该Map为空或不存在这样的key—value,则都返回null

    9)NavigableMap subMap(Object fromKey, boolean fromInclusive, Object toKey, boolean toInclusive):

    返回该Map的子Map,其key的范围是从fromKey(是否包括取决于第二个参数)到toKey(是否包括取决于第四个参数)。

    10)SrotedMap subMap(Object fromKey, Object toKey):返回该Map的子Map,其key的范围是从fromKey(包括)

    到toKey(不包括)。

    11)SortedMap tailMap(Object fromKey):返回该Map的子Map,其key的范围是大于fromKey(包括)的所有key。

    12)NavigableMap tailMap(Object fromKey, boolean inclsive):返回该Map的子Map,其key范围是大于fromKey

    (是否包括取决于第二个参数)的所有key。

    13)SortedMap headMap(Object toKey):返回该Map的子Map,其key范围是小于fromKey(不包括)的所有key。

    14)NavigableMap headMap(Object toKey, boolean inclusive):返回该Map的子Map,其key范围是大于fromKey

    (是否包括取决于第二个参数)的所有key。

      下面程序示范了TreeMap的基本用法。(自然排序)

     1 import java.util.TreeMap;
     2 
     3 class Rc implements Comparable {
     4     int count;
     5 
     6     public Rc(int count) {
     7         this.count = count;
     8     }
     9 
    10     @Override
    11     public String toString() {
    12 
    13         return "R[count:" + count + "]";
    14     }
    15 
    16     @Override
    17     public boolean equals(Object obj) {
    18         if (this == obj) {
    19             return true;
    20         }
    21         if (obj != null && obj.getClass() == Rc.class) {
    22             Rc r = (Rc) obj;
    23             return r.count == this.count;
    24         }
    25         return false;
    26     }
    27 
    28     @Override
    29     public int compareTo(Object o) {
    30 
    31         Rc r = (Rc) o;
    32         return count > r.count ? 1 : count < r.count - 1 ? -1 : 0;
    33     }
    34 }
    35 
    36 public class TreeMapTest {
    37 
    38     public static void main(String[] args) {
    39         
    40         TreeMap tMap = new TreeMap<>();
    41         tMap.put(new Rc(3), "黑马程序员");
    42         tMap.put(new Rc(-5), "CSDN");
    43         tMap.put(new Rc(9), "传智播客");
    44         System.out.println(tMap);
    45         //返回该TreeMap的第一个Entry对象
    46         System.out.println(tMap.firstEntry());
    47         //返回该TreeMap的最后一个key值
    48         System.out.println(tMap.lastKey());
    49         //返回该TreeMap的比new R(2)大的最小key值
    50         System.out.println(tMap.higherKey(new Rc(2)));
    51         //返回该TreeMap的比new R(2)小的最大的key—value对
    52         System.out.println(tMap.higherEntry(new Rc(2)));
    53         //返回该TreeMap的子TreeMap
    54         System.out.println(tMap.subMap(new Rc(-1), new Rc(5)));
    55     }
    56 
    57 }

    运行结果:

    {R[count:-5]=CSDN, R[count:3]=黑马程序员, R[count:9]=传智播客}
    R[count:-5]=CSDN
    R[count:9]
    R[count:9]
    R[count:9]=传智播客
    {R[count:3]=黑马程序员}

     4.EnumMap实现类

      EnumMap是一个与枚举一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。

    EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效。EnumMap根据key的自然排序(

    即枚举值在枚举类中定义顺序)来维护key—value对的顺序。

      下面程序示范了EnumMap的用法。

     1 import java.util.EnumMap;
     2 
     3 enum Season {
     4     SPRING, SUMMER, FALL, WINRER
     5 }
     6 
     7 public class EnumMapTest {
     8 
     9     public static void main(String[] args) {
    10 
    11         /* 创建一个EnumMap对象,该EnumMap的所有key必须是Season枚举类的枚举值 */
    12         EnumMap enumMap = new EnumMap<>(Season.class);
    13         enumMap.put(Season.SUMMER, "夏日炎炎");
    14         enumMap.put(Season.SPRING, "春暖花开");
    15         System.out.println(enumMap);
    16     }
    17 
    18 }

    运行结果:

    {SPRING=春暖花开, SUMMER=夏日炎炎}

      上面程序创建该EnumMap对象是指定它的key只能是Season枚举类的枚举值。如果该

    EnumMap中添加两个key—value对后,这两个key—value对将会以Season枚举值的自然

    顺序排序。

  • 相关阅读:
    扁鹊见蔡桓公
    月出
    TypeScript 基本类型
    随机漂浮图片广告实例代码
    js实现的随机颜色实例代码
    初识JavaScript 变量, 操作符, 数组
    HTML5的新结构标签
    14款超时尚的HTML5时钟动画
    CSS如何设置div半透明效果
    Google Doodle 2015圣诞版背后的故事与十年圣诞回顾
  • 原文地址:https://www.cnblogs.com/xiongxuesong/p/4570649.html
Copyright © 2011-2022 走看看