Rumah  >  Artikel  >  Java  >  Berdasarkan Java HashMap, bagaimana untuk menyelesaikan masalah memasukkan nilai Kunci pendua

Berdasarkan Java HashMap, bagaimana untuk menyelesaikan masalah memasukkan nilai Kunci pendua

WBOY
WBOYke hadapan
2023-05-09 10:52:082889semak imbas

Masukkan nilai kunci pendua dalam HashMap java

Untuk memasukkan nilai pendua dalam HashMap, anda perlu memikirkan cara elemen disimpan dalam HashMap terlebih dahulu.

kaedah put

Setiap elemen yang disimpan dalam Peta ialah pasangan nilai kunci, dan semuanya ditambah melalui kaedah put, dan kunci yang sama hanya Akan ada nilai yang dikaitkan dengan ia. Kaedah meletakkan ditakrifkan seperti berikut dalam Peta.

V put(K key, V value);

pelaksanaan kaedah put():

Cincang(kunci) pertama untuk mendapatkan kod cincang() kunci dan peta cincang mencari rantai di mana lokasi itu berada dimasukkan adalah berdasarkan kod cincang yang diperolehi , semua pasangan nilai kunci Kemasukan dengan kod cincang yang sama diletakkan dalam rantaian ini Selepas mencari rantai ini, ia akan menggunakan kaedah equals() untuk menentukan sama ada sudah ada pasangan nilai kunci. dimasukkan, dan ini sama dengan sebenarnya membandingkan kunci.

Ia digunakan untuk menyimpan pasangan nilai kunci seperti nilai kunci Nilai pulangan ialah nilai lama kunci yang disimpan dalam Peta Jika ia tidak wujud sebelum ini, null dikembalikan. Kaedah put HashMap dilaksanakan seperti ini.

// 在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换
public V put(K key, V value) {
    // 当key为null,调用putForNullKey方法,保存null与table第一个位置中,这是HashMap允许为null的原因 
    if (key == null)
        return putForNullKey(value);
    // 使用hash函数预处理hashCode,计算key的hash值  
    int hash = hash(key.hashCode());//-------(1)
    // 计算key hash 值在 table 数组中的位置 
    int i = indexFor(hash, table.length);//------(2)
    // 从i出开始迭代 e,找到 key 保存的位置
    for (Entry<K, V> e = table[i]; e != null; e = e.next) {
        Object k;
        // 判断该条链上是否有hash值相同的(key相同) 
        // 若存在相同,则直接覆盖value,返回旧value 
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            // 旧值 = 新值  
            V oldValue = e.value;
            // 将要存储的value存进去
            e.value = value;
            e.recordAccess(this);
            // 返回旧的value
            return oldValue;
        }
    }
    // 修改次数增加1 
    modCount++;
    // 将key、value添加至i位置处 
    addEntry(hash, key, value, i);
    return null;
}

Daripada perkara di atas, kita dapat melihat bahawa apabila menambah kombinasi nilai kunci yang sepadan, jika kunci yang sepadan sudah wujud, nilai yang sepadan akan ditukar terus dan nilai lama akan dikembalikan, sambil menilai kunci Bila ia wujud, bandingkan kod cincang kunci dahulu, dan kemudian bandingkannya untuk kesamaan atau kesamaan.

Daripada kod di atas, perbandingan sepadan dengan Kod cincang Map.Entry dan Kod cincang kunci Sebenarnya, Kod cincang Map.Entry sebenarnya ialah Kod cincang kunci.

Jika kunci yang sepadan pada asalnya tidak wujud, addEntry akan dipanggil untuk menambah nilai kunci yang sepadan pada Peta.

Cincangan parameter yang diluluskan oleh addEntry ialah Kod cincang kunci yang sepadan.

Menyedari keunikan objek rujukan sebagai kunci

Melalui kajian kaedah put(), kita dapati bahawa apabila menilai sama ada kunci wujud, kita mula-mula membandingkan Kod cincang kunci itu, dan kemudian bandingkan kesamaan atau sama, jadi mengatasi kaedah hashCode() dan equals() boleh menimpa rujukan kekunci (menunjuk ke objek dengan pembolehubah contoh yang sama).

class MyType {
    private String arga;
    private String argb;

    public MyType(String arga, String argb) {
        this.arga = arga;
        this.argb = argb;
    }

    @Override
    public int hashCode(){                 
         return this.arga.hashCode() * this.argb.hashCode() ; 
    } 
    
    @Override
    public boolean equals(Object obj) {   
        if (this == obj) {               
            return true;                  
        }         
        if (!(obj instanceof MyType)) {  
            return false;               
        }    
        MyType p = (MyType) obj;  
        if (this.arga.equals(p.arga) && this.argb.equals(p.argb)) {              
            return true ;                  
        } else {           
            return false ;                
        }       
    }
}

Selepas menulis semula dua kaedah ini, anda boleh menulis ganti objek rujukan pendua Jika anda perlu menindih nilai, gunakan kaedah containsKey() untuk menentukan sama ada terdapat nilai kunci pendua sebelum memanggil put(. ) kaedah. Jika ya, , kemudian gunakan kaedah get() untuk mendapatkan nilai asal, dan kemudian tambah nilai yang baru ditambah.

HashMap menyelesaikan masalah nilai kunci yang sama

Sesetengah senario memerlukan satu nilai kunci untuk sepadan dengan berbilang nilai, tetapi satu nilai kunci peta hanya sepadan dengan satu nilai nilai Sejak peta cincang mempunyai nilai kunci yang sama, Letak kedua akan menimpa nilai yang pertama, jadi untuk menyelesaikan masalah ini: Jadi gunakan senarai untuk menyimpan

seperti berikut:

List<Map<String, List<RecommendationListBO>>> hashList = new ArrayList<>();
Iterator<Map.Entry<String, List<RecommendationListBO>>> iterator = recommendationHashMap.entrySet().iterator();
Map.Entry<String, List<RecommendationListBO>> entry;
while (iterator.hasNext()) {
    entry = iterator.next();
    // 往newMap中放入新的Entry
    HashMap<String, List<RecommendationListBO>> newMap = new LinkedHashMap<>();
    newMap.put(entry.getKey().split(",")[0], entry.getValue());
    hashList.add(newMap);
}

Setiap kali anda membuat peta baharu, tambah pada peta di dalam senarai. Ideanya lebih kurang begini.

Atas ialah kandungan terperinci Berdasarkan Java HashMap, bagaimana untuk menyelesaikan masalah memasukkan nilai Kunci pendua. 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