当您有某些疑问时,您可以随时尝试:
尝试 #1:让我们对对象列表进行排序
List<Object> list = Arrays.asList('a',2,3,5,'b',"ab","def");
Collections.sort(list);
结果:
error: no suitable method found for sort(List<Object>)
Collections.sort(list);
^
method Collections.<T#1>sort(List<T#1>) is not applicable
(inference variable T#1 has incompatible bounds
equality constraints: Object
lower bounds: Comparable<? super T#1>)
method Collections.<T#2>sort(List<T#2>,Comparator<? super T#2>) is not applicable
(cannot infer type-variable(s) T#2
(actual and formal argument lists differ in length))
where T#1,T#2 are type-variables:
T#1 extends Comparable<? super T#1> declared in method <T#1>sort(List<T#1>)
T#2 extends Object declared in method <T#2>sort(List<T#2>,Comparator<? super T#2>)
所以,普通的List<Object> 不能按原样排序。
尝试 #2。给定示例中的所有对象都是Comparable,所以让我们尝试对它们进行排序:
List<Comparable> list = Arrays.asList('a',2,3,5,'b',"ab","def");
Collections.sort(list);
它也不起作用:
Exception in thread "main" java.lang.ClassCastException: class java.lang.Character cannot be cast to class java.lang.Integer (java.lang.Character and java.lang.Integer are in module java.base of loader 'bootstrap')
at java.base/java.lang.Integer.compareTo(Integer.java:59)
at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
at java.base/java.util.Arrays.sort(Arrays.java:1249)
at java.base/java.util.Arrays.sort(Arrays.java:1436)
at java.base/java.util.Arrays$ArrayList.sort(Arrays.java:4405)
at java.base/java.util.Collections.sort(Collections.java:145)
因此,列表中的对象不应该只是Comparable,它们的类型必须是“兼容的”
尝试 #3。使用Object的一些现有方法来比较对象(例如toString或hashCode)
List<Object> list = Arrays.asList('a',2,3,5,'b',"ab","def");
list.sort(Comparator.comparingInt(Object::hashCode));
System.out.println("Sorted by hashCode: " + list);
list.sort(Comparator.comparing(Object::toString));
System.out.println("Sorted by toString: " + list);
输出:
Sorted by hashCode: [2, 3, 5, a, b, ab, def]
Sorted by toString: [2, 3, 5, a, ab, b, def]