zoukankan      html  css  js  c++  java
  • LinkedHashMap与HashMap的使用比较

      现在由于项目需要,使用了LinkedHashMap,一开始由于很少用到Map,然后就直接使用了HashMap,在将数据成功存入之后取出来就出了问题,数据输出顺序没有按预期顺序输出,现在先看代码:

    文件内容(I0122120140811.chk):

    I01221 |34622511 |10317392891 |12
    

      

    使用HashMap:

    package com.src.test.FTP;
     
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Map.Entry;
     
    import com.asiainfo.test.BufferedReader.FileParsing;
     
    import junit.framework.TestCase;
     
    public class FileParsingTest extends TestCase {
        public void testBufferReader() throws FileNotFoundException {
            FileReader fileReader = new FileReader("D:\Asiainfo\test\I0122120140811.chk");
            FileParsing fParsing = new FileParsing();
            Map<String, String> testHashMap = new HashMap<String, String>();
            testHashMap = fParsing.fileParsing(fileReader);
            for(Entry<String, String> entry : testHashMap.entrySet()) {
                System.out.print(entry.getKey()+"_");   //获取键
                System.out.println(entry.getValue());   //获取值
            }
             
        }
    }
    

      

    使用LinkedHashMap:

    package com.src.test.FTP;
     
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Map.Entry;
     
    import com.asiainfo.test.BufferedReader.FileParsing;
     
    import junit.framework.TestCase;
     
    public class FileParsingTest extends TestCase {
        public void testBufferReader() throws FileNotFoundException {
            FileReader fileReader = new FileReader("D:\Asiainfo\test\I0122120140811.chk");
            FileParsing fParsing = new FileParsing();  
            Map<String, String> testLinkedHashMap = new LinkedHashMap<String, String>();
            testLinkedHashMap = fParsing.fileParsing(fileReader);
            for(Entry<String, String> entry : testLinkedHashMap.entrySet()) {
                System.out.print(entry.getKey()+"_");   //获取键
                System.out.println(entry.getValue());   //获取值
            }
        }
    }
    

      

    运行结果:

    ******************************HashMap******************************

    fileSize_10317392891 
    recordCount_34622511 
    interNo_I01221 
    fileCount_12
    

      

    ***************************LinkedHashMap****************************

    interNo_I01221 
    recordCount_34622511 
    fileSize_10317392891 
    fileCount_12
    

      

    结果说明:

        可以看出来,LinkedHashmap put进去的对象位置未发生变化,而HashMap会发生变化。

     

    详细分析:

        Java为数据结构中的映射定义了一个接口java.util.Map;

        它有四个实现类,分别是HashMap, Hashtable, LinkedHashMap, TreeMap.

        Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。
        Hashmap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

        Hashtable与HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。

        LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

        TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。

        一般情况下,我们用的最多的是HashMap,在Map中插入、删除和定位元素,HashMap是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列。

      


    本文出自 “Forever Love” 博客,转载请务必保留此出处http://www.cnblogs.com/dwf07223/p/3999156.html

    博客地址: http://www.cnblogs.com/dwf07223,本文以学习、研究和分享为主,欢迎转载,转载请务必保留此出处。若本博文中有不妥或者错误处请不吝赐教。

  • 相关阅读:
    Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
    Luogu 1314 【NOIP2011】聪明的质检员 (二分)
    Luogu 1315 【NOIP2011】观光公交 (贪心)
    Luogu 1312 【NOIP2011】玛雅游戏 (搜索)
    Luogu 1525 【NOIP2010】关押罪犯 (贪心,并查集)
    Luogu 1514 引水入城 (搜索,动态规划)
    UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)
    Luogu 1437 [HNOI2004]敲砖块 (动态规划)
    Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)
    HDU 1176 免费馅饼 (动态规划)
  • 原文地址:https://www.cnblogs.com/dwf07223/p/3999156.html
Copyright © 2011-2022 走看看