Java 测试 HashMap 的两种遍历方法


测试 HashMap 的两种遍历方法

  • HashMap 有两种遍历方法,即键找值或键值对,都是先转变为集合:
  • 键找值遍历:Set<K> set = map.keySet();for(K key.set){Value = map.get(key);}
  • 键值对遍历:Set<Map.Entry<K,V>> entries = map.entrySet();for(Map.Entry<K,V> entries : entries){Key = map.getKey(); Value = map.getValue();},Entry 是 Map 的内部接口,是 Map 中存储的数据类型(key = value);

1. Junit

  • 用 IDEA 自带的 Junit plugin:
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test {

    static HashMap<Object,Object> map = new HashMap<>();
    static {
        int n = 100_000;
        for(int i=0;i<n;i++) {
            map.put(new Object(), null);
        }
        System.out.println("map元素个数:"+(n/10000)+"万");
    }

    @Test
    public void testKeySet(){
        long t1 = System.currentTimeMillis();
        Set<Object> keys = map.keySet();
        for (Object key : keys) {
            Object value = map.get(key);
        }
        long t2 = System.currentTimeMillis();
        System.out.println("KeySet耗时:"+(t2-t1));
    }

    @Test
    public  void testEntrySet(){
        long t1 = System.currentTimeMillis();
        Set<Map.Entry<Object, Object>> entries = map.entrySet();
        for (Map.Entry<Object, Object> entry : entries) {
            Object key = entry.getKey();
            Object value = entry.getValue();
        }
        long t2 = System.currentTimeMillis();
        System.out.println("EntrySet耗时:"+(t2-t1));
    }
}
  • 测试结果:
    1

2. main() 方法

  • 目标方法类:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test2 {
    static HashMap<Object,Object> map = new HashMap<>();
    static {
        int n = 100_000;
        for(int i=0;i<n;i++) {
            map.put(new Object(), null);
        }
        System.out.println("map元素个数:"+(n/10000)+"万");
    }
    public void testKeySet(){
        long t1 = System.currentTimeMillis();
        Set<Object> keys = map.keySet();
        for (Object key : keys) {
            Object value = map.get(key);
        }
        long t2 = System.currentTimeMillis();
        System.out.println("KeySet耗时:"+(t2-t1));
    }

    public  void testEntrySet(){
        long t1 = System.currentTimeMillis();
        Set<Map.Entry<Object, Object>> entries = map.entrySet();
        for (Map.Entry<Object, Object> entry : entries) {
            Object key = entry.getKey();
            Object value = entry.getValue();
        }
        long t2 = System.currentTimeMillis();
        System.out.println("EntrySet耗时:"+(t2-t1));
    }
}
  • 测试类:
public class Test {
    public static void main(String[] args){
        Test2 t = new Test2();
        t.testEntrySet();
        t.testKeySet();
    }
}
  • 测试结果:
    21
    22

3. 结论

  • 虽然在空间复杂度上 entrySet() 略大于 keySet() 方法,但是在时间复杂度上 entrySet() 在处理大量数据时稍快;

4. Map 和 HashMap 的链接

发布了242 篇原创文章 · 获赞 244 · 访问量 9612

猜你喜欢

转载自blog.csdn.net/Regino/article/details/104829687
今日推荐