Если метод equals
реализован правильно, как того требует javadoc Object:
- Это рефлексивно: для любого ненулевого ссылочного значения x, x.equals (x) должно возвращать true.
- Это симметрично: для любых ненулевых ссылочных значений x и y x.equals (y) должно возвращать true тогда и только тогда, когда y.equals (x) возвращает true .
- Это транзитивно: для любых ненулевых ссылочных значений x, y и z, если x.equals (y) возвращает true, а y.equals (z) возвращает true, тогда x.equals (z) должен вернуть true .
- Это непротиворечиво: для любых ненулевых ссылочных значений x и y множественные вызовы x.equals (y) последовательно возвращают true или последовательно возвращают false, при условии что никакая информация, используемая в сравнениях сравнения объектов, не изменяется.
- Для любого ненулевого ссылочного значения x, x.equals (null) должен возвращать false.
мы можем сделать вывод, что x.equals (z) должно быть ложным.
Докажите, если equals()
транзитивно и симметрично, x.equals (y) равно false, а y.equals (z) равно true:
1) предполагая, что x.equals (z) истинно;
2) z.equals (y) верно (симметрия);
1 + 2) x.equals (y) верно (переходные 1 и 2)
но x.equals (y) задано как false, поэтому число 1 или номер 2 должно быть неправильным, то есть x.equals (z) равно false или функция не симметрична.
Но если equals()
не реализовано симметрично, вы ничего не можете сказать о результате x.equals (z) (см. Другие ответы; мой комментарий к ответу @Stephen C)