HashMapを巡る2つの方法と効率
4757 ワード
1つ目:Mapmap=new HashMap()Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); } 効率がいいので、これからは必ずこの方法を使います!2つ目:Mapmap=new HashMap()Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { Object key = iter.next(); Object val = map.get(key); } 効率が悪いので、これからはなるべく使わないようにしましょう.例:HashMapの遍歴には2つの一般的な方法があります.それはkeysetとentrysetを使用して遍歴することですが、両者の遍歴速度には違いがあります.次に例を見てください.public class HashMapTest{public static void main(String[]args)…{HashMap hashmap=new HashMap();for(int i=0;i<1000;i)…{hashmap.put(","i,"thanks"); } long bs = Calendar.getInstance().getTimeInMillis(); Iterator iterator = hashmap.keySet().iterator(); while (iterator.hasNext()) ...{ System.out.print(hashmap.get(iterator.next())); } System.out.println(); System.out.println(Calendar.getInstance().getTimeInMillis() - bs); listHashMap(); } public static void listHashMap() ...{ java.util.HashMap hashmap = new java.util.HashMap(); for (int i = 0; i < 1000; i ) ...{ hashmap.put(""i, "thanks"); }long bs=Calendar.getInstance().gettimeInMillis();java.util.Iterator it=hashmap.entrySet().iterator();while(it.hasNext()…{java.util.Map.Entry=(java.util.Map.Entry)it.next();//entry.getKey()このアイテムに対応するキー//entry.getValue()を返し、このアイテムに対応する値System.out.printを返します(entry.getValue()); } System.out.println(); System.out.println(Calendar.getInstance().getTimeInMillis() - bs); } } keySetについては実際には2回、1回はiteratorに移行し、1回はhashmapからkeyの対するvalueを取り出した.entrysetは1回目だけで、keyとvalueをentryに入れたので、速くなった.keysetが速いのかentrysetが速いのか、この例は出力が多すぎて効果に影響し、例を変えた.
Javaコード
public class HashMapTest { private static int MAXKEY = 1234567; public static void main(String[] args) { HashMap hashmap = new HashMap(); for (int i = 0; i < HashMapTest.MAXKEY; i++) { hashmap.put(i, "thanks"); } long bs = Calendar.getInstance().getTimeInMillis(); Iterator iterator = hashmap.keySet().iterator(); while (iterator.hasNext()) { Object key = iterator.next(); Object value = hashmap.get(key); } System.out.print(Calendar.getInstance().getTimeInMillis() - bs + ","); listHashMap(); } public static void listHashMap() { HashMap hashmap = new java.util.HashMap(); for (int i = 0; i < HashMapTest.MAXKEY; i++) { hashmap.put(i, "thanks"); } long bs = Calendar.getInstance().getTimeInMillis(); Iterator it = hashmap.entrySet().iterator(); Map.Entry entry; while (it.hasNext()) { entry = (java.util.Map.Entry) it.next(); Object key = entry.getKey(); Object value = entry.getValue(); //Object value = hashmap.get(key); } System.out.print(Calendar.getInstance().getTimeInMillis() - bs); } }
//**先に測定し、iが1234567の場合、出力63,47,47,47,63,47を3回測定しました*コードを変更し、listHashMapメソッドのwhileサイクルで、Object value=hashmap.get(key)*再測定、63、79、47、78、63、79の3回*/keySetはentrySetより遅いですか?keySetは初めてすべてのkeyを遍歴し、entrySetは初めてすべてのkeyとvalueを遍歴し、このステップは明らかにentrySetが遅くなり、次のステップを見ます.iteratorの後、keySetのnext()はkey、entrySetのnext()はMap.Entry(keyとvalueを含む).コード変更後のテストではentrySetのgetValue()がMapのget()より確かに速い(内部がどのような原理で実現されているのかは分からないが、Mapのget()消費が少ないと言われているが).もちろん、変更後のコードを使う理由はなく、誤解しないでください.そこで、entrySet()早く、初めて手に入れたkeyとvalueを同時に手に入れるのに多くの時間を奪って帰ってきたようですが、key順にソートするとkeySetのほうが便利そうです.
Javaコード
Object[] key_arr = hashmap.keySet().toArray(); Arrays.sort(key_arr); for (Object key : key_arr) { Object value = hashmap.get(key); }
Javaコード
public class HashMapTest { private static int MAXKEY = 1234567; public static void main(String[] args {
//**先に測定し、iが1234567の場合、出力63,47,47,47,63,47を3回測定しました*コードを変更し、listHashMapメソッドのwhileサイクルで、Object value=hashmap.get(key)*再測定、63、79、47、78、63、79の3回*/keySetはentrySetより遅いですか?keySetは初めてすべてのkeyを遍歴し、entrySetは初めてすべてのkeyとvalueを遍歴し、このステップは明らかにentrySetが遅くなり、次のステップを見ます.iteratorの後、keySetのnext()はkey、entrySetのnext()はMap.Entry(keyとvalueを含む).コード変更後のテストではentrySetのgetValue()がMapのget()より確かに速い(内部がどのような原理で実現されているのかは分からないが、Mapのget()消費が少ないと言われているが).もちろん、変更後のコードを使う理由はなく、誤解しないでください.そこで、entrySet()早く、初めて手に入れたkeyとvalueを同時に手に入れるのに多くの時間を奪って帰ってきたようですが、key順にソートするとkeySetのほうが便利そうです.
Javaコード