zoukankan      html  css  js  c++  java
  • java集合框架之HashMap

     参考http://how2j.cn/k/collection/collection-hashmap/365.html#nowhere

    HashMap的键值对

    HashMap储存数据的方式是—— 键值对

    package collection;
       
    import java.util.HashMap;
       
    public class TestCollection {
        public static void main(String[] args) {
            HashMap<String,String> dictionary = new HashMap<>();
            dictionary.put("adc", "物理英雄");
            dictionary.put("apc", "魔法英雄");
            dictionary.put("t", "坦克");
             
            System.out.println(dictionary.get("t"));
        }
    }

    键不能重复,值可以重复

    对于HashMap而言,key是唯一的,不可以重复的。
    所以,以相同的key 把不同的value插入到 Map中会导致旧元素被覆盖,只留下最后插入的元素。
    不过,同一个对象可以作为值插入到map中,只要对应的key不一样

    遍历HashMap几种方式

    //第一种:普遍使用,二次取值
     System.out.println("通过Map.keySet遍历key和value:");
     for (String key : map.keySet()) {
      System.out.println("key= "+ key + " and value= " + map.get(key));
     }
      
     //第二种
     System.out.println("通过Map.entrySet使用iterator遍历key和value:");
     Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
     while (it.hasNext()) {
      Map.Entry<String, String> entry = it.next();
      System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
     }
      
     //第三种:推荐,尤其是容量大时
     System.out.println("通过Map.entrySet遍历key和value");
     for (Map.Entry<String, String> entry : map.entrySet()) {
      System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
     }
     
     //第四种
     System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
     for (String v : map.values()) {
      System.out.println("value= " + v);
     }
    }

    查找内容性能比较

    准备一个ArrayList其中存放3000000(三百万个)Hero对象,其名称是随机的,格式是hero-[4位随机数]
    hero-3229
    hero-6232
    hero-9365
    ...
    因为总数很大,所以几乎每种都有重复,把名字叫做 hero-5555的所有对象找出来
    要求使用两种办法来寻找
    1. 不使用HashMap,直接使用for循环找出来,并统计花费的时间
    2. 借助HashMap,找出结果,并统计花费的时间

    package swordOffer;
    
    import java.util.*;
    
    public class test {
        public static void main(String[] args) {
            ArrayList<Hero> arrayList=new ArrayList<>();
            //初始化
            for (int i=0;i<3000000;i++){
                Hero hero=new Hero();
                String str=String.valueOf(Math.random()*9000+1000).substring(0,4);
                hero.setName("hero-"+str);
                arrayList.add(hero);
            }
    
            test(arrayList,"hero-5555");
            testHashMap(arrayList,"hero-5555");
    
        }
    
        private static void test(ArrayList<Hero> arrayList,String key){
    
            long timeBegin=System.currentTimeMillis();
            int count=0;
            for (Hero hero:arrayList){
                if(hero.getName().equals(key)){
                    count++;
                }
            }
            long timeEnd=System.currentTimeMillis();
            System.out.println("没有使用HashMap:ArrayList其中存放3000000(三百万个)Hero对象,其名称是随机的,格式是hero-[4位随机数],把名字叫做 hero-5555的所有对象找出来用时:"+(timeEnd-timeBegin)+"毫秒;共有"+count+"个hero-5555");
        }
    
        private static void testHashMap(ArrayList<Hero> arrayList,String key){
    
            long timeBegin=System.currentTimeMillis();
            HashMap<String,ArrayList<Hero>> resultList=new HashMap<>();
            for (Hero hero:arrayList){
                if(resultList.get(hero.getName())!=null){
                    ArrayList list=resultList.get(hero.getName());
                    resultList.put(hero.getName(),list);
                } 
           list.add(hero);
    } long timeEnd=System.currentTimeMillis(); System.out.println("使用HashMap:ArrayList其中存放3000000(三百万个)Hero对象,其名称是随机的,格式是hero-[4位随机数],把名字叫做 hero-5555的所有对象找出来用时:"+(timeEnd-timeBegin)+"毫秒;共有"+resultList.get(key).size()+"个hero-5555"); } } class Hero { private String name; public Hero(){} public Hero(String name){ name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } class ADHero extends Hero { }

    由此可见,不使用HashMap,只用for循环 比 使用HashMap 快12倍

  • 相关阅读:
    对 Spring IoC 的理解
    初识 Spring 框架
    CSS 全局样式
    Bootstrap 12 栅格系统
    551 闭包,浏览器垃圾回收机制/内存收机制
    550 JavaScript运行机制之“堆栈”
    549 数据类型转换汇总:转换为Number、字符串、布尔,比 较操作==、===,练习题
    547 Promise:Ajax 的串行、并行, Promise的executor和状态,then、catch、finally,then链
    546 变量提升
    545 parseInt解析
  • 原文地址:https://www.cnblogs.com/lijingran/p/9080292.html
Copyright © 2011-2022 走看看