StackTraceElement 数组的哈希码 returns 每次都有不同的值

StackTraceElement Array's hashcode returns different value each time

public static void main(String[] args) {
    try{
        throw new RuntimeException();
    }
    catch (Exception e){
        System.out.println(e.getStackTrace());
        System.out.println(e.getStackTrace());
        System.out.println(e.getStackTrace());
    }
    String[] sArray = new String[]{"a","b"};
    System.out.println(sArray);
    System.out.println(sArray);
    System.out.println(sArray);
}

以上程序return输出如下:

[Ljava.lang.StackTraceElement;@50040f0c
[Ljava.lang.StackTraceElement;@2dda6444
[Ljava.lang.StackTraceElement;@5e9f23b4
[Ljava.lang.String;@4783da3f
[Ljava.lang.String;@4783da3f
[Ljava.lang.String;@4783da3f

有人可以解释为什么 StackTraceElement[] 的哈希码(toString() 输出的最后 8 个字符)return 每次都不一样,因为数组没有得到改变了吗?

对于 String[] 没有更改。

每次都创建一个新数组。例如

public class TestClass{    
    public static void main(String[] args) {
        try{
            throw new RuntimeException();
        }
        catch (Exception e){
            System.out.println(e.getStackTrace());
            System.out.println(e.getStackTrace());
            System.out.println(e.getStackTrace());
        }


        System.out.println(new String[]{"a","b"});
        System.out.println(new String[]{"a","b"});
        System.out.println(new String[]{"a","b"});
    }
} 

虽然数组的内容没有改变,但是创建了一个新的数组object,这才是数组重要的地方hashCode()方法。

试试看底层数组项是否不变:

    try{
        throw new RuntimeException();
    }
    catch (Exception e){
        System.out.println(Arrays.hashCode(e.getStackTrace()));
        System.out.println(Arrays.hashCode(e.getStackTrace()));
        System.out.println(Arrays.hashCode(e.getStackTrace()));
    }