TreeSet类的常见误用
来源:互联网 发布:卢比奥生涯数据 编辑:程序博客网 时间:2024/05/22 11:50
一 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()方法,总是返回truepublic boolean equals(Object obj){return true;}// 重写了compareTo(Object obj)方法,总是返回1public 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变量,将看到也变成了9System.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集合中元素的关键实例变量。
- TreeSet类的常见误用
- 多重继承的常见误用
- 从误用TreeSet到思考Java有序集合对相等和顺序比较一致性的要求
- TREEset的模板类
- TreeSet类的排序
- 浅析Java集合类源码(三)--- TreeSet, TreeMap 及 常见集合类的比较
- 内存优化的误用
- 误用的函数
- C++的memset误用
- 一个变量的误用。
- 数组的误用
- 缓存的误用
- java异常的误用
- UIViewController的误用
- UIViewController的误用
- UIViewController的误用
- ParameterMap, ParameterType的误用
- UIViewController的误用
- Set集合另一强悍的类LinkedHashSet
- JNI中文手册
- 强大的排序集合类TreeSet
- TreeSet类的排序
- 关于CSDN登录提示手机号验证的问题
- TreeSet类的常见误用
- Numpy详细教程
- 专为枚举类设计的集合类EnumSet
- 根据文档批量复制文件
- Git学习笔记03_用Git和GitHub管理项目仓库记录
- C#去除字符串中的中文、字母、数字
- 勤写案例,防止遗忘
- 允许重复的子接口List
- redis 环境安装