`
Elvin.Chu
  • 浏览: 15057 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

排序之HashSet和TreeSet的区别

阅读更多
     众所周知,java中Set里的数据不可重复,并且具有排序性,当我们在项目中遇到需要去重复并且排序的需求时难免想起Set。Set的实现类中HashSet和TreeSet在我们的工作中使用最为频繁,HashSet要首当其冲,但是它并非万能的哦,同样是既要去重又要排序,但两者的区别就体现出来了。咱们看代码先:
public static void main(String[] args) {
		Set<CnfmSelectItem> hashSet = new HashSet<CnfmSelectItem>();
		CnfmSelectItem item = new CnfmSelectItem("(GP) Other Forecasted Item - CDM / DLN / RDLN");
		CnfmSelectItem item1 = new CnfmSelectItem("(GP) Other Forecasted Item - Freight");
		CnfmSelectItem item2 = new CnfmSelectItem("(GP) Other Forecasted Item - LES: Magic");
		CnfmSelectItem item3 = new CnfmSelectItem("(GP) Other Forecasted Item - Resident TA");
		CnfmSelectItem item4 = new CnfmSelectItem("(GP) Other Forecasted Item - TIL");
		CnfmSelectItem item5 = new CnfmSelectItem("(GP) Other Forecasted Item - CDM / DLN / RDLN");
		CnfmSelectItem item6 = new CnfmSelectItem("(GP) Other Forecasted Item - Resident TA");
		
		hashSet.add(item);
		hashSet.add(item1);
		hashSet.add(item2);
		hashSet.add(item3);
		hashSet.add(item4);
		hashSet.add(item5);
		hashSet.add(item6);
		System.out.println("***************This result using the HashSet collection.**************************\n");
		for (CnfmSelectItem cnfmSelectItem : hashSet) {
			System.out.println(cnfmSelectItem.getValue());
		}
		System.out.println("\n***************This result using the TreeSet collection.**************************\n");
		Set<CnfmSelectItem> treeSet = new TreeSet<CnfmSelectItem>();
		treeSet.addAll(hashSet);
		for (CnfmSelectItem cnfmSelectItem : treeSet) {
			System.out.println(cnfmSelectItem.getValue());
		}
	}


    CnfmSelectItem是javax.faces.model.SelectItem的封装类,在jsf框架中使用比较广泛,这里就不多说了。
***************This result using the HashSet collection.**************************

(GP) Other Forecasted Item - LES: Magic
(GP) Other Forecasted Item - Resident TA
(GP) Other Forecasted Item - CDM / DLN / RDLN
(GP) Other Forecasted Item - TIL
(GP) Other Forecasted Item - Freight

***************This result using the TreeSet collection.**************************

(GP) Other Forecasted Item - CDM / DLN / RDLN
(GP) Other Forecasted Item - Freight
(GP) Other Forecasted Item - LES: Magic
(GP) Other Forecasted Item - Resident TA
(GP) Other Forecasted Item - TIL


     从运行结果中不难看出HashSet和TreeSet的区别,也发现TreeSet在排序时更给力。

      下列总结来自互联网:
      HashSet
      此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
我们应该为要存放到散列表的各个对象定义hashCode()和equals();


      TreeSet
      此类实现 Set 接口,该接口由 TreeMap 实例支持。此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序,或按照在创建 set 时所提供的比较器进行排序。
是一个有序集合,元素中安升序排序,缺省是按照自然顺序进行排序,意味着TreeSet中元素要实现Comparable接口;
我们可以构造TreeSet对象时,传递实现了Comparator接口的比较器对象.

      相信大家对HashSet和TreeSet有了更深层的了解,工作中也能更好的使用它们啦。
分享到:
评论

相关推荐

    List 去重的6种方法(contains、迭代、hashSet、treeSet、linkedHashSet、stream)

    比较遗憾的是,TreeSet 虽然实现起来也比较简单,但它有着和 HashSet 一样的问题,会自动排序 5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新...

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    Java 对象排序详解.rar_java 对象排序_对象_排序

    Java 对象排序详解 本文主要关注排序Collection的ArrayList、HashSet、TreeSet,以及最后但并非最不重要的数组。

    day016-list和set笔记以及代码.zip

    HashSet:如果没有任何排序要求,用HashSet,因为效率高 TreeSet: 如果有排序要求用TreeSet, 如果是自然排序,需要元素实现Comparable接口,重写compareTo方法 如果是定制排序,需要创建TreeSet对象的时候,传入...

    Java 集合方面的面试题

    HashSet 和 TreeSet 有什么区别? HashMap 和 TreeMap 有什么区别? 什么是迭代器?如何使用它来遍历集合? 什么是 fail-fast 机制? 如何使用 Collections 类对集合进行排序? 什么是 Comparable 和 Comparator ...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    Java数据结构--13.Java8数据结构TreeSet 前⾔ ,上⼀篇中对 Set 接⼝最终实现类 HashSet 与 LinkedHashSet 做了介绍与分析,本篇将对另⼀种 Set 接⼝的最终实现类 TreeSet 进⾏ 介绍与分析。 先来看下 TreeSet 完整...

    java中的各种集合及其遍历总结(附完整例子)

    java中的各种集合及其遍历总结;例子包括:List(ArrayList、LinkList),Set(HashSet、TreeSet),Map(HashMap),还有一个集合排序的例子

    Java知识集.docx

    Java知识集是Java编程语言的核心概念和技术,涵盖了Java编程语言的基础知识、面向对象编程、...集合类:包括ArrayList、LinkedList、HashSet、TreeSet等集合类的使用。 反射机制:包括Class、Method、Field等类的使用。

    Java后端面试问题整理.docx

    • 熟悉常用集合数据结构(数组、Hashmap、ConcurrentHashMap、HashTable、ArrayList、Vetor、LinkedList、HashSet、TreeSet、LinkedHashSet),了解AVL、RBtree、B/B+树、跳表 • 熟悉常见异常分类以及处理,熟悉反射...

    JAVA SE 开发手册.CHM

    15、JAVA集合框架之Set接口、HashSet类、TreeSet类 16、JAVA集合框架之Map接口、HashMap类、Trelap类、Hashtable类 17、JAVA异常Exception 18、JAVA线程之基础介绍 19、I0流之基本简介 20、I0流之字符流、字节...

    程序员需要经常刷题吗-simple-java-zh-CN:SimpleJava是Java常见问题的集合。中文翻译

    HashSet 与 TreeSet 与 LinkedHashSet HashMap vs. TreeMap vs. HashTable vs. LinkedHashMap 按值排序地图 高效计数器 HashMap 常用方法。例如,按值排序 深入理解Arrays.sort(T[], Comparator &lt; ? super T &gt; c)...

    java-basic:java基础测试-java8

    1.核心接口:Iterator(迭代器接口)Iterable(可迭代接口) -&gt; Collection(集合接口)-&gt; List(列表,线性表接口) :ArrayList、LinkedList-&gt; Set(元素不重复的集合接口):HashSet、TreeSet-&gt; Queue(队列): ...

    java内核源码-JavaCompass:「Java指南针」为你学习Java指明方向。内容涵盖互联网Java工程师所需要掌握的核心知识,涉及J

    HashSet&TreeSet 索引技术 中文分词算法 Lucene 性能调优 JVM性能调优 JVM类加载机制详解 JVM内存模型 类字节码文件深度剖析 垃圾收集机制详解 十种垃圾收集器详解 JVM调优工具详解 GC日志详细分析 JVM调优实战 ...

    突破程序员基本功的16课.part2

    3.1.2 HashMap和HashSet 3.1.3 TreeMap和TreeSet 3.2 Map和List 3.2.1 Map的values()方法 3.2.2 Map和List的关系 3.3 ArrayList和LinkedList 3.3.1 Vector和ArrayList的区别 3.3.2 ArrayList和LinkedList...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     13.1.3 TreeSet类  13.1.4 向Set中加入持久化类的对象  13.2 List(列表)  13.3 Map(映射)  13.4 小结  13.5 思考题 第14章 映射值类型集合  14.1 映射Set(集)  14.2 映射Bag(包)  14.3 映射List...

    java编程练习题

    要求:对TreeSet中的元素"HashSet"、"ArrayList"、"TreeMap"、"HashMap"、"TreeSet"、"LinkedList"进行升序和倒序排列 3、使用TreeSet和Comparator,写TreeSetTest2 要求:对TreeSet中的元素1,2,3,4,5,6,7,8...

    set.list.map接口

    2. 两个实现类HashSet(LinkHashSet)和TreeSet,TreeSet有排序功能(Set set=new TreeSet();set.add(new Integer(8)); set.add(new Integer(4)); set.add(new Integer(7));)输出后的结果是:4 7 8 Eg: package test...

    关于Set集合

    无序:添加顺序和存储顺序不一致,【不代表有排序效果】 不可重复: 在一个Set集合中不能出现相同元素 interface Set --| class HashSet 底层是哈希表存储数据 --| class TreeSet 底层存储数据是一个二叉树 1.2 ...

Global site tag (gtag.js) - Google Analytics