HashSet與HashMap比較——新增物件已存在處理方式一樣?
答案是不一樣的。
HashSet與HasMap在新增新物件是,會先判斷容器中是否已存在相等的物件(比較key是否相等),如果存在,HashSet的處理方式是放棄儲存新物件,然而HashMap的處理方式是覆蓋之前的物件。
相等物件:如果兩個引用指向同一個物件,那麼這兩個引用是相等的,他們的hashcode方法返回的值一致。如果沒有重寫Object中hashcode方法,返回的是物件在記憶體中的地址(值中帶有‘@’)。所以必須要要重寫hashCode()方法,才能使得兩個物件都有相同的hashCode,並且還要重寫equals()方法使得返回的值為true。滿足這兩個條件,那麼證明兩個物件在HashMap/HashSet中是相等的。
用一段測試程式碼來展示:
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import lombok.Data;
public class TestHashSetAndHashMap {
@Data
public static class Person {
private Integer id;
private String name;
public Person(Integer id, String name) {
this.id = id;
this.name = name;
}
public Person(){}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(id, person.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
public static void main(String[] args) {
Person p1 = new Person(1,"zhangshan");
Person p2 = new Person(1, "Lisi");
Set<Person> set = new HashSet<>();
set.add(p1);
for (Person p : set) {
System.out.println(p.getName());
}
set.add(p2);
for (Person p : set) {
System.out.println(p.getName());
}
//HashMap是覆蓋
Map<Integer, Person> map = new HashMap<>();
map.put(p1.getId(), p1);
for (Map.Entry e : map.entrySet()) {
System.out.println(e.getValue());
}
map.put(p2.getId(), p2);
for (Map.Entry e : map.entrySet()) {
System.out.println(e.getValue());
}
}
}
結果:
32
32
zhangshan
zhangshan
TestHashSetAndHashMap.Person(id=1, name=zhangshan)
TestHashSetAndHashMap.Person(id=1, name=Lisi)
可以看出HashSet放棄儲存新物件,HashMap直接覆蓋原有物件。
相關文章
- 當 Vue 處理陣列與處理純物件的方式一樣Vue陣列物件
- Java集合(5)一 HashMap與HashSetJavaHashMap
- HashSet與HashMap的區別HashMap
- TC中如何新增物件及比較物件物件
- HashSet和HashMapHashMap
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- APP 密碼儲存在何處比較安全APP密碼
- Java中對HashMap的深度分析與比較JavaHashMap
- Java中對HashMap的深度分析與比較(轉)JavaHashMap
- HashMap、HashTable、HashSet詳解HashMap
- HashMap和HashSet深度解析HashMap
- TreeMap和HashMap的元素比較HashMap
- 比較適用的js日期物件定義方式JS物件
- HashTable HashMap HashSet區別(java)HashMapJava
- Java中陣列判斷元素存在幾種方式比較詳解Java陣列
- 集合框架-HashMap&HashSet&LinkedHshMap框架HashMap
- HashMap、LinkedHashMap、HashTable、HashSet筆記HashMap筆記
- PHP物件的比較PHP物件
- React與Vue模板使用比較(一、vue模板與React JSX比較)ReactVueJS
- Java 容器和泛型(3)HashSet,TreeSet 和 LinkedHashSet比較Java泛型
- 轉:Java中的HashSet, TreeSet, HashMap, TreeMapJavaHashMap
- Java HashMap 和 HashSet 的高效使用技巧JavaHashMap
- JS 物件合併與克隆方法的分類與比較JS物件
- 比較兩個List物件,找出新增、刪除、更改的條目物件
- 組合模式-統一的處理個別物件與組合物件模式物件
- 需要將多個視訊進行去色的處理怎麼樣操作比較快?
- js字串與json物件處理字串JSON物件
- 分享一種比較萬能的居中方式
- 向RAC中已經存在的磁碟組新增一塊新硬碟硬碟
- 物件導向與函式程式設計的比較物件函式程式設計
- HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap區別HashMap
- Java集合框架原始碼剖析:HashSet 和 HashMapJava框架原始碼HashMap
- Java 集合框架 HashSet 和 HashMap 原始碼剖析Java框架HashMap原始碼
- Java字串建立方式比較Java字串
- 強制型別轉換時的異常處理_java與c++比較型別JavaC++
- mysql 執行一段時間比較慢問題處理經過MySql
- J2ee web程式的service層中的事務怎樣處理才比較合理?Web
- 處理tns不存在