Хеш-код массива StackTraceElement каждый раз возвращает разные значения - PullRequest
2 голосов
/ 27 июня 2019
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[] (последние 8 символов вывода toString())каждый раз по-разному, так как массив не изменяется?

То же самое не изменяется для String[].

1 Ответ

3 голосов
/ 27 июня 2019

Создает новый массив каждый раз. Е.Г.

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

Пока содержимое массива не изменяется, создается новый массив объект , и вот что важно для метода 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()));
    }
...