• Java中keySet()返回值的排序问题


    上回说到,由于对数据进行处理的时候是按照乱序一行一行的处理,导致并行线程各自占据了一部分数据,谁也不肯释放,从而发生死锁。

    为什么会乱序,是因为取得数据行主键的时候,使用了HashMap.keySet()方法,而这个方法返回的Set结果,里面的数据是乱序排放的。

    JavaDoc里面没有详细地解释,所以用代码进行了一下尝试

    import java.sql.Timestamp;
    import java.util.HashMap;
    import java.util.Hashtable;
    import java.util.Iterator;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;

    public class Test2 {

    /**
    *
    @param args
    */
    public static void main(String[] args) {

    /////////////////////////////////////////////////////////////
    // TEST
    /////////////////////////////////////////////////////////////
    System.out.println("## Hashtable ##");
    Hashtable<String , String> ht = new Hashtable<String , String>();
    ht.put("1", "OOO");
    ht.put("3", "OOO");
    ht.put("2", "OOO");
    ht.put("5", "OOO");
    ht.put("4", "OOO");

    Iterator<String> it = ht.keySet().iterator();
    while (it.hasNext()) {
    System.out.println(it.next());
    }

    /////////////////////////////////////////////////////////////
    // TEST
    /////////////////////////////////////////////////////////////
    System.out.println("## TreeMap ##");
    TreeMap<String , String> tm = new TreeMap<String , String>();
    tm.put("1", "OOO");
    tm.put("3", "OOO");
    tm.put("2", "OOO");
    tm.put("5", "OOO");
    tm.put("4", "OOO");

    Iterator<String> it2 = tm.keySet().iterator();


    while (it2.hasNext()) {
    System.out.println(it2.next());
    }

    /////////////////////////////////////////////////////////////
    // TEST
    /////////////////////////////////////////////////////////////
    System.out.println("## HashMap ##");
    Map<String , String> hm = new HashMap<String , String>();
    hm.put("1", "OOO");
    hm.put("3", "OOO");
    hm.put("2", "OOO");
    hm.put("5", "OOO");
    hm.put("4", "OOO");

    Iterator<String> it3 = hm.keySet().iterator();

    while (it3.hasNext()) {
    System.out.println(it3.next());
    }

    /////////////////////////////////////////////////////////////
    // TEST
    /////////////////////////////////////////////////////////////
    System.out.println("## LinkedHashMap ##");
    LinkedHashMap<String, String> lhm = new LinkedHashMap<String , String>();
    lhm.put("1", "OOO");
    lhm.put("3", "OOO");
    lhm.put("2", "OOO");
    lhm.put("5", "OOO");
    lhm.put("4", "OOO");

    Iterator<String> it4 = lhm.keySet().iterator();

    while (it4.hasNext()) {
    System.out.println(it4.next());
    }
    }

    }

    输出结果如下

    ##  Hashtable  ##
    5
    4
    3
    2
    1
    ## TreeMap ##
    1
    2
    3
    4
    5
    ## HashMap ##
    3
    2
    1
    5
    4
    ## LinkedHashMap ##
    1
    3
    2
    5
    4

    由此可见,大致上如下

      Hashtable.keySet()          降序

      TreeMap.keySet()            升序

      HashMap.keySet()            乱序

      LinkedHashMap.keySet()      原序


    除了TreeMap.keySet(), JavaDoc中对keySet()返回值的顺序没有明确说明,

    实际应用中,如果对顺序有明确要求,最好能明确的对其顺序进行整理。

  • 相关阅读:
    Spring异步调用注解@Async的使用
    maven 打包前 Junit 测试
    windows 访问局域网共享文件
    IBM MQ 集成CXF 发送JMS 消息
    VO、DTO、DO、PO的概念、区别和用处
    myeclipse创建的项目发布不了文档
    js获取jsp上下文地址
    Maven编译时,出现找不到符号
    Cause: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.ibatis.mapping.MappedStatement
    使用IDEA从github中下载fastdfs-client-java
  • 原文地址:https://www.cnblogs.com/csliwei/p/2320674.html
Copyright © 2020-2023  润新知