1、我们知道在集合中,如果需要保持集合中的元素有序,则可以使用TreeSet集合。
2、TreeSet判断元素重复的方法和HashSet一样,但同时它还会保持集合中元素处于有序状态。
3、如果直接使用TreeSet的默认无参构造函数,则其工作起来会像使用sort()方法一样使用其中元素的compareTo()方法进行排序,所以此时其中的元素必须实现Comparable接口,并覆盖其中的CompareTo()方法(定义对象的比较规则)。
实例一:
package com.linwei; import java.util.TreeSet; public class TestTreeSetString { public static void main(String[] args) { new TestTreeSetString().go(); } public void go(){ //String已实现Comparable接口,所以TreeSet使用String类覆写的compareTo()方法进行大小比较 TreeSet<String> tree =new TreeSet<String>(); tree.add("b"); tree.add("c"); tree.add("g"); tree.add("e"); tree.add("a"); tree.add("f"); System.out.println(tree); } } 执行输出:[a, b, c, e, f, g]
由于String类已经实现了Comparable接口,所以在TreeSet中可以直接使用,但如果是自定义的类,则必须自己实现Comparable接口,并覆盖compareTo()方法,编写自定义的比较规则。
再看下以下实例二:
package com.linwei; import java.util.TreeSet; public class TestTreeSet { public static void main(String[] args) { new TestTreeSet().go(); } public void go(){ Book b1=new Book("How"); Book b2=new Book("Remix"); Book b3=new Book("Finding"); TreeSet<Book> tree =new TreeSet<Book>(); tree.add(b1); tree.add(b2); tree.add(b3); System.out.println(tree); } class Book { String title; public Book(String t){ this.title=t; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { return "Book [title=" + title + "]"; } } }
问题一:以上程序代码能否通过编译?
答:能。
问题二:以上程序能否顺利执行?最终的执行结果是什么?
答:不能。
执行结果:Exception in thread "main" java.lang.ClassCastException: com.linwei.TestTreeSet$Book cannot be cast to java.lang.Comparable。
结果说明:很明显,异常是说Book对象不能转换为Comparable接口类型。
解决方法:修改Book类,实现Comparable接口,并覆盖其compareto()方法。
修改后代码如下实例二(修正):
package com.linwei; import java.util.TreeSet; public class TestTreeSet { public static void main(String[] args) { new TestTreeSet().go(); } public void go(){ Book b1=new Book("How"); Book b2=new Book("Remix"); Book b3=new Book("Finding"); TreeSet<Book> tree =new TreeSet<Book>(); tree.add(b1); tree.add(b2); tree.add(b3); System.out.println(tree); } class Book implements Comparable<Book>{ String title; public Book(String t){ this.title=t; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public int compareTo(Book b) { return getTitle().compareTo(b.getTitle()); } @Override public String toString() { return "Book [title=" + title + "]"; } } } 执行结果:[Book [title=Finding], Book [title=How], Book [title=Remix]]
4、如果使用TreeSet带Comparator类型参数的构造函数,则必须另外单独创建一个专门的比较器对象(实现Comparator接口,并覆盖其中的compare()方法)。
实例三:
package com.linwei; import java.util.Comparator; import java.util.TreeSet; public class TestTreeSet2 { public static void main(String[] args) { new TestTreeSet2().go(); } public void go(){ Book b1=new Book("How"); Book b2=new Book("Remix"); Book b3=new Book("Finding"); //需传入一个Comparator类型的比较器对象 TreeSet<Book> tree =new TreeSet<Book>(new BookComparator()); tree.add(b1); tree.add(b2); tree.add(b3); System.out.println(tree); } class Book { String title; public Book(String t){ this.title=t; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { return "Book [title=" + title + "]"; } } class BookComparator implements Comparator<Book>{ @Override //覆写compare()方法,根据书名进行大小比较 public int compare(Book b1, Book b2) { return b1.getTitle().compareTo(b2.getTitle()); } } } 执行结果:[Book [title=Finding], Book [title=How], Book [title=Remix]]
相关推荐
在Java编程中,集合框架是处理数据的重要工具,而`TreeSet`作为其中之一,它是一个有序、不包含重复元素的集合。本知识点主要探讨如何利用Java的`TreeSet`类来实现两个集合的并集算法。 `TreeSet`是基于红黑树(Red...
TreeSet 红黑树结构算法是 Java 中的一种数据结构,它是基于红黑树数据结构的实现。红黑树是一种自平衡的排序二叉树,它可以保证快速检索指定节点。TreeSet 和 TreeMap 之间存在着紧密的关系,下面我们将详细讲解 ...
在使用TreeSet类时,需要注意的是,TreeSet类没有get方法,因此不能通过print方法直接输出结果,而是通过foreach循环或者迭代器输出。同时,TreeSet类需要我们自己去实现Comparable接口,重写compareTo()方法,以...
HashSet 和 TreeSet 是 Java 中两个常用的集合类,它们都实现了 Set 接口,但它们之间有很大的区别。本文将详细介绍 HashSet 和 TreeSet 的区别,帮助大家更好地理解和使用这些集合类。 HashSet HashSet 是一个...
7. **并发考虑**:如果在多线程环境中使用TreeSet,需要使用ConcurrentSkipListSet,因为TreeSet不是线程安全的。 8. **自定义排序**:通过传递Comparator实例给TreeSet构造函数,可以自定义元素的排序方式。 9. *...
HashSet和TreeSet都是Java集合框架中的Set接口实现,用于存储不重复的元素。但是,它们在使用方法和实现机理上有很大的区别。 首先,从使用方法上讲,HashSet和TreeSet都可以用于存储不重复的元素,但是它们在元素...
* 每种集合类中都提供它独有的 API 函数,在程序中使用正确集合类可以提高开发的效率 2. 集合的输出 * 使用迭代器(Iterator 接口)将集合对象实例转换成 Iterator 对象实例,然后利用 Iterator 中的函数进行输出 * ...
例如,集合框架是Java编程中非常重要的部分,它包括了List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Map(如HashMap和TreeMap)等接口和实现,这些容器类帮助我们组织和管理数据。 在实际开发中,...
4. 考虑线程安全,如果在多线程环境中使用,可以考虑使用并发集合,如 CopyOnWriteArraySet 或使用Collections.synchronizedSet() 封装 HashSet。 5. 在内存使用上,TreeSet 由于维护排序关系,可能会占用比 HashSet...
在阅读文档时,不仅要看每个类和方法的描述,还要注意它们的参数、返回值和可能抛出的异常,这有助于深入理解其工作原理和使用场景。同时,通过实践编写代码,结合API文档解决问题,是巩固知识的最好方式。
在Java编程过程中,掌握一些关键的注意事项至关重要,这不仅能提高代码质量,还能避免常见的编程陷阱。以下是一些关于"JAVA注意事项"的详细说明: 1. **命名规范**:Java有严格的命名规则,类名应使用驼峰式命名,...
TreeSet是Java集合框架中的一种有序集合,它基于红黑树数据结构实现,因此具有O(log n)的插入、删除和查找效率。TreeSet提供两种排序方式:自然排序和定制排序。 1. 自然排序: 自然排序是TreeSet默认的排序方式。...
当我们谈论"Java中Tree的序列化"时,我们通常指的是如何将树形数据结构(如`TreeSet`,`TreeMap`等)转换为字节序列,然后可以将其写入磁盘或通过网络发送。 `Tree`类(通常是指`java.util.TreeSet`或`java.util....
12. **泛型(Generics)**:Java 5引入了泛型,增强了类型安全,允许在类、接口和方法中使用类型参数。 13. **枚举(Enum)**:枚举类型是预定义的一组值,提供了更好的类型安全性和代码可读性。 14. **国际化...
本篇文章将详细讲解Java中的基本集合类ArrayList、LinkedList和Vector,以及HashSet和TreeSet。 1. ArrayList ArrayList是基于动态数组实现的集合类,它允许存储重复元素。默认初始容量为10,当添加元素超过容量时...
"Java集合知识点汇总" ...* Web开发:使用Java集合来存储和操作Web应用程序中的数据。 Java集合是Java语言中的一种重要数据结构,广泛应用于各种领域。理解Java集合的知识点对于Java开发者来说是非常重要的。
在Java编程中,Set接口是集合框架的一部分,它继承自Collection接口,主要用于存储不包含重复元素的集合。Set接口的实现类主要有HashSet、TreeSet和LinkedHashSet,它们各自有不同的特性和使用场景。 1. **HashSet*...
总的来说,Java集合框架是Java编程中不可或缺的一部分,理解和熟练掌握其原理与使用方法,对于提升代码质量、优化程序性能具有重要意义。在日常开发中,我们需要根据具体需求灵活运用各种集合类和接口,以实现高效的...
而在Java中,集合使用BitSet、HashSet、TreeSet等类,例如:`BitSet option = new BitSet();option.set('a');option.set('b');`。需要注意的是,在Java中,集合元素必须唯一,每个元素都必须定义equals函数和...
Java集合框架是Java编程语言中一个非常重要的组成部分,它为开发者提供了存储和管理对象的统一方式。这个框架包括了一系列接口、抽象类以及实现类,帮助程序员处理各种数据结构,如列表、集合、映射等。 首先,我们...