Rumah  >  Artikel  >  Java  >  Bagaimana untuk mengubah suai nilai dalam Hashmap berdasarkan nilai utama dalam Java

Bagaimana untuk mengubah suai nilai dalam Hashmap berdasarkan nilai utama dalam Java

王林
王林ke hadapan
2023-05-13 14:25:063247semak imbas

    Ubah suai nilai Hashmap mengikut nilai kunci

    Jika tiada kunci dalam peta asal, ia akan dibuat Jika ada a kunci dalam peta asal, ia akan ditimpa dengan nilai Nilai

    map.put(key,value);

    Pelaksanaan ini menambah satu kepada nilai asal (dengan syarat terdapat kunci ini)

    map.put(key,map.get(key)+1);

    Yang berikut boleh mendapatkan nilai yang sepadan dengan kunci. Jika tidak, anda boleh mengembalikan nilai lalai

    map.getOrDefault(key,value);

    Bolehkah nilai diperoleh dengan betul selepas kekunci HashMap ditukar?

    Satu siri pasangan nilai kunci yang disimpan dalam HashMap, yang kuncinya ialah jenis tersuai. Selepas memasukkannya ke dalam HashMap, kami menukar atribut kunci tertentu secara luaran, dan kemudian kami menggunakan kunci ini untuk mengeluarkan elemen daripada HashMap Apakah yang akan dikembalikan oleh HashMap pada masa ini?

    Jawapan daripada beberapa orang di pejabat kami adalah tidak konsisten. Ada yang mengatakan ia kembali batal, dan ada yang mengatakan ia boleh mengembalikan nilai seperti biasa. Tetapi apa pun jawapannya, tiada alasan kukuh. Saya fikir soalan ini agak menarik, jadi saya menulis ujian kod. Hasilnya adalah batal. Perlu diingat bahawa kelas tersuai kami mengatasi kaedah hashCode. Saya fikir keputusan ini agak tidak dijangka, kerana kita tahu bahawa HashMap menyimpan jenis rujukan, dan kami mengemas kini kunci di luar, yang bermaksud bahawa kunci dalam HashMap juga dikemas kini, yang bermaksud bahawa nilai pulangan Kod hash kunci ini juga akan berlaku . Pada masa ini, hashCode kunci dan HashMap mestilah sama dengan hashCode elemen, dan sama pasti akan kembali benar, kerana ia adalah objek yang sama, jadi mengapa ia tidak dapat mengembalikan nilai yang betul?

    Kes Ujian

    Terdapat 2 kes di sini, satu ialah kelas Orang, dan satu lagi ialah kelas Pelajar Mari sahkan pandangan di atas (dengan kesimpulan):

    • Sama ada mengubah suai atribut objek akan menukar kod cincangnya => Ya

    • Sama ada nilai akan dipengaruhi oleh mengubah suai atribut apabila mengakses HashMap =>gt ; Nilainya adalah batal

    package tech.luxsun.interview.luxinterviewstarter.collection;
     
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import java.util.HashMap;
     
    /**
     * @author Lux Sun
     * @date 2021/4/22
     */
    public class MapDemo0 {
     
        public static void main(String[] args) {
            HashMap<Object, Object> map = new HashMap<>();
     
            // Person Case
            Person p = new Person("Bob", 12);
            map.put(p, "person");
            System.out.println(p.hashCode());
            System.out.println(map.get(p));
     
            p.setAge(13);
            System.out.println(p.hashCode());
            System.out.println(map.get(p));
     
            // Student Case
            Student stu = new Student("Bob", 12);
            map.put(stu, "student");
            System.out.println(stu.hashCode());
            System.out.println(map.get(stu));
     
            stu.setAge(13);
            System.out.println(stu.hashCode());
            System.out.println(map.get(stu));
        }
    }
     
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    class Person {
        private String name;
        private Integer age;
     
        public int hashCode() {
            return 123456;
        }
    }
     
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    class Student {
        private String name;
        private Integer age;
    }

    Hasil output

    123456
    orang
    123456
    orang
    7115471213
    null

    Kod sumber

    kod sumber hashCode

    rreee

    map.get kod sumber

    rreee

    Ringkasnya

    anda dapat melihat bahawa jadual diperoleh terlebih dahulu, yang sebenarnya adalah tatasusunan. Kemudian cari nilai yang sepadan dengan kunci dalam jadual. Kriteria untuk mencari ialah cincangan adalah sama dengan cincang parameter yang diluluskan dan memenuhi salah satu daripada dua syarat lain: k = e.key, yang bermaksud ia adalah objek yang sama, atau kunci sasaran yang sama daripada kunci yang diluluskan. Masalah kami terletak pada hash(key.hashCode()). Anda boleh melihat bahawa HashMap mencincang kod cincang kunci semasa menyimpan elemen. Hash yang diperoleh akhirnya akan digunakan sebagai asas untuk lokasi penyimpanan elemen. Sepadan dengan situasi kami: apabila menyimpan buat kali pertama, fungsi cincang menggunakan key.hashCode sebagai parameter untuk mendapatkan nilai, dan kemudian menyimpan elemen di lokasi tertentu berdasarkan nilai ini.

    Apabila kami mengambil elemen sekali lagi, nilai key.hashCode telah berubah, jadi hasil fungsi hash di sini juga telah berubah, jadi apabila ia cuba mendapatkan lokasi penyimpanan kunci ini, ia tidak dapat Mendapatkan yang betul nilai, menyebabkan elemen sasaran tidak ditemui. Untuk mengembalikannya dengan betul, ia adalah sangat mudah untuk menukar kaedah kod cincang kelas Orang supaya kod cincangnya tidak bergantung pada atribut yang ingin kita ubah atribut kedua-dua objek adalah berbeza, Nilai hashCode yang berbeza boleh dikembalikan apabila ia betul-betul sama.

    Jadi kesimpulannya ialah selepas meletakkan objek dalam HashMap, jangan ubah suai atribut utama melainkan anda mengatasi kaedah hashCode kelas entiti yang tidak tertakluk kepada sekatan atribut.

    Atas ialah kandungan terperinci Bagaimana untuk mengubah suai nilai dalam Hashmap berdasarkan nilai utama dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam