`
fxly0401
  • 浏览: 148824 次
  • 性别: 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笔试题
分享到:
评论

相关推荐

    java8源码-JavaRobot:Java学习笔记,JavaLearningNote

    java8 源码 学习笔记(持续更新中) 所有文章均同步发布到微信公众号【JavaRobot】,...TreeSet HashSet Concurrent源码系列 待完善 JVM(Java虚拟机) 类加载 垃圾回收算法 JavaConcurrent(Java并发系列) 【Java并发系列】

    浅析Java中的set集合类型及其接口的用法

    在Java中,Set接口有两个常用的实现类:HashSet和TreeSet。 HashSet类是基于HashMap实现的,因此它在插入、删除和查找元素时具有较好的性能,但不保证元素的顺序。当我们向HashSet中添加元素时,元素的哈希码...

    java 1.6 API 中文版

    Java 1.6的集合框架是数据存储和操作的核心部分,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)接口及其实现。这些接口和类提供了丰富的功能,如添加、删除、查找...

    java面试题目整理需要的可以打印练习

    Set接口的实现包括HashSet和TreeSet,HashSet基于哈希表,不允许重复元素;TreeSet基于红黑树,保证排序。Map接口的实现如HashMap、TreeMap和HashTable,HashMap是最常用的,它的底层数据结构是哈希表,解决哈希碰撞...

    JDK_API_1_6_zh_CN.zip

    HashSet和TreeSet实现了Set接口,提供无序和有序两种存储方式。HashMap和TreeMap则对应Map接口,前者基于哈希表,后者基于红黑树,保证了快速查找和排序。 三、多线程 Java 1.6在多线程方面提供了Thread类和...

    信息工程系Java专业实习报告

    实习初期,学生主要学习Java基础,包括线程Thread和集合Collection,如ArrayList、LinkedList、HashSet、TreeSet以及HashMap、TreeMap和HashTable等。线程是实现多用户并发操作的关键,而集合则涉及到数据的组织和...

    网络爬虫系统项目开发实践报告

    Set集合存储无序、不重复的对象,如HashSet和TreeSet;而Map集合则用于存储键值对,如HashMap和TreeMap。在项目中的ReadData类中,这些集合被用来处理和存储爬取的数据。 MySQL数据库作为数据存储的后端,项目中对...

    JDK_API_1_6中文版chm

    2. **集合框架**:在JDK 1.6中,集合框架得到了进一步完善,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)以及Queue(如ArrayDeque)等接口和实现类。此外,还有泛型...

    java学习图解

    6. **集合框架**: 集合框架是Java中用于存储和操作对象的重要工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)。理解它们的区别和应用场景是必要的。 7. **IO流*...

    Java SE 视频课程对应的代码 Java学习资料

    4. **集合框架**:Java集合框架包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)。理解它们的特性和使用场景,以及迭代器和泛型的概念,对于处理数据存储和检索至关重要...

    jdk_api_1_6_zh_cn

    例如,ArrayList和LinkedList提供了不同的性能特性,HashSet和TreeSet各有其排序规则。1.6还引入了ConcurrentHashMap,为多线程环境下的数据共享提供高效支持。 5. **泛型**:泛型是Java 1.5引入的新特性,1.6版本...

    Java基础自学笔记,全部的基础和心得

    主要包括List(有序且可重复的元素,如ArrayList和LinkedList)、Set(无序且不允许重复,如HashSet和TreeSet)和Map(键值对,如HashMap和TreeMap)。 六、输入输出流 Java的I/O流处理提供了一套完善的读写机制,...

    杭州师范大学JAVA程序设计课件虞歌老师

    4. **集合框架**:Java集合框架是存储和管理对象的重要工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)等接口和类,提供了丰富的操作方法。 5. **IO流**:Java...

    Java语言程序设计(基础篇)(第10版 梁勇著)教材源代码

    8. **集合框架**:Java集合框架包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)等数据结构,它们提供了存储和操作对象的高效方式。 9. **输入/输出流**:Java的I/O流...

    全新java初学者实践教程

    此外,集合框架是Java编程中的重要部分,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)接口及其实现类,它们用于存储和操作对象。 对于初学者来说,理解IO流和多...

    java学习的课件,大家看看

    5. **集合框架**:Java集合框架是存储和操作对象的重要工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)等接口,以及它们的实现类。 6. **IO流**:Java的IO流库...

    java jdk api 1.8048最新 中文 高清 CHM版

    2. **集合框架**:Java的集合框架是编程的核心部分,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)等接口及其实现。JDK 1.8引入了Lambda表达式和Stream API,极大地...

    Java2课程学习ppt及课后练习源程序

    4. **集合框架**:Java2的集合框架是一个强大的工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)等接口和类,学习如何操作和管理数据。 5. **输入/输出流**:...

    [Java.2.入门与实例教程]【升级版】

    5. **集合框架**:Java集合框架是处理对象数组的重要工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)。学习集合框架有助于提高代码的效率和可维护性。 6. **IO...

    java1.6.api

    2. **集合框架**:Java 1.6引入了完善的集合框架,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)等接口及其实现类。这些接口和类提供了高效的数据存储和操作方法。 ...

Global site tag (gtag.js) - Google Analytics