zoukankan      html  css  js  c++  java
  • java集合框架 hashMap 简单使用

     参考文章:http://blog.csdn.net/itm_hadf/article/details/7497462

    通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。
          加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。
          在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。


    如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。 

    public class HashMapTest {  
        public static void main(String[] args) {  
              
            HashMap<String,String> keySetMap = new HashMap<String,String>();  
            HashMap<String,String> entrySetMap=new HashMap<String,String>();  
              
            for (int i= 0;i<1000;i++) {  
                keySetMap.put(""+i, "keySet");  
            }  
            for(int i=0;i<1000;i++){  
                entrySetMap.put(""+i,"entrySet");  
            }  
              
            long startTimeOne = System.currentTimeMillis();  
            <strong><span style="color:#ff0000;">Iterator<String> keySetIterator = keySetMap.keySet().iterator();  
            while (keySetIterator.hasNext()) {  
                System.out.println(</span><span style="color:#000099;">keySetMap.get(keySetIterator.next())</span><span style="color:#ff0000;">);  
            }</span></strong>  
            System.out.println("keyset遍历时间-------------------------------:"+(System.currentTimeMillis()-startTimeOne));  
              
            long startTimeTwo=System.currentTimeMillis();  
            Iterator<Entry<String,String>> entrySetIterator=entrySetMap.entrySet().iterator();  
            while(entrySetIterator.hasNext()){  
                Entry<String,String> entry=entrySetIterator.next();  
                System.out.println(entry.getValue());  
            }  
            System.out.println("entryset遍历时间---------------------------:"+(System.currentTimeMillis()-startTimeTwo));  
        }  
    }  

    通过多次运行测试发现,entryset遍历时间比keyset遍历时间短许多,entryset方式的性能通常要比keyset方式高一倍。

    正确的使用HashMap


    1:不要在并发场景中使用HashMap
               HashMap是线程不安全的,如果被多个线程共享的操作,将会引发不可预知的问题,
       据sun的说法,在扩容时,会引起链表的闭环,在get元素时,就会无限循环,后果是cpu100%。

    2:如果数据大小是固定的,那么最好给HashMap设定一个合理的容量值
             根据上面的分析,HashMap的初始默认容量是16,默认加载因子是0.75.
    也就是说,如果采用HashMap的默认构造函数,
           当增加数据时,数据实际容量超过10*0.75=12时,HashMap就扩容,扩容带来一系列的运算.新建一个是原来容量2倍的数组,对原有元素全部重新哈希,如果你的数据有几千几万个,而用默认的HashMap构造函数,那结果是非常悲剧的,因为HashMap不断扩容,不断哈希,在使用HashMap的场景里,不会是多个线程共享一个HashMap,除非对HashMap包装并同步,由此产生的内存开销和cpu开销在某些情况下可能是致命的。

  • 相关阅读:
    微信小程序中的iPhone X适配问题
    微信小程序例子-保存图片到手机相册
    微信小程序客服消息使用指南
    移动APP 微信支付完整过程(wxPay 方案一)
    promise原理及使用方法
    apicloud UISearchBar 使用方法
    数据库死锁及解决方法
    js replace使用及正则表达式使用
    POI Workbook接口和HSSFWorkbook对象和XSSFWorkbook对象操作相应excel版本
    HSSFWorkbook 模版使用
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6485112.html
Copyright © 2011-2022 走看看