Как определить, является ли объект тем же самым или другим - PullRequest
3 голосов
/ 14 октября 2019

Я знаю, что this.toString() печатает не адрес объекта, а хеш-код. И я читал дискуссии, такие как этот , а также

Но , скажем, this.toString() печатает одно и то же значение в 2 случаях и другое значение в 3-м случае . Тогда , могу ли я сделать вывод, что объект в первых 2 случаях был одинаковым, а в третьем случае отличным?

Я пытаюсь определить ( только для тестирования ) если объект один и тот же или другой. Например, this указывает на один и тот же адрес или на другой.

Есть ли лучший способ проверить, является ли объект тем же или другим в Java, работающим на устройствах Android? Или, если бы я мог каким-то образом получить адрес объекта, тогда вся дилемма разрешена.

Ответы [ 3 ]

4 голосов
/ 14 октября 2019

Существует три основных способа сравнения двух объектов в Java:

  1. Сравнение ссылок на объекты (искомая)

    obj1 == obj2
    

    Это условиебудет истинным тогда и только тогда, когда обе ссылки указывают на один и тот же объект .

    CustomType obj1 = new CustomType();
    CustomType obj2 = ob1;
    boolean thisIsTrue = obj1 == obj2;
    

    , но:

    CustomType obj1 = new CustomType();
    CustomType obj2 = new CustomType();
    boolean thisIsFalse = obj1 == obj2;
    
  2. Сравнить данные объекта

    obj1.equals(obj2)
    

    Результат этого условия зависит от фактической реализации метода equals в классе obj1. Например, этот плохо спроектированный метод equals всегда будет возвращать false. Даже если obj1 и obj2 указывают на один и тот же объект.

    @Override
    public boolean equals(Object other){
        return false;
    }
    
    CustomType obj1 = new CustomType();
    CustomType obj2 = ob1;
    boolean thisIsTrue = obj1 == obj2;
    boolean thisIsFalse = obj1.equals(obj2);
    
  3. Сравните хэш-коды объекта

    obj1.hashCode() == obj2.hashCode()
    

    Результат этого условиязависит от фактической реализации метода hashCode для классов obj1 и obj2. Использование такого подхода не приветствуется, так как он еще менее надежен. Два совершенно разных объекта могут иметь одинаковый хеш-код. Он должен использоваться предусмотрительно и осторожно в некоторых конкретных случаях.

2 голосов
/ 14 октября 2019

Если вы хотите проверить равенство сообщений, вы должны использовать метод equals, доступный в объектном классе, который по умолчанию является суперклассом для всех классов в Java.

Давайте захотим проверить на Object Mapper. Вы можете сделать это, как показано ниже:

Mapper mapper = new Mapper();
Mapper mapper1 = mapper;
Mapper mapper2 = new Mapper();
mapper.equals(mapper1); //true
mapper.equals(mapper2); //false

Может быть два объекта с одинаковым hashcode, но они могут быть разными. Если вам нужна некоторая пользовательская логика проверки на равенство, вы должны переопределить hashcode и equals метод класса Object в вашем классе.

1 голос
/ 14 октября 2019

Самый простой способ определить, указывает ли ссылка на объект на тот же экземпляр, что и другая ссылка, - это использовать оператор ==:

yourRef1 == yourRef2

В качестве альтернативы, если вы хотите знать неизменяемую ссылкуобъект, вы можете использовать System.identityHashCode(yourObject):

Возвращает тот же хеш-код для данного объекта, который будет возвращен методом hashCode () по умолчанию, независимо от того, переопределяет ли класс данного объекта hashCode (),Хеш-код для нулевой ссылки равен нулю.

...