Test case
Map<String,String> map1 =new HashMap<String,String>();
String key1,value1;
for(int i=1;i<=1000000;i++){
key1 = ""+i;
value1="value"+i;
map1.put(key1,value1);
}
Map<String,String> map2 = new HashMap<String,String>();
String key2,value2;
for(int i=1;i<=1000000;i++){
key2=""+(i*50);
value2="value"+key2;
map2.put(key2,value2);
}
testing scenarios
Traverse key+value at the same time
keySet uses Iterator to traverse
public static long keySet_Iterator(Map<String, String> map) {
long startTime1 =System.currentTimeMillis();
Iterator<String> iter = map.keySet().iterator();
while (iter.hasNext()){
key=iter.next();
value=map.get(key);
}
long endTime1 =System.currentTimeMillis();
return endTime1-startTime1;
}
keySet uses for to traverse
public static long keySet_for(Map<String, String> map) {
long startTime2 =System.currentTimeMillis();
for(String key3:map.keySet()){
value=map.get(key3);
}
long endTime2 =System.currentTimeMillis();
return endTime2-startTime2;
}
entrySet uses Iterator to traverse
public static long entrySet_Iterator(Map<String, String> map) {
long startTime3=System.currentTimeMillis();
Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
Map.Entry<String,String> entry3;
while (iter3.hasNext()){
entry3 = iter3.next();
key = entry3.getKey();
value=entry3.getValue();
}
long endTime3 =System.currentTimeMillis();
return endTime3-startTime3;
}
entrySet uses for to traverse
public static long entrySet_for(Map<String, String> map) {
long startTime4=System.currentTimeMillis();
for(Map.Entry<String,String> entry4:map.entrySet()){
key=entry4.getKey();
value=entry4.getValue();
}
long endTime4 =System.currentTimeMillis();
return endTime4-startTime4;
}
Only traverse the key
keySet uses Iterator to traverse
public static long keySet_Iterator(Map<String, String> map) {
long startTime1 =System.currentTimeMillis();
Iterator<String> iter = map.keySet().iterator();
while (iter.hasNext()){
key=iter.next();
}
long endTime1 =System.currentTimeMillis();
return endTime1-startTime1;
}
keySet uses for to traverse
public static long keySet_for(Map<String, String> map) {
long startTime2 =System.currentTimeMillis();
for(String key3:map.keySet()){
}
long endTime2 =System.currentTimeMillis();
return endTime2-startTime2;
}
entrySet uses Iterator to traverse
public static long entrySet_Iterator(Map<String, String> map) {
long startTime3=System.currentTimeMillis();
Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
Map.Entry<String,String> entry3;
while (iter3.hasNext()){
key = iter3.next().getKey();
}
long endTime3 =System.currentTimeMillis();
return endTime3-startTime3;
}
entrySet uses for to traverse
public static long entrySet_for(Map<String, String> map) {
long startTime4=System.currentTimeMillis();
for(Map.Entry<String,String> entry4:map.entrySet()){
key=entry4.getKey();
}
long endTime4 =System.currentTimeMillis();
return endTime4-startTime4;
}
Only traverse value
keySet uses Iterator to traverse
public static long keySet_Iterator(Map<String, String> map) {
long startTime1 =System.currentTimeMillis();
Iterator<String> iter = map.keySet().iterator();
while (iter.hasNext()){
value=map.get(iter.next());
}
long endTime1 =System.currentTimeMillis();
return endTime1-startTime1;
}
keySet uses for to traverse
public static long keySet_for(Map<String, String> map) {
long startTime2 =System.currentTimeMillis();
for(String key3:map.keySet()){
value=map.get(key2);
}
long endTime2 =System.currentTimeMillis();
return endTime2-startTime2;
}
entrySet uses Iterator to traverse
public static long entrySet_Iterator(Map<String, String> map) {
long startTime3=System.currentTimeMillis();
Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
Map.Entry<String,String> entry3;
while (iter3.hasNext()){
value=iter3.next().getValue();
}
long endTime3 =System.currentTimeMillis();
return endTime3-startTime3;
}
entrySet uses for to traverse
public static long entrySet_for(Map<String, String> map) {
long startTime4=System.currentTimeMillis();
for(Map.Entry<String,String> entry4:map.entrySet()){
value=entry4.getValue();
}
long endTime4 =System.currentTimeMillis();
return endTime4-startTime4;
}
Values are traversed using iterator
public static values_Iterator(Map<String, String> map) {
long startTime5=System.currentTimeMillis();
Iterator<String> iter5=map.values().iterator();
while (iter5.hasNext()){
value=iter5.next();
}
long endTime5 =System.currentTimeMillis();
return endTime5-startTime5;
}
values use for traversal
public static values_for(Map<String, String> map) {
long startTime6=System.currentTimeMillis();
for(String value6:map.values()){
}
long endTime6 =System.currentTimeMillis();
return endTime6-startTime6;
}
Test Results
Traverse key+value at the same time
Traverse key+value at the same time |
Small amount of data |
Big amount of data |
keySet uses Iterator to traverse |
124ms |
126ms |
keySet uses for to traverse |
105ms |
113ms |
entrySet uses Iterator to traverse |
80ms |
100ms |
entrySet uses for to traverse |
78ms |
103ms |
Only traverse the key
Only traverse the key |
Small amount of data |
Big amount of data |
keySet uses Iterator to traverse |
97ms |
118ms |
keySet uses for to traverse |
93ms |
114ms |
entrySet uses Iterator to traverse |
95ms |
115ms |
entrySet uses for to traverse |
95ms |
113ms |
Only traverse value
Only traverse value |
Small amount of data |
Big amount of data |
keySet uses Iterator to traverse |
125ms |
146ms |
keySet uses for to traverse |
114ms |
140ms |
entrySet uses Iterator to traverse |
102ms |
120ms |
entrySet uses for to traverse |
104ms |
121ms |
Values are traversed using iterator |
97ms |
124ms |
values use for traversal |
107ms |
114ms |
summary
- When the key of the map is in a simple form and a complex form, the search efficiency is different, and the simple key value is more efficient
- When the amount of data is large, the efficiency of using entrySet to traverse key+value is higher than that of keySet
This is why "you recommend using entrySet, thinking that entrySet is faster for searching large amounts of data"
- When we only need to get the value value, using values to traverse is more efficient