テストケース
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);
}
テストシナリオ
キーと値を同時にトラバースします
keySetはイテレータを使用してトラバースします
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はをトラバースするために使用します
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はIteratorを使用してトラバースします
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はをトラバースするために使用します
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;
}
キーをトラバースするだけ
keySetはイテレータを使用してトラバースします
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はをトラバースするために使用します
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はIteratorを使用してトラバースします
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はをトラバースするために使用します
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;
}
トラバース値のみ
keySetはイテレータを使用してトラバースします
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はをトラバースするために使用します
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はIteratorを使用してトラバースします
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はをトラバースするために使用します
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;
}
値はイテレータを使用してトラバースされます
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;
}
トラバーサルに使用する値
public static values_for(Map<String, String> map) {
long startTime6=System.currentTimeMillis();
for(String value6:map.values()){
}
long endTime6 =System.currentTimeMillis();
return endTime6-startTime6;
}
試験結果
キーと値を同時にトラバースします
キーと値を同時にトラバースします |
少量のデータ |
大量のデータ |
keySetはイテレータを使用してトラバースします |
124ms |
126ms |
keySetはをトラバースするために使用します |
105ms |
113ms |
entrySetはIteratorを使用してトラバースします |
80ms |
100ms |
entrySetはをトラバースするために使用します |
78ms |
103ms |
キーをトラバースするだけ
キーをトラバースするだけ |
少量のデータ |
大量のデータ |
keySetはイテレータを使用してトラバースします |
97ms |
118ms |
keySetはをトラバースするために使用します |
93ms |
114ms |
entrySetはIteratorを使用してトラバースします |
95ms |
115ms |
entrySetはをトラバースするために使用します |
95ms |
113ms |
トラバース値のみ
トラバース値のみ |
少量のデータ |
大量のデータ |
keySetはイテレータを使用してトラバースします |
125ms |
146ms |
keySetはをトラバースするために使用します |
114ms |
140ms |
entrySetはIteratorを使用してトラバースします |
102ms |
120ms |
entrySetはをトラバースするために使用します |
104ms |
121ms |
値はイテレータを使用してトラバースされます |
97ms |
124ms |
トラバーサルに使用する値 |
107ms |
114ms |
概要
- マップのキーが単純な形式と複雑な形式の場合、検索効率が異なり、単純なキー値の方が効率的です。
- データ量が多い場合、entrySetを使用してkey + valueをトラバースする効率は、keySetよりも高くなります。
これが、「entrySetは大量のデータを検索する方が速いと考えて、entrySetを使用することをお勧めします」という理由です。
- 値の値を取得するだけでよい場合は、値を使用してトラバースする方が効率的です