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[]
的相同之处没有得到改变。
答案 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()));
}