一般的に言えば、Map はキーと値のペアで構成されるデータ構造であり、各キーはコレクション内で一意です。 Java の Map に関する 9 つの主要な問題を説明するために、キーと値を表す K と V を使用してみましょう。
0. Map を List 型に変換する
Java では、Map インターフェイスは、キー セット、値セット、およびキーと値のセットの 3 つのコレクション取得メソッドを提供します。これらはすべて、コンストラクターまたは addAll() メソッドを通じて List 型に変換できます。次のコードは、Map から ArrayList を構築する方法を示しています。
// key list List keyList = new ArrayList(map.keySet()); // value list List valueList = new ArrayList(map.valueSet()); // key-value list List entryList = new ArrayList(map.entrySet());
1. Entry を通じて Map を走査する
Java でキーと値のペアとして存在するこの方法は、Map.Entry と呼ばれます。 Map.entrySet() はキーと値のセットを返します。これは非常に効率的なトラバーサル メソッドです。
for(Entry entry: map.entrySet()) { // get key K key = entry.getKey(); // get value V value = entry.getValue(); }
イテレーター 特に JDK1.5 より前ではよく使用されます
Iterator itr = map.entrySet().iterator(); while(itr.hasNext()) { Entry entry = itr.next(); // get key K key = entry.getKey(); // get value V value = entry.getValue(); }
2. キーによるマップのソート
ソートには、比較コンパレーターを使用して以下を実現することが必要です。
List list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator() { @Override public int compare(Entry e1, Entry e2) { return e1.getKey().compareTo(e2.getKey()); } });
SortedMap sortedMap = new TreeMap(new Comparator() { @Override public int compare(K k1, K k2) { return k1.compareTo(k2); } }); sortedMap.putAll(map);
これは、前の点と多少似ています:
List list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator() { @Override public int compare(Entry e1, Entry e2) { return e1.getValue().compareTo(e2.getValue()); } });
Test1 では、マップは静的であると宣言しましたが、Test1.map.put(3,"three"); のように、初期化中にその値を変更できます。
Test2 では、内部クラスを渡し、次のように設定します。変更不可能な場合、Test2.map.put(3,"three") を実行すると、
UnsupportedOperationException 异常来禁止你修改。 public class Test1 { private static final Map map; static { map = new HashMap(); map.put(1, "one"); map.put(2, "two"); } } public class Test2 { private static final Map map; static { Map aMap = new HashMap(); aMap.put(1, "one"); aMap.put(2, "two"); map = Collections.unmodifiableMap(aMap); } }
Map インターフェイスには、3 つの実装があります。ハッシュマップ、ツリーマップ、およびハッシュテーブル。
それらは異なります。詳細については、「HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap」の記事を参照してください。
Map にキーと値のペアを追加すると、Map 内のキーと値の間に 1 対 1 の対応があり、1 つのキーが 1 つのキーに対応することになります。価値。ただし、特定の値からキーを見つけるなど、逆クエリが必要になる場合があります。残念ながら、このデータ構造は双方向マップと呼ばれます。
Apache と Guava はこの双方向マップの実装を共同で提供しており、その実装ではキーと値の両方が 1:1 の関係を持つ必要があると規定されています。
Java にはマップをコピーするためのメソッドが多数用意されていますが、それらのメソッドは常に同期されるとは限りません。簡単に言うと、マップが変更されても、コピーされたマップは同じままになります。以下はより効率的な実装方法です:
Map CopyedMap = Collections.synchronizedMap(map);
もちろん、クローン作成という別の方法もあります。ただし、Java の創始者である Josh Bloch は、このアプローチを推奨していません。彼はマップのクローン作成の問題についてインタビューで次のように述べています。クローン メソッドは、人々が本当に必要としているため、多くのクラスで提供されています。しかし、クローン作成には非常に制限があり、多くの場合、不必要な影響が生じます。
8. 空のマップを作成します
このマップが使用できないように設定されている場合は、次の方法で実現できます
map = Collections.emptyMap();
逆に、それを使用する場合は、直接
map = new HashMap( );