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陣列物件
- HashSet與HashMap的區別HashMap
- HashSet和HashMapHashMap
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- 比較適用的js日期物件定義方式JS物件
- TreeMap和HashMap的元素比較HashMap
- HashMap、LinkedHashMap、HashTable、HashSet筆記HashMap筆記
- 集合框架-HashMap&HashSet&LinkedHshMap框架HashMap
- Java中陣列判斷元素存在幾種方式比較詳解Java陣列
- [20180319]windows批處理檔案大小比較.txtWindows
- React與Vue模板使用比較(一、vue模板與React JSX比較)ReactVueJS
- js物件如何深比較?JS物件
- JS 物件合併與克隆方法的分類與比較JS物件
- 組合模式-統一的處理個別物件與組合物件模式物件
- 比較兩個List物件,找出新增、刪除、更改的條目物件
- 麒麟659和麒麟710處理器引數比較
- java 請求HTTP返回json集合,物件處理方式JavaHTTPJSON物件
- Java HashMap 和 HashSet 的高效使用技巧JavaHashMap
- HashSet/HashMap、TreeSet/TreeMap、LinkedHashSet/LinkedHashMap 區別HashMap
- 需要將多個視訊進行去色的處理怎麼樣操作比較快?
- mysql 執行一段時間比較慢問題處理經過MySql
- Java字串建立方式比較Java字串
- ==與equals比較
- php 與 nginx 的兩種處理方式PHPNginx
- ORA-38029: 物件統計資訊已鎖定處理物件
- 華為麒麟659和麒麟710處理器引數比較
- js物件陣列Date的比較JS物件陣列
- 統一返回物件和異常處理(一)物件
- HashMap,LinkedHashMap,TreeMap讀取大量資料效率的比較HashMap
- 使用PowerShell更新已存在的組設定物件物件
- 往一個陣列物件裡面傳值,如果id已經存在就替換id同一個物件裡面的另一個值。沒有就新增陣列物件
- Js 比較兩個物件的鍵名與鍵值是否相等JS物件
- Hibernate與mybatis比較MyBatis
- yarn 與 npm 比較YarnNPM
- Vue與React比較VueReact
- Vuex與Redux比較VueRedux
- RecyclerView與ListView比較View
- 多工處理方式之一:多程式