测试 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
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));
}
}
- 测试结果:
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();
}
}
- 测试结果:
3. 结论
- 虽然在空间复杂度上 entrySet() 略大于 keySet() 方法,但是在时间复杂度上 entrySet() 在处理大量数据时稍快;
4. Map 和 HashMap 的链接