2014-12-31 1 views
0
class Point { 
    private int xPos, yPos; 

    public Point(int x, int y) { 
     xPos = x; 
     yPos = y; 
    } 
    public static void main(String[] args) { 
     System.out.println(new Point(10,20)); 
    } 
} 

Выход выше код возвращает тот же ИмяКласса @ шестигранной версию хэш-код объекта, хотя текст я имею в виду (Руководство по OCPJP С.Г. Ганеш и Tushar Шарма) указывает: «Шестнадцатеричное значение будет отличаться для каждого экземпляра». Разве я не понимаю это правильно?Java: ToString() печатает же Hashcode каждый раз

+1

Вы используете эту же программу снова и снова? Или вы имеете в виду, что вы создаете еще один экземпляр «Точка», но получаете такое же значение? –

+0

@ shree.pat18: Я запускаю ту же программу. – sk89

ответ

2

Попробуйте сделать два экземпляра,

System.out.println(new Point(10, 20)); 
System.out.println(new Point(10, 20)); 

и вы получите два различных hashCodes.

+0

Да, это произошло. Но я хочу понять, должен ли запускать оригинальную программу каждый раз давать мне одинаковый результат? – sk89

+0

@ sk89, конечно, может. Особенно, если это произойдет. –

3

Для hashCode#JavaDoc говорит

Всякий раз, когда он вызывается на одном объекте более чем один раз в течение выполнения приложения Java, метод хэш-код должен последовательно возвращать одинаковое число ...

Здесь вы говорите о [email protected], который останется таким же во время выполнения программы, но если вы снова и снова запускаете программу, вы можете получить это представление разным каждый раз или несколько раз, поскольку это зависит от хэш-кода и зависит от распределения памяти.

+0

, если это то же самое для многократного выполнения программы ?? – Prashant

0

Да! ... сделать два, как выше и попробовать ...

public static void main(String[] args) {System.out.println(new Point(10,20));} 

выше код создает один только ..

+1

почему вы написали это в ответ ??? вы можете прокомментировать – Prashant

+0

Просто для объяснения. –

0

Если вы будете запускать ту же программу несколько раз так что есть что он вернет тот же HashCode или другой HashCode для одного и того же объекта. это зависит от реализации вашего Hashcode().

Это целое число не обязательно должно оставаться последовательным от одного выполнения приложения до другого выполнения того же приложения.

+0

Я использую реализацию по умолчанию toString.Я просто хочу знать, останется ли вывод для множественного выполнения одной и той же программы. – sk89

+0

Да, что может быть одинаковым для нескольких исполнений, нет уверенности, когда он даст новый хэш-код. лучше вы можете переопределить hashCode() и написать некоторое выражение, которое поможет вам проверить вывод. – Prashant

2

Вы не можете предсказать hashCode, который будет вызываться по вашей ссылке, но вы можете обнаружить, что всегда hashcode будет уникальным. По умолчанию toString() печатает hashCode(), который ваш класс унаследовал от класса Object. Сначала вы должны знать, когда использовать хэш-код. Если вы напишете следующий код, вы увидите два разных хэш-кода реализации объекта hashCode(), которые вы наследуете.

public class Point { 

    private int xPos, yPos; 
    public Point(int x, int y) { 
     xPos = x; 
     yPos = y; 
    } 
    public static void main(String[] args) { 
     System.out.println(new Point(10,20)); 
     System.out.println(new Point(10,20)); 
    } 
} 

Но это не сработает, если вы хотите вставить свой объект в коллекции HashSet, HashMap. Для этого вы должны переопределить hashCode() в классе Point. Я не мог написать этот код, но переопределение hashCode() зависит от вашего собственного требования, которое я не знаю ...
Итак, наконец, я хотел сказать, что это хорошая практика для реализации hashCode(), toString(), equals() в каждой нашей индивидуальной классификации.