1.HashMap
注:キーの一意性を確認してください
文字列などの既存の型はhashCodeメソッドとequalsメソッドを書き換えているため、これらの既存の型をキー型として使用する場合は、書き換える必要はありません。
1.値としてカスタムタイプを使用します:
private static void show01() { // 首先创建HashMap集合 HashMap<String,Person> map = new HashMap<>(); // 往集合中添加元素 map.put("北京",new Person("张三",18)); map.put("上海",new Person("李四",19)); map.put("广州",new Person("王五",20)); map.put("北京",new Person("赵六",18)); // key重复,新的value替换旧的 // 使用keySet方法取出所有key放进set里,foreach遍历 Set<String> set = map.keySet(); for (String str:set) { System.out.println(str + "-->" + map.get(str).toString()); } }
スクリーンショットを実行します。
2.カスタムタイプをキーとして使用します。
一意性を確保する必要があり、hashCodeメソッドとequalsメソッドを書き直します
例えば:
private static void show02() { HashMap<Person,String> map = new HashMap<>(); // 往集合中添加元素 map.put(new Person("张三",18),"北京"); map.put(new Person("李四",19),"上海"); map.put(new Person("王五",20),"广州"); // 姓名,年龄相同,视为key重复,应将value替换 map.put(new Person("张三",18),"武汉"); // 使用EntrySet方法获得由map所有键值对组成的set集合 // 此处是内部类写法 Set<Map.Entry<Person,String>> set = map.entrySet(); // 迭代器遍历 Iterator<Map.Entry<Person,String>> iterator = set.iterator(); while(iterator.hasNext()){ // 先获得entry对象,避免next超出范围 Map.Entry<Person,String> entry = iterator.next(); // 由entry对象的getKey方法和getValue方法获得键值 System.out.println(entry.getKey().toString() + "-->" + entry.getValue()); } }
現時点では、hashCodeメソッドとequalsメソッドは書き換えられていません。名前と年齢が同じであるというルールの場合、キーは同じと見なされ、最後のキーを置き換える必要がありますが、ありません。
スクリーンショットを実行します。
このカスタムクラスのhashCodeメソッドとequalsメソッドを書き直すと、次のようになります。
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); }
スクリーンショットを実行します。
二.LinkedHashMap
LinkedHashMapはHashMapのサブクラスです。HashMapはペア要素の一意性を保証し、クエリ速度は非常に高速ですが、ペア要素は順序なしで格納されるため、前に学習したLinkedHashSetと同様に、リンクを使用して順序を確認する必要があります。リスト+ハッシュテーブル構造、リンクリストの保存順序関連情報。
/ * 基本原則 ハッシュテーブル+リンクリスト(記録要素の順序) * / public class DemoL09LinkedHashMap { public static void main(String [] args){ HashMap <String、String> hashMap = new HashMap <>(); //注要素を格納するときのマップとリストの違い: hashMap.put( "aaa"、 "AAA"); hashMap.put( "ddd"、 "DDD"); hashMap.put( "ccc"、 "CCC" ); ); //順序を シャッフルしますhashMap.put( "bbb"、 "BBB"); // {aaa = AAA、ccc = CCC、bbb = BBB、ddd = DDD} //一貫性のないアクセス順序 System.out.println( hashMap); LinkedHashMap <String、String> linkedHashMap = new LinkedHashMap <>(); linkedHashMap.put( "aaa "、" AAA "); linkedHashMap.put(" ddd "、" DDD "); linkedHashMap.put( "ccc"、 "CCC"); //順序をする linkedHashMap.put( "bbb"、 "BBB"); // {aaa = AAA、ddd = DDD、ccc = CCC、bbb = BBB} //アクセスシーケンスは同じ System.out.println(linkedHashMap); } }
スクリーンショットを実行します。