


Based on Java HashMap, how to solve the problem of inserting duplicate Key values
May 09, 2023 am 10:52 AMjava HashMap inserts duplicate Key values
To insert duplicate values ??in HashMap, you first need to figure out how elements are stored in HashMap.
put method
Every element stored in the Map is a key-value pair, and they are all added through the put method, and the same key is only There will be a value associated with it. The put method is defined as follows in Map.
V put(K key, V value);
put() method implementation:
First hash(key) gets the hashcode() of the key, and the hashmap finds the chain where the location to be inserted is based on the hashcode obtained. , all Entry key-value pairs with the same hashcode are placed in this chain. After finding this chain, it will use the equals() method to determine whether there is already a key-value pair to be inserted, and this equals actually compares the key.
It is used to store a key-value pair such as key-value. The return value is the old value of the key stored in the Map. If it does not exist before, null is returned. The put method of HashMap is implemented like this.
// 在此映射中關(guān)聯(lián)指定值與指定鍵。如果該映射以前包含了一個該鍵的映射關(guān)系,則舊值被替換 public V put(K key, V value) { // 當(dāng)key為null,調(diào)用putForNullKey方法,保存null與table第一個位置中,這是HashMap允許為null的原因 if (key == null) return putForNullKey(value); // 使用hash函數(shù)預(yù)處理hashCode,計(jì)算key的hash值 int hash = hash(key.hashCode());//-------(1) // 計(jì)算key hash 值在 table 數(shù)組中的位置 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存進(jìn)去 e.value = value; e.recordAccess(this); // 返回舊的value return oldValue; } } // 修改次數(shù)增加1 modCount++; // 將key、value添加至i位置處 addEntry(hash, key, value, i); return null; }
From the above we can see that when adding the corresponding key-value combination, if the corresponding key already exists, the corresponding value will be directly changed and the old value will be returned, while judging the key When it exists, compare the hashCode of the key first, and then compare it for equality or equals.
Directly from the above code, the comparison corresponds to the hashCode of Map.Entry and the hashCode of the key. In fact, the hashCode of Map.Entry is actually the hashCode where the key is stored.
If the corresponding key does not originally exist, addEntry will be called to add the corresponding key-value to the Map.
The parameter hash passed by addEntry is the hashCode of the corresponding key.
Realize the uniqueness of reference objects as keys
Through the study of the put() method, we can find that when judging whether a key exists, we first compare the hashCode of the key, and then compare the equality or equals, so overriding the hashCode() and equals() methods can overwrite the references of keys (pointing to objects with the same instance variables).
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 ; } } }
After rewriting these two methods, you can overwrite the duplicate reference objects. If you need to superimpose the value, use the containsKey() method to determine whether there are duplicate key values ??before calling the put() method. If so, , then use the get() method to obtain the original value, and then add the newly added value.
HashMap solves the problem of the same key value
Some scenarios require one key value to correspond to multiple values, but one key value of the map only corresponds to one value value. Since the hashmap has the same key value, The second put will overwrite the value of the first one, so in order to solve this problem: So use list to save
as follows:
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); }
Every time a new map is created, add to the map inside the list. The idea is roughly this.
The above is the detailed content of Based on Java HashMap, how to solve the problem of inserting duplicate Key values. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

The settings.json file is located in the user-level or workspace-level path and is used to customize VSCode settings. 1. User-level path: Windows is C:\Users\\AppData\Roaming\Code\User\settings.json, macOS is /Users//Library/ApplicationSupport/Code/User/settings.json, Linux is /home//.config/Code/User/settings.json; 2. Workspace-level path: .vscode/settings in the project root directory

To correctly handle JDBC transactions, you must first turn off the automatic commit mode, then perform multiple operations, and finally commit or rollback according to the results; 1. Call conn.setAutoCommit(false) to start the transaction; 2. Execute multiple SQL operations, such as INSERT and UPDATE; 3. Call conn.commit() if all operations are successful, and call conn.rollback() if an exception occurs to ensure data consistency; at the same time, try-with-resources should be used to manage resources, properly handle exceptions and close connections to avoid connection leakage; in addition, it is recommended to use connection pools and set save points to achieve partial rollback, and keep transactions as short as possible to improve performance.

DependencyInjection(DI)isadesignpatternwhereobjectsreceivedependenciesexternally,promotingloosecouplingandeasiertestingthroughconstructor,setter,orfieldinjection.2.SpringFrameworkusesannotationslike@Component,@Service,and@AutowiredwithJava-basedconfi

itertools.combinations is used to generate all non-repetitive combinations (order irrelevant) that selects a specified number of elements from the iterable object. Its usage includes: 1. Select 2 element combinations from the list, such as ('A','B'), ('A','C'), etc., to avoid repeated order; 2. Take 3 character combinations of strings, such as "abc" and "abd", which are suitable for subsequence generation; 3. Find the combinations where the sum of two numbers is equal to the target value, such as 1 5=6, simplify the double loop logic; the difference between combinations and arrangement lies in whether the order is important, combinations regard AB and BA as the same, while permutations are regarded as different;

java.lang.OutOfMemoryError: Javaheapspace indicates insufficient heap memory, and needs to check the processing of large objects, memory leaks and heap settings, and locate and optimize the code through the heap dump analysis tool; 2. Metaspace errors are common in dynamic class generation or hot deployment due to excessive class metadata, and MaxMetaspaceSize should be restricted and class loading should be optimized; 3. Unabletocreatenewnativethread due to exhausting system thread resources, it is necessary to check the number of threads, use thread pools, and adjust the stack size; 4. GCoverheadlimitexceeded means that GC is frequent but has less recycling, and GC logs should be analyzed and optimized.

fixture is a function used to provide preset environment or data for tests. 1. Use the @pytest.fixture decorator to define fixture; 2. Inject fixture in parameter form in the test function; 3. Execute setup before yield, and then teardown; 4. Control scope through scope parameters, such as function, module, etc.; 5. Place the shared fixture in conftest.py to achieve cross-file sharing, thereby improving the maintainability and reusability of tests.

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

Use classes in the java.time package to replace the old Date and Calendar classes; 2. Get the current date and time through LocalDate, LocalDateTime and LocalTime; 3. Create a specific date and time using the of() method; 4. Use the plus/minus method to immutably increase and decrease the time; 5. Use ZonedDateTime and ZoneId to process the time zone; 6. Format and parse date strings through DateTimeFormatter; 7. Use Instant to be compatible with the old date types when necessary; date processing in modern Java should give priority to using java.timeAPI, which provides clear, immutable and linear
