Java Collections.sort哈希代码

Java Collections.sort哈希代码,java,Java,为什么下面的代码在调用集合排序方法时打印不同的哈希代码 请告诉我为什么会有这种行为 List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add((int) (Math.random() *100)); } System.out.println("Before List =" + list); Syste

为什么下面的代码在调用集合排序方法时打印不同的哈希代码 请告诉我为什么会有这种行为

    List<Integer> list = new ArrayList<>();

    for (int i = 0; i < 10; i++) {

        list.add((int) (Math.random() *100));

    }

    System.out.println("Before List =" + list);

    System.out.println("object hashcode-1 =" + list.hashCode());

    Collections.sort(list);

    System.out.println("In >>> object hashcode-1 =" + list.hashCode());
    Collections.sort(list,new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return (o1.intValue() > o2.intValue() ?-1:1);
        }
    });
    System.out.println("object hashcode-2 =" + list.hashCode());
    System.out.println("After List =" + list);
    Collections.sort(list,Collections.reverseOrder());
    System.out.println("object hashcode-3 =" + list.hashCode());
    System.out.println("Reverse Order List =" + list);
关于

ArrayList#hashCode
(实际在中实现)根据列表元素的顺序计算哈希值:

public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}
您可以看到,在将每个元素的哈希代码添加到总数之前,需要将之前的总数乘以31。按不同顺序添加元素的哈希代码将得到不同的结果。

ArrayList#hashCode
(实际在中实现)根据列表元素的顺序计算哈希值:

public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}

您可以看到,在将每个元素的哈希代码添加到总数之前,需要将之前的总数乘以31。以不同的顺序添加元素的哈希代码将得到不同的结果。

列表是有序集合。这意味着带有
[1,2]
的列表不等于列表
[2,1]
,hashCode()也不应该相同(理想情况下)


对集合进行排序时,会更改集合的顺序,从而更改集合的哈希代码。注意:并非所有类型都保证这一点。e、 g.公式
((x+y)&0xffffffffff)+y的所有长度列表是一个有序集合。这意味着带有
[1,2]
的列表不等于列表
[2,1]
,hashCode()也不应该相同(理想情况下)


对集合进行排序时,会更改集合的顺序,从而更改集合的哈希代码。注意:并非所有类型都保证这一点。e、 g.公式的所有长度
((x+y)&0xFFFFFFFF)+y您看到的输出是什么?你的预期产量是多少?另外,您有没有研究过
ArrayList#hashCode()
方法的源代码?它取决于列表中元素的顺序。因为你最终得到的是一个不同的列表。奥利-我不这么认为,它是一个不同的列表对象。@Rishi:当然,它是一个具有不同值的不同对象。你看到的输出是什么?你的预期产量是多少?另外,您有没有研究过
ArrayList#hashCode()
方法的源代码?它取决于列表中元素的顺序。因为你最终得到的是一个不同的列表。奥利-我不这么认为,它是一个不同的列表对象。@Rishi:当然,它是一个具有不同值的不同对象。
List<Long> l1 = Arrays.asList(-1L, 0L, (1L << 32) + 1, (2L << 32) + 2);
List<Long> l2 = Arrays.asList((2L << 32) + 2, (1L << 32) + 1, 0L, -1L);
System.out.println(l1.hashCode());
System.out.println(l2.hashCode());
923521
923521