HashMap集合迭代的几种方式以及效率比较

public class ArrayListDemo {
    private static class Person{
        private int id;
        private String name;

        public Person(int id, String name) {
            this.id = id;
            this.name = name;
        }
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()){
                return false;
            }
            Person person = (Person) o;
            //两个对象是否等值,通过id 和 name来确定
            return this.id == person.id && name.equals(name);
        }

        @Override public int hashCode() {
            return Objects.hash(id, name);
        }

        @Override public String toString() {
            return "Person{" + "id=" + id + ", name='" + name + '\'' + '}';
        }
    }
    public static void main(String []args){
        HashMap<Person,String> map = new HashMap<Person, String>();
        for(int i = 0; i < 4000000; i ++){
            map.put(new Person(i+1,"key_" + i),"value_" + i);
        }

        long methodStart1 = System.currentTimeMillis();
        //取出元素键 找值方式, 这种方式是遍历key,根据key获取映射的vlaue,需要大量调用get(),效率肯定不高
        //建议在数据量较大时不用此方式遍历hashMap
        Set<Person> keySet = map.keySet();
        for(Person person : keySet){
            String value = map.get(person);
//            System.out.println(person.toString() + " ..... " + value);
        }
        long methodEnd1 = System.currentTimeMillis();
        System.out.println("方法一使用的时间统计为 : " +  (methodEnd1 - methodStart1));

        System.out.println(" ---------------------------------------------------- ");

        long methodStart2 = System.currentTimeMillis();
        //取出元素键值对方式
        Set<Map.Entry<Person,String>> entrySet = map.entrySet();
        for (Map.Entry<Person, String> entry : entrySet){
            Person key = entry.getKey();
            String value = entry.getValue();
//            System.out.println(key.toString() + " ..... " + value);
        }
        long methodEnd2 = System.currentTimeMillis();
        System.out.println("方法二使用的时间统计为 : " +  (methodEnd2 - methodStart2));

        System.out.println(" ---------------------------------------------------- ");

        long methodStart3 = System.currentTimeMillis();
        Iterator<Person> keys = map.keySet().iterator();
        while (keys.hasNext()) {
            Person key = keys.next();
            String value = map.get(key);
//            System.out.println(key.toString() + " ..... " + value);
        }
        long methodEnd3 = System.currentTimeMillis();
        System.out.println("方法三使用的时间统计为 : " +  (methodEnd3 - methodStart3));

        System.out.println(" ---------------------------------------------------- ");

        long methodStart4 = System.currentTimeMillis();
        Iterator<Map.Entry<Person, String>> entryIt = map.entrySet().iterator();
        while(entryIt.hasNext()){
            Map.Entry<Person, String> entry = entryIt.next();
            Person key = entry.getKey();
            String value = entry.getValue();
            //            System.out.println(key.toString() + " ..... " + value);
        }
        long methodEnd4 = System.currentTimeMillis();
        System.out.println("方法四使用的时间统计为 : " +  (methodEnd4 - methodStart4));
    }
}


//经过试验,发现大数据量的情况下,四者之间的差距还是非常明显的,方法二和方法四的效率明显比其他方式高,推荐使用
方法一使用的时间统计为 : 724
 ---------------------------------------------------- 
方法二使用的时间统计为 : 188
 ---------------------------------------------------- 
方法三使用的时间统计为 : 3664
 ---------------------------------------------------- 
方法四使用的时间统计为 : 195

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值