Java中key可以重複的Map集合:IdentityHashMap
阿新 • • 發佈:2019-02-08
範例:Map中的key不允許重複,重複就是覆蓋
- package org.lxh.demo13.mapdemo;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Set;
- class Person {
- // 定義Person類
- private String name;
- // 定義name屬性
-
private
- // 定義age屬性
- public Person(String name, int age) {
- // 通過構造方法為屬性賦值
- this.name = name;
- // 為name屬性賦值
- this.age = age;
- // 為age屬性賦值
- }
- publicboolean equals(Object obj) {
- // 覆寫equals()方法
-
if
- // 判斷地址是否相等
- returntrue;
- // 返回true表示同一物件
- }
- if (!(obj instanceof Person)) {
- // 傳遞進來的不是本類的物件
- returnfalse;
- // 返回false表示不是同一物件
- }
-
Person p = (Person) obj;
- // 進行向下轉型
- if (this.name.equals(p.name) &&
- this.age == p.age) {
- returntrue ;
- // 屬性依次比較,相等返回true
- }else{
- returnfalse ;
- // 屬性內容不相等,返回false
- }
- }
- publicint hashCode(){
- // 覆寫hashCode()方法
- returnthis.name.hashCode() * this.age ;
- // 計算公式
- }
- public String toString() {
- // 覆寫toString()方法
- return"姓名:" + this.name + ";年齡:"
- + this.age; // 返回資訊
- }
- }
- publicclass IdentityHashMapDemo01 {
- publicstaticvoid main(String[] args) {
- Map<Person, String> map = null;
- // 宣告Map物件,指定
- 泛型型別
- map = new HashMap<Person, String>();
- // 例項化Map物件
- map.put(new Person("張三", 30), "zhangsan_1");
- // 增加內容
- map.put(new Person("張三", 30), "zhangsan_2");
- // 增加內容,key重複
- map.put(new Person("李四", 31), "lisi");
- // 增加內容
- Set<Map.Entry<Person, String>> allSet = null;
- // 宣告一個Set集合
- allSet = map.entrySet();
- // 將Map介面例項變為
- Set介面例項
- Iterator<Map.Entry<Person, String>>
- iter = null; // 宣告Iterator
- 物件
- iter = allSet.iterator();
- // 例項化Iterator
- 物件
- while (iter.hasNext()) {
- // 迭代輸出
- Map.Entry<Person, String> me =
- iter.next();// 每個物件都是Map.
- Entry例項
- System.out.println(me.getKey()
- + " --> " + me.getValue());
- // 輸出key和value
- }
- }
- }
程式執行結果:
- 姓名:李四;年齡:31 --> lisi
- 姓名:張三;年齡:30 --> zhangsan_2
從程式的執行結果中可以發現,第二個內容覆蓋了第一個內容,所以此時可以使用Identity HashMap。使用此類時只要地址不相等(key1!=key2),就表示不是重複的key,可以新增到集合中。
範例:使用IdentityHashMap修改程式
- package org.lxh.demo13.mapdemo;
- import java.util.IdentityHashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Set;
- class Person {
- // 此類與之前定義一樣,此處不再列出
- }
- publicclass IdentityHashMapDemo02 {
- publicstaticvoid main(String[] args) {
- Map<Person, String> map = null;
- // 宣告Map物件,指定
- 泛型型別
- map = new IdentityHashMap<Person, String>();
- // 例項化Map物件
- map.put(new Person("張三", 30), "zhangsan_1");
- // 增加內容
- map.put(new Person("張三", 30), "zhangsan_2");
- // 增加內容,key重複
- map.put(new Person("李四", 31), "lisi");
- // 增加內容
- Set<Map.Entry<Person, String>> allSet =
- null; // 宣告一個Set集合
- allSet = map.entrySet();
- // 將Map介面例項變為
- Set介面例項
- Iterator<Map.Entry<Person, String>>
- iter = null;// 宣告Iterator物件
- iter = allSet.iterator();
- // 例項化Iterator
- 物件
- while (iter.hasNext()) {
- // 迭代輸出
- Map.Entry<Person, String> me =
- iter.next();// 每個物件都是Map.
- Entry例項
- System.out.println(me.getKey()
- + " --> " + me.getValue());
- // 輸出key和value
- }
- }
- }
程式執行結果:
- 姓名:張三;年齡:30 --> zhangsan_2
- 姓名:張三;年齡:30 --> zhangsan_1
- 姓名:李四;年齡:31 --> lisi
從程式的執行結果中可以發現,現在的key允許重複,只要兩個物件的地址不相等即可。