`
fxly0401
  • 浏览: 144799 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HashSet和TreeSet的区别(转+完善)

阅读更多
==========================它们的区别===========================
1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.
3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.
   a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.
   b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象,才可以真正定位到键值对应的Entry.
   c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value
4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.
   a. Comparator可以在创建TreeMap时指定
   b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
   c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了.
总结:
HashSet无序
TreeSet有序

二者里边不能有重复的对象

=====================================他们的用法======================
1、在HashSet中如何确定对象的唯一呢,在进行集合的操作时,用equal方法来判断对象是否唯一。这里要强调的是,在java里千万要警惕 == 操作符,==是判断两个对象的物理地址的,没有任何业务意义。
源代码如下:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test4_HashSet {
	private HashSet<Users> usersSet = new HashSet<Users>();
	private void printElement(Set usersSet){
		Iterator it = usersSet.iterator();
		while(it.hasNext()){
			System.out.println(((Users)it.next()).toString());
		}
	}
	
	public static void main(String[] args) {
		Test4_HashSet t4 = new Test4_HashSet();
		for(int i=0;i<10;i++){
			Users users = new Users("users"+i);
			t4.usersSet.add(users);
		}
		//添加相同字符串users5的对象,要保证HashSet内对象唯一,需重写HashSet中对象继承自Object的equals()和hashCode()方法
		Users users = new Users("users"+5);
		t4.usersSet.add(users);
		System.out.println("****"+t4.usersSet.size());
		t4.printElement(t4.usersSet);
	}
}

class Users{
	private String usersName;
	public Users(String usersname){
		this.usersName = usersname;
	}
	public String getUsersName() {
		return usersName;
	}
	public void setUsersName(String usersName) {
		this.usersName = usersName;
	}
	public String toString(){
		return usersName;
	}
	//若想实现HashSet中对象的唯一性判断,必须使用对象中的唯一性属性生成hashCode,如usersName.hashCode()
	@Override
	public int hashCode() {
		return usersName.hashCode();
	}
	@Override
	public boolean equals(Object obj) {
		return usersName.equals(((Users)obj).getUsersName());
	}
}

----------------------------------------------------------------------------
2、TreeSet的用法
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class Test4_TreeSet {
      /**
       * 通过这个程序,还可以测试树集的添加元素的无序性与输出的有序性
       */
	private Set<User> userSet = new TreeSet<User>();
	private void printElement(Set userSet){
		Iterator it = userSet.iterator();
		while(it.hasNext()){
			System.out.println(((User)it.next()).toString());
		}
	}
	
	public static void main(String[] args) {
		Test4_TreeSet t4 = new Test4_TreeSet();
		for(int i=0;i<10;i++){
			User user = new User("user"+i);
			t4.userSet.add(user);
		}
		User user = new User("user"+5);
		t4.userSet.add(user);
		System.out.println("****"+t4.userSet.size());
		t4.printElement(t4.userSet);
	}
}
/**
  *TreeSet.add(Comparable o),该方法添加的对象必须实现Comparable接口,否则会报错
  *若想实现TreeSet中的对象在插入时自动排序,也必须实现Comparable接口,覆盖compareTo()方法
**/
class User implements Comparable{
	private String userName;
	public User(String username){
		this.userName = username;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String toString(){
		return userName;
	}
	@Override
	public int compareTo(Object o) {
		return userName.compareTo(((User)o).toString());
	}
}


参考链接:
http://blog.csdn.net/woisnong/article/details/7433453
http://mahilion.blog.163.com/blog/static/1830872952011429112232362/
http://hi.baidu.com/alexandrae2008/item/d770bc871caf285e26ebd9ca
http://www.cnblogs.com/jcli/archive/2011/08/09/2132191.html
题目来自:中视广信2013笔试题
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics