此类按名称排序,但当各种对象具有相同名称时会发生什么?
public class MyStuff implements Comparable<MyStuff> {
MyStuff(String n, int v){ name = n; value=v;}
String name; int value;
public int compareTo(MyStuff m){
return name.compareTo(m.name);
}
public String toString() { return name + " " + value + " ";}
public static void main(String[] args){
List<MyStuff> l = new ArrayList<MyStuff>();
MyStuff m0 = new MyStuff("hola",1);
MyStuff m1 = new MyStuff("hola",1);
MyStuff m2 = new MyStuff("hola",2);
MyStuff m3 = new MyStuff("hola",2);
l.add(m0);
l.add(m1);
l.add(m2);
l.add(m3);
Collections.sort(l);
System.out.println(l);
for(Object o: l) System.out.println(o.hashCode());
}
}
结果:
[hola 1 , hola 1 , hola 2 , hola 2 ]
21722195
12719253
30758157
12773951
哪个对象是第一个?取决于价值,哈希码..?
答案 0 :(得分:4)
正如java doc: Collections中指定的那样,public static <T extends Comparable<? super T>> void sort(List<T> list)
保证稳定。
通过稳定,它意味着:对于相等的对象,即比较返回0,相对顺序不会改变,即排序前左边的那个仍然在排序后的左边。
顺便说一句,正如java doc: Arrays中指定的那样,public static void sort(Object[] a)
也保证稳定。似乎在java.util
库中,当元素不是基元时,sort总是保证稳定性。
答案 1 :(得分:0)
没有。 哈希码与它无关。它是您添加到列表中的元素的顺序。
Collections.sort()
方法使用Arrays.sort()
ArrayList
mergesort
,compareTo returns >0
仅在{{1}}