范例: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?int?age;??????????????????????????
- //?定義age屬性????
- ????public?Person(String?name,?int?age)?{?????
- //?通過構造方法為屬性賦值????
- ????????this.name?=?name;?????????????????????
- //?為name屬性賦值????
- ????????this.age?=?age;???????????????????????
- //?為age屬性賦值????
- ????}????
- ????public?boolean?equals(Object?obj)?{??????
- //?覆寫equals()方法????
- ????????if?(this?==?obj)?{????????????????????
- //?判斷地址是否相等????
- ????????????return?true;??????????????????????
- //?返回true表示同一對象????
- ????????}????
- ????????if?(!(obj?instanceof?Person))?{???????
- //?傳遞進來的不是本類的對象????
- ????????????return?false;?????????????????????
- //?返回false表示不是同一對象????
- ????????}????
- ????????Person?p?=?(Person)?obj;??????????????
- //?進行向下轉型????
- ????????if?(this.name.equals(p.name)?&&??
- this.age?==?p.age)?{????
- ????????????return?true?;?????????????????????
- //?屬性依次比較,相等返回true????
- ????????}else{????
- ????????????return?false?;????????????????????
- //?屬性內容不相等,返回false????
- ????????}????
- ????}????
- ????public?int?hashCode(){??????????????????????
- //?覆寫hashCode()方法????
- ????????return?this.name.hashCode()?*?this.age?;????
- //?計算公式????
- ????}????
- ????public?String?toString()?{??????????????????????
- //?覆寫toString()方法????
- ????????return?"姓名:"?+?this.name?+?";年齡:"???
- +?this.age;???//?返回信息????
- ????}????
- }?????
- public?class?IdentityHashMapDemo01?{????
- ????public?static?void?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?{????
- ????//?此類與之前定義一樣,此處不再列出????
- }????
- public?class?IdentityHashMapDemo02?{????
- ????public?static?void?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允許重復,只要兩個對象的地址不相等即可。