HashMapを使用してカスタムタイプのキー値を保存します(LinkedHashMapパーツの説明を含む)

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); 
    } 
}

スクリーンショットを実行します。

 

おすすめ

転載: blog.csdn.net/wardo_l/article/details/114039739