== или.Equals ()

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

59
задан Dimitri C. 26 August 2010 в 10:42
поделиться

9 ответов

== тест идентификационных данных. Это возвратит true, если два протестированные объекта будут на самом деле тем же объектом. Equals() выполняет тест равенства и возвратит true, если два объекта считают себя равными.

тестирование Идентификационных данных быстрее, таким образом, можно использовать его, когда нет никакой потребности в более дорогих тестах равенства. Например, выдерживая сравнение с null или пустая строка.

возможно перегрузить любой из них для обеспечения различного поведения - как тестирование идентификационных данных на Equals() - но ради кого-либо читающего код, не делайте.

<час>

Указанный ниже: некоторые типы как String или DateTime обеспечивают перегрузки для == оператор, которые дают ему семантику равенства. Таким образом, точное поведение будет зависеть от типов объектов, которые Вы сравниваете.

<час>

См. также:

58
ответ дан dtb 24 November 2019 в 18:22
поделиться

Миллисемья @John:

Указанный ниже: некоторые типы значения как DateTime обеспечивают перегрузки для == оператор>, которые дают ему семантику равенства. Таким образом, точное поведение будет зависеть от типов>, возражает, что Вы выдерживаете сравнение.

Для разработки:

DateTime реализован как структура. Все структуры являются детьми Системы. ValueType.

Начиная с Системы. Дети ValueType живут на стеке, нет никакого ссылочного указателя на "кучу", и таким образом никакого способа сделать проверку ссылки, необходимо сравнить объекты значением только.

Система. ValueType переопределяет.Equals () и == для использования основанной на отражении проверки равенства, это использует отражение для сравнения каждого полевого значения.

, поскольку отражение является несколько медленным при реализации собственной структуры важно переопределить.Equals () и добавить собственный код проверки значения, поскольку это будет намного быстрее. Только назовите основу. Равняется ();

20
ответ дан FlySwat 24 November 2019 в 18:22
поделиться

Всем остальным в значительной степени покрыли Вас, но у меня есть еще один небольшой совет. Время от времени Вы получите кого-то, кто клянется на его жизни (и те из его любимых), что .Equals более эффективная/лучше/лучшая практика или некоторая другая догматическая строка. Я не могу говорить с эффективностью (хорошо, хорошо, при определенных обстоятельствах, я могу), но я могу говорить с большой проблемой, которая неожиданно возникнет: .Equals требует объекта существовать. (Звучит глупым, но это отбрасывает людей.)

Вы не можете сделать следующего:

StringBuilder sb = null;
if (sb.Equals(null))
{
    // whatever
}

Это кажется очевидным для меня, и возможно большинства людей, которых Вы получите NullReferenceException. Однако сторонники .Equals лет забывают о том небольшом фактоиде. Некоторые даже "брошены" прочь (извините, не мог сопротивляться), когда они видят, что NullRefs начинает открываться.

(И за годы до регистрация DailyWTF, я действительно на самом деле работал с кем-то, кто передал под мандат , который все равенство проверяет быть .Equals вместо ==. Даже доказательство его погрешности не помогло. Мы просто убедились чертовски для нарушения всех его других правил так, чтобы никакая ссылка, возвращенная из метода, ни свойства, никогда не была пустой, и оно удалось в конце.)

15
ответ дан Joe Clay 24 November 2019 в 18:22
поделиться

== обычно "идентификационные данные", равняется значению "объекта на самом деле того же самого объекта в памяти как объект b".

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

, Если у Вас был общеизвестный класс Человека со свойствами "Name" и "Address" и Вы хотели использовать этого Человека в качестве ключа в Хеш-таблицу, содержащую больше информации о них, необходимо будет реализовать, равняется () (и хеш) так, чтобы Вы могли создать экземпляр Человека и использовать его в качестве ключа в Хеш-таблицу для получения информации.

Используя == один, Ваш новый экземпляр был бы не быть тем же.

6
ответ дан Joshua DeWald 24 November 2019 в 18:22
поделиться

Согласно MSDN:

В C#, существует два различных видов равенства: ссылочное равенство (также известный как идентификационные данные) и равенство значения. Равенство значения является обычно понимаемым значением равенства: это означает, что два объекта содержат те же значения. Например, два целых числа со значением 2 имеют равенство значения. Ссылочное равенство означает, что нет двух объектов выдержать сравнение. Вместо этого существует две ссылки на объект, и они оба обращаются к тому же объекту.

...

По умолчанию, оператор == тестирует на ссылочное равенство путем определения, указывают ли две ссылки на тот же объект.

3
ответ дан Jason Olson 24 November 2019 в 18:22
поделиться

Пример - то, потому что класс, DateTime реализует интерфейс IEquatable, который реализует "определенный для типа метод для определения равенства экземпляров". согласно MSDN.

2
ответ дан Peter K. 24 November 2019 в 18:22
поделиться

Другая вещь учесть: == оператор не может быть вызываемым или может иметь различное значение при доступе к объекту с другого языка. Обычно, лучше иметь альтернативу, которая может быть позвана по имени.

2
ответ дан Jason Baker 24 November 2019 в 18:22
поделиться

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

1
ответ дан Jasper 24 November 2019 в 18:22
поделиться

Я видел Объект. ReferenceEquals () используемый в случаях, где каждый хочет знать, относятся ли две ссылки к тому же объекту

1
ответ дан GregUzelac 24 November 2019 в 18:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: