每次StackTraceElement数组的哈希码返回不同的值

时间:2019-06-27 16:24:06

标签: java arrays hashcode

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);
}

上面的程序返回以下输出:

[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个字符)为什么每次都返回不同的原因,因为数组没有改变吗?

String[]的相同之处没有得到改变。

1 个答案:

答案 0 :(得分:3)

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

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()));
    }