Java Map 怎样实现Key 的唯一性?
大家都知道。在Map和Set不可存在反復(fù)元素??
可是對(duì)于內(nèi)部的細(xì)節(jié)我們并不了解。今天我們就一塊來(lái) 探討一下!
1?對(duì)于 HashMap ?HashSet ?
他們的底層數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)是:維護(hù)了一張 ?HashTable 。容器中的元素所有存儲(chǔ)在Hashtable 中。他們?cè)偌尤朐氐臅r(shí)候,是怎樣推斷是否存在有反復(fù)元素的呢? ?每個(gè)被加入的元素都有一個(gè) hashCode(哈希值),他們先比較哈希值,是否同樣? 不同樣的元素,加入進(jìn)入 HashTable. ? 假設(shè)hashCode同樣的話, 再去比較 equals()方法,假設(shè)也同樣的話,JVM就覺(jué)得數(shù)據(jù)已經(jīng)存在了。就不會(huì)加入數(shù)據(jù)!
如圖1:
2 對(duì)于 TreeMap ?TreeSet
他們底層是數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)是:維護(hù)了一棵二叉樹(shù)。 容器中加入元素的時(shí)候,他們有是怎么推斷是否有同樣元素的?我們都直到 TreeMap TreeSet ?她們 都是 有序的存儲(chǔ)數(shù)據(jù)。
為了維護(hù) 數(shù)據(jù)的唯一性。 再存入數(shù)據(jù)的時(shí)候,他們會(huì)調(diào)用元素中 實(shí)現(xiàn)的 Comparable 的 compareTo() ?方法(代碼1)。 或者 集合本身創(chuàng)建的時(shí)候 傳入了 迭代器(代碼2). ?詳細(xì)的實(shí)現(xiàn)是:調(diào)用比較方法,返回-1 的時(shí)候,加入到左子樹(shù),返回1 的時(shí)候 加入到 右子樹(shù)。
返回0 有同樣數(shù)據(jù) 不加入該元素!
如圖2
代碼1;(原理一)
package stu.love.v;import java.util.*; //什么時(shí)候用Map /* 當(dāng)存在映射關(guān)系時(shí)。 每一個(gè)學(xué)員都相應(yīng)一個(gè)地址 姓名,年齡同樣的視為同一個(gè)人*/ // 容器中的對(duì)象 本身 具備比較性。class StudentD implements Comparable<StudentD> {private String name;private int age;public StudentD(String name,int age){this.name = name;this.age = age;}public int compareTo(StudentD stu){int t = this.age-stu.age;return t==0?
this.name.compareTo(stu.name):t; } // 重寫了 hashCode 方法 public int hashCode() { return name.hashCode()+age*36; } // 重寫了 equals 方法 public boolean equals(Object obj) { if(!(obj instanceof StudentD)) throw new ClassCastException("類型異常"); StudentD stu =(StudentD)obj; return this.name.equals(stu.name) && this.age ==stu.age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } public String toString() { return this.name +","+age; } } class Demo16 { public static void main(String[] args) { //保證鍵唯一的原理,先推斷哈希值是否同樣,同樣再推斷equals() HashMap<StudentD,String> hm = new HashMap<StudentD,String>(); hm.put(new StudentD("xiaobai",23),"shanghai"); hm.put(new StudentD("wanghei",20),"beijing"); hm.put(new StudentD("lisi",28),"shenzhen"); hm.put(new StudentD("lisi",28),"shenzhen"); // Map 第一種 迭代方式 依據(jù) key 找 value Set<StudentD> set=hm.keySet(); for(Iterator<StudentD> ite = set.iterator();ite.hasNext();) { StudentD stu = ite.next(); String value = hm.get(stu); sop(stu+"的地址是:"+value); } // map 的 另外一種 迭代方式 獲取 鍵值對(duì)。entry 獲取當(dāng)中的 key 和 value Set<Map.Entry<StudentD,String>> entry = hm.entrySet(); for(Iterator<Map.Entry<StudentD,String>> ite = entry.iterator();ite.hasNext();) { Map.Entry<StudentD,String> kv = ite.next(); StudentD key = kv.getKey(); String value = kv.getValue(); sop(key+"的地址是:"+value); } } public static void sop(Object obj) { System.out.println(obj); } }
代碼2:
package stu.love.v;/* TreeMap: HashMap保證鍵唯一的原理和HashSet同樣 TreeMap保證鍵唯一的原理和TreeSet同樣*/ import java.util.*;class Student1 {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}private int age;public Student1(String name,int age){this.name = name;this.age = age;}public String toString(){return name+","+age;}}// 比較器 class CompareByName implements Comparator<Student1> {public int compare(Student1 s1,Student1 s2){ // 這樣寫的方法 很好!
簡(jiǎn)潔 int t = s1.getName().compareTo(s2.getName()); return t ==0?s1.getAge()-s2.getAge():t; } } class Demo17 { public static void main(String[] args) { // 原理二: //保證鍵唯一的原理:比較方法的返回值為0 TreeMap<Student1,String> tm = new TreeMap<Student1,String>(new CompareByName()); tm.put(new Student1("xiaobai",23),"shanghai"); tm.put(new Student1("wanghei",20),"beijing"); tm.put(new Student1("lisi",28),"shenzhen"); tm.put(new Student1("lisi",28),"shenzhen"); Set<Map.Entry<Student1,String>> entry = tm.entrySet(); for(Iterator<Map.Entry<Student1,String>> it = entry.iterator();it.hasNext();) { Map.Entry<Student1,String> kv = it.next(); Student1 key = kv.getKey(); String value = kv.getValue(); sop(key+"的地址是:"+value); } } public static void sop(Object obj) { System.out.println(obj); } }
總結(jié)
以上是生活随笔為你收集整理的Java Map 怎样实现Key 的唯一性?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: labview如何弹出提示窗口_以实例跟
- 下一篇: 解决 windows10和ubuntu1