转: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;
}
}