`
crab1
  • 浏览: 4596 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

奇怪的HashSet 和变换后的TreeSet

阅读更多

HashSet ,作为Set集合的一个实现类,很多书中写到Set中不能存放重复的元素。事实上并非如此。看下面的一个简短的例子

import java.util.*;
class AddObject {
	int hashCode;

	public AddObject(int hashCode) {

		this.hashCode = hashCode;
	}

	public int hashCode() {
		return hashCode;
	}
}

public class TestHashSet {
	public static void main(String args[]) {
		// set在存储数据时需要遍历之前所存放的数据(hashCode与内存地址),用于与当前所要添加的元素进行对比。若得出结果相等,
		// 则不添加。比较的方法是:首先比较两个对象的hashCode,如果不相等,则直接添加;否则,再用equals()(比较地址)
		// 方法进行比较,如果结果返回为true,则不添加;否则,添加
		Set<AddObject> set = new HashSet<AddObject>();
		// 设置初始hashCode值
		AddObject ao = new AddObject(2);
		// 第一次添加
		set.add(ao);
		// 重新设置hashCode
		ao.hashCode = 3;
		// 再次添加
		set.add(ao);
		System.out.println(set.size());
		// 输出结果显然是2。但两次添加的对象显然是同一个对象,所以Set中不能存放重复的元素这一说法是不完善的

	}
}

 TreeSet:一个有序的Set(一般为升序)·,它是通过compareTo()这个函数来判断所添加的数据是否已经存在和排序

import java.util.*;

class A implements Comparable {
	public int compareTo(Object o) {
		// 返回值为0时,表示两个对象相等不可以添加;否则添加成功
		return 1;

	}

}

public class TestTreeSet {

	public static void main(String[] args) {

		TreeSet<A> ts = new TreeSet<A>();

		A a = new A();

		A b = new A();
		// 进行添加时,调用compareTo()方法进行比较。一来判断是否重复;二来,是为了排序
		ts.add(a);
		ts.add(b);

		System.out.println(ts.size());

	}

}

 

分享到:
评论
3 楼 zwnash 2014-10-14  
  
2 楼 crab1 2012-03-03  
xieyongwei 写道
第一个例子里面 ao的hascode变了,是否还可以认为是同一个对象?


当然是同一个对象。在例子里面,只是单纯的重写了hashCode()这个方法,而对象根本就没有改变,代码中只创建了一个对象,所以只是它的hashCode变了,而表征地址的identityHashCode()方法的返回值至始至终都没有发生变化。
1 楼 xieyongwei 2012-03-03  
第一个例子里面 ao的hascode变了,是否还可以认为是同一个对象?

相关推荐

Global site tag (gtag.js) - Google Analytics