一 TreeSet类的误用一
1 代码示例
import java.util.*;
class Err{}
public class TreeSetErrorTest
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
// 向TreeSet集合中添加两个Err对象
ts.add(new Err());
ts.add(new Err()); //①
}
}
2 运行结果
E:\test\Java\Java8\Java8\src>java TreeSetErrorTest
Exception in thread "main" java.lang.ClassCastException: Err cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at TreeSetErrorTest.main(TreeSetErrorTest.java:11)
3 代码说明
上面代码试图向TreeSet集合中添加两个Err对象,添加第一个对象时,TreeSet里没有任何元素,所以不会出现任何问题,当向TreeSet集合添加第二个Err对象时,TreeSet就会调用该对象的compareTo(Object obj)方法与集合中的其他元素进行比较,如果对应的类没有实现Comparable接口,则会引发ClassCastException异常。因此上面程序将会在①代码处引发该异常。
二 TreeSet类的误用二
1 代码示例
import java.util.*; public class TreeSetErrorTest2 { public static void main(String[] args) { TreeSet ts = new TreeSet(); // 向TreeSet集合中添加两个对象 ts.add(new String("Java")); //ts.add(new String("Linux")); ts.add(new Date()); // ① System.out.println(ts); } }
2 运行结果
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
at java.util.Date.compareTo(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at TreeSetErrorTest2.main(TreeSetErrorTest2.java:12)
3 代码说明
从运行结果来看,因为添加的两个对象的类型不一致,所以抛出了异常。如果希望TreeSet正常工作,TreeSet只能添加同一种类型的对象。
三 TreeSet类的误用三
1 代码示例
import java.util.*; class Z implements Comparable { int age; public Z(int age) { this.age = age; } // 重写equals()方法,总是返回true public boolean equals(Object obj) { return true; } // 重写了compareTo(Object obj)方法,总是返回1 public int compareTo(Object obj) { return 1; } } public class TreeSetTest2 { public static void main(String[] args) { TreeSet set = new TreeSet(); Z z1 = new Z(6); set.add(z1); // 第二次添加同一个对象,输出true,表明添加成功 System.out.println(set.add(z1)); //① // 下面输出set集合,将看到有两个元素 System.out.println(set); // 修改set集合的第一个元素的age变量 ((Z)(set.first())).age = 9; // 输出set集合的最后一个元素的age变量,将看到也变成了9 System.out.println(((Z)(set.last())).age); } }2 运行结果
true
[Z@1db9742, Z@1db9742]
9
3 代码说明
从运行结果来看,可以得出一个规则:如果两个对象通过equals()方法比较返回true时,这两个对象通过compareTo()方法比较应该返回0。
四 TreeSet类的误用四
1 代码示例
import java.util.*; class R implements Comparable { int count; public R(int count) { this.count = count; } public String toString() { return "R[count:" + count + "]"; } // 重写equals方法,根据count来判断是否相等 public boolean equals(Object obj) { if (this == obj) { return true; } if(obj != null && obj.getClass() == R.class) { R r = (R)obj; return r.count == this.count; } return false; } // 重写compareTo方法,根据count来比较大小 public int compareTo(Object obj) { R r = (R)obj; return count > r.count ? 1 : count < r.count ? -1 : 0; } } public class TreeSetTest3 { public static void main(String[] args) { TreeSet ts = new TreeSet(); ts.add(new R(5)); ts.add(new R(-3)); ts.add(new R(9)); ts.add(new R(-2)); // 打印TreeSet集合,集合元素是有序排列的 System.out.println(ts); // ① // 取出第一个元素 R first = (R)ts.first(); // 对第一个元素的count赋值 first.count = 20; // 取出最后一个元素 R last = (R)ts.last(); // 对最后一个元素的count赋值,与第二个元素的count相同 last.count = -2; // 再次输出将看到TreeSet里的元素处于无序状态,且有重复元素 System.out.println(ts); // ② // 删除实例变量被改变的元素,删除失败 System.out.println(ts.remove(new R(-2))); // ③ System.out.println(ts); // 删除实例变量没有被改变的元素,删除成功 System.out.println(ts.remove(new R(5))); // ④ System.out.println(ts); } }2 运行结果
E:\test\Java\Java8\Java8\src>java TreeSetTest3
[R[count:-3], R[count:-2], R[count:5], R[count:9]]
[R[count:20], R[count:-2], R[count:5], R[count:-2]]
false
[R[count:20], R[count:-2], R[count:5], R[count:-2]]
true
[R[count:20], R[count:-2], R[count:-2]]
3 代码说明
为了让程序更加健壮,推荐不要修改TreeSet集合中元素的关键实例变量。
相关推荐
Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类...
Java TreeSet类的简单理解和使用 Java TreeSet类是Set接口的一个实现类,主要作用是用于对对象的排序以及确定存入对象的唯一性。TreeSet类可以自动地对存入的对象进行排序,并且保证存入的对象的唯一性。 在使用...
使用TreeSet和Comparator,编写TreeSetTest2类,要求对TreeSet中的元素1-元素10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列。 如果需要的话可以下载,有写成文章的。有写了一点中文...
TreeSet 红黑树结构算法 TreeSet 红黑树结构算法是 Java 中的一种数据结构,它是基于红黑树数据结构的实现。红黑树是一种自平衡的排序二叉树,它可以保证快速检索指定节点。TreeSet 和 TreeMap 之间存在着紧密的...
这个方法源自`Comparable`接口,任何希望在TreeSet中进行排序的类都应当实现这个接口。在`compareTo()`方法中,需要定义比较规则,通常比较的是对象的属性。例如,对于数值类型,可以按照数值大小比较;对于字符串,...
介绍TreeSet集合用法,向TreeSet集合中添加类的对象,此类需实现Comparable接口,有实例,供需要的朋友下载学习。
在Java集合框架中,`TreeSet`是一个有序、不可重复的集合,它基于红黑树(Red-Black Tree)数据结构实现。`TreeSet`在许多场景下比其他集合如`ArrayList`或`HashSet`更有优势,因为它的元素总是按特定顺序排列,并且...
HashSet和TreeSet是Java集合框架中的两种重要数据结构,它们都是Set接口的实现类,用于存储不重复的元素。在编程实践中,理解它们的区别和应用场景至关重要。 HashSet是基于HashMap实现的,它不保证元素的顺序,...
此外,`Library`类可以有一个`TreeSet<Book>`成员变量来存储所有图书,其中`Book`类代表单本书的信息。 2. **进书,借书卡办理** - **进书**:当新书入库时,可以创建一个`Book`对象,然后将其添加到`Library`的`...
`TreeSet`是Java集合框架中的一个类,它继承自`AbstractSet`并实现了`NavigableSet`接口。`TreeSet`的主要特点就是它会自动按照一定的顺序对存储的元素进行排序。在这个场景下,我们使用`TreeSet`来实现学生成绩的...
本知识点主要探讨如何利用Java的`TreeSet`类来实现两个集合的并集算法。 `TreeSet`是基于红黑树(Red-Black Tree)的数据结构实现的,它提供了高效的插入、删除和查找操作,同时保持集合中的元素有序。红黑树是一种...
java提供了一个Comparable接口,该接口里定义了一个compareTo(Objectobj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大小。当一个对象调用该方法与另一个对象进行...
在代码示例中,可以看到`SmileCollections`类分别测试了`TreeSet`和`HashMap`的用法。对于`TreeSet`,虽然尝试添加了多个相同的`Student`对象,但由于`TreeSet`不允许重复元素,最终集合中只会保留一个元素。对于`...
在具体实现时,我们可能会创建一个`Card`类表示扑克牌,包含花色和点数属性,并重写`Comparable`接口或提供`Comparator`来确定扑克牌的排序规则。然后,创建一个`TreeSet<Card>`实例来存储和管理所有的牌。当需要...
在Java编程语言中,集合框架是处理数据的重要组成部分,其中`HashSet`和`TreeSet`是两种常用的Set接口实现类。它们各自具有独特的特性和用途,理解它们的区别对于编写高效且正确的代码至关重要。 首先,`HashSet`是...
TreeSet 是 Java 中的一个集合类,它实现了 SortedSet 接口,并且使用红黑树作为底层数据结构。TreeSet 具有以下主要特点: 排序性:TreeSet 中的元素是有序的,默认按照元素的自然顺序进行排序。或者,可以在创建 ...
标题中的"(TreeSet) s.subSet(608, true, 611, true)"是一个Java编程中关于TreeSet集合的操作。TreeSet是Java集合框架中的一种有序、可重复的元素集合,它实现了SortedSet接口,内部基于红黑树(Red-Black Tree)...
在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...
public int compare(String o1,String o2) { return o1.length()-o2.length();... TreeSet ts = new TreeSet(com); ts.add("string"); ts.add("char"); ts.add("nothing�"); System.out.println(ts);