HashSet与TreeSet对重复元素的判断不同之处
?
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;}@Overridepublic String toString() {return this.num+" "+this.name+" "+this.score;}@Overridepublic boolean equals(Object obj) {System.out.println("equals");Student s = (Student)obj;return this.num.equals(s.num);}@Overridepublic 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;}}??