`

HashSet与TreeSet

阅读更多
public class HashSetTest {
	public static void main(String[] args){
		HashSet<Student_> hs = new HashSet<Student_>();
		TreeSet<Student_> ts = new TreeSet<Student_>();
		hs.add(new Student_(1,"langhua"));
		hs.add(new Student_(2,"xizh"));
		hs.add(new Student_(2,"xizh"));
		ts.add(new Student_(1,"langhua"));
		ts.add(new Student_(2,"xizh"));
		ts.add(new Student_(2,"xizh"));
		Iterator<Student_> it = ts.iterator();
		
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}
class Student_ implements Comparable{
	int num;
	String name;
	
	public Student_(int num,String name){
		this.num = num;
		this.name = name;
	}
	
	public String toString(){
		return num+":"+name;
	}
	
	public boolean equals(Object obj) {
		Student_ s = (Student_) obj;
		return num==s.num && name.equals(s.name);
	}

	public int hashCode() {
		return num*name.hashCode();
	}

	public int compareTo(Object o) {
		Student_ s = (Student_) o;
		int results = num > s.num ? 1 : (num ==s.num ? 0 : -1);
		if(results==0){
			return name.compareTo(s.name);
		}
		return results;
	}
}
//HashSet要重写equals()和hashCode()方法
//TreeSet要implements Comparable接口
//他们的底层实现是不一样的,一个是HashTable 另一个是SortMap
//TreaSet的构造方法中还可以用TreeSet(Comparator c);去构造个TreeSet对象,这样就不用实现Comparable接口了



1、Treeset中的数据是自动排好序的,不允许放入null值

2、HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束

3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例,TreeSet就算实现了HashCode()方法也不能放出重复的。TreeSet里面判断是否相同看对象的compareTo方法
分享到:
评论
3 楼 tan8888 2013-03-11  
即使是定义了compareTo ,treeSet还是会出现相同的,这个问题很诡异,尤其是比较两个参数时,并不能保证没有重复
2 楼 langhua9527 2009-04-02  
compareTo
jerry 写道

你把它向TreeSet中放试试,相同的对象也可以放入。

对象相不相同是根据对象中的compareTo方法决定的,而且对象必须implements Comparable
要不然在构造TreeMap的时候就要用这个构造方法
public TreeSet(Comparator<? super E> c)

1 楼 jerry 2009-04-01  
你把它向TreeSet中放试试,相同的对象也可以放入。

相关推荐

Global site tag (gtag.js) - Google Analytics