下面的第一个示例显示了将对象添加到集合中时的常见错误。由于集合中的每个元素都是唯一的,因此在添加任何对象之前,必须先将其与集合中的对象进行比较。
1.可比接口的常见错误
首先看一下下面的代码,该代码创建3条狗并将这些狗添加到TreeSet中。
import java.util.TreeSet;
class Dog {
int size;
Dog(int s) {
size = s;
}}
public class ImpComparableWrong {
public static void main(String[] args) {
TreeSet<Integer> i = new TreeSet<Integer>();
TreeSet<Dog> d = new TreeSet<Dog>();
d.add(new Dog(1));
d.add(new Dog(2));
d.add(new Dog(1));
i.add(1);
i.add(2);
i.add(3);
System.out.println(d.size() + " " + i.size());
}}
输出为:
run:
Exception in thread “main” java.lang.ClassCastException: Dog cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(TreeMap.java:542)
at java.util.TreeSet.add(TreeSet.java:238)
at ImpComparableWrong.main(ImpComparableWrong.java:17)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)
原因是Class Dog需要实现Comparable,以便TreeSet(保持其元素排序)能够包含Dog对象。无法将添加的对象与集合中当前的元素进行比较,add(Object)调用将引发ClassCastException。为了使对象具有可比性,用户定义的类必须实现Comparable接口。
2.为TreeSet实现Comparable的解决方案
以下是已更正的代码(实现Comparable):
import java.util.TreeSet;
class Dog implements Comparable {
int size;
Dog(int s) {
size = s;
}
public int compareTo(Dog o) {
return size - o.size;
}}
public class ImpComparable {
public static void main(String[] args) {
TreeSet<Dog> d = new TreeSet<Dog>();
d.add(new Dog(1));
d.add(new Dog(2));
d.add(new Dog(1));
TreeSet<Integer> i = new TreeSet<Integer>();
i.add(1);
i.add(2);
i.add(3);
System.out.println(d.size() + " " + i.size());
}}
输出:
run:
2 3
BUILD SUCCESSFUL (total time: 0 seconds)
3.比较器与可比
检查比较并找出何时使用。
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。