HashSet與TreeSet對重複元素的判斷不同之處
阿新 • • 發佈:2019-02-06
轉:http://wlt2008-com.iteye.com/blog/1447207
HashSet 的實現其實非常簡單,它只是封裝了一個 HashMap 物件來儲存所有的集合元素,所有放入 HashSet 中的集合元素實際上由 HashMap 的 key 來儲存,而 HashMap 的 value 則儲存了一個 PRESENT,它是一個靜態的 Object 物件。
HashSet 的絕大部分方法都是通過呼叫 HashMap 的方法來實現的,因此 HashSet 和 HashMap 兩個集合在實現本質上是相同的。
HashMap 的 put 與 HashSet 的 add
於 HashSet 的 add() 方法新增集合元素時實際上轉變為呼叫 HashMap 的 put() 方法來新增 key-value 對。HashMap 的 put() 方法首先呼叫.hashCode() 判斷返回值相等,如果返回值相等則再通過 equals 比較也返回 true,最終認為key物件是相等的已經在HashMap中存在了
TreeMap 的 put 與 TreeSet 的 add
TreeMap中呼叫put方法新增鍵值時,呼叫物件的它的 compareTo(或 compare)方法對所有鍵進行比較,此方法飯回0,則認為兩個鍵就是相等的。
TreeSet新增元素的時候,呼叫compareTo或compare方法來定位元素的位置,也就是返回compareTo或compare返回0則認為是同一個位置的元素,即相同元素
package com.test.treeSet; import java.util.*; public class TestTreeSet { public static void p(Object obj){ System.out.println(obj); } /** * @param args */ public static void main(String[] args) { MyComparator m = new MyComparator(); HashSet<Student> set1 = new HashSet<Student>(); TreeSet<Student> set2 = new TreeSet<Student>(m); Student s1 = new Student("001","郭玲玲",100); Student s2 = new Student("002","劉德華",100); Student s3 = new Student("003","林志玲",80); Student s4 = new Student("003","郭玲玲",90); set1.add(s1); set1.add(s2); set1.add(s3); set1.add(s4); /* p(set1); set2.add(s1); set2.add(s2); set2.add(s3); set2.add(s4); p(set2);*/ /* TreeMap<Student, String> map = new TreeMap<Student, String>(m); map.put(s1, s1.num); map.put(s2, s2.num); map.put(s3, s3.num); map.put(s4, s4.num); p(map); */ } } class Student{ public String name; public String num; public int score; public Student(String num, String name, int score) { super(); this.num = num; this.name = name; this.score = score; } @Override public String toString() { return this.num+" "+this.name+" "+this.score; } @Override public boolean equals(Object obj) { System.out.println("equals"); Student s = (Student)obj; return this.num.equals(s.num); } @Override public int hashCode() { System.out.println("hashCode"); return this.num.hashCode(); } } class MyComparator implements Comparator<Student>{ public int compare(Student s1, Student s2) { System.out.println("呼叫了compare()"); if(s1.num.equals(s2.num) ){ //成績等學號不等 return 0; //按學號比較 }else if( s1.score==s2.score &&!s1.num.equals(s2.num) ){ return s1.num.compareTo(s2.num); } return s1.score-s2.score; } }