Вопрос об исключениях Object Identity, Object Equality и String - PullRequest
3 голосов
/ 01 декабря 2009

Это вопрос по Java и C #. Мы все знаем, что Object Identity (==) проверяет, ссылаются ли два объекта на одно и то же местоположение, а Obejct Equality (метод Equals) проверяет, имеют ли два разных (не идентичных) объекта одинаковое значение. Равенство объектов одинаковы. Например, ниже два логических выражения в операторах if, возвращающих true

string a="123";
string b="123";
if(a==b)
if(a.Equals(b))

Почему это так ?? Что является рациональным за этим дизайнерским решением?

Ответы [ 4 ]

4 голосов
/ 01 декабря 2009

Java и C # используют технику экономии памяти, которая называется интернирование строк . Поскольку строки в этих языках неизменны, они могут объединять часто используемые строки (включая жестко закодированные строковые литералы, как в вашем примере) и использовать несколько ссылок на эту одну строку в памяти для экономии места.

3 голосов
/ 21 июля 2011

Насколько я знаю, в .net оператор == для строк перегружен, чтобы использовать Equals() вместо идентификатора объекта. Подробности смотрите в этом объяснении: http://www.dotnetperls.com/string-equals

Если вам нужно знать, действительно ли это один и тот же объект, используйте это:

Object.ReferenceEquals(string1, string2)
2 голосов
/ 01 декабря 2009

На самом деле, по крайней мере в Java, существует механизм кэширования строк. Подводный камень в том, что две равные строки иногда будут, но не всегда, возвращать true при применении оператора тождества. следующий код печатает false:

String a="123";
String b="12";
b=b+"3";
System.out.println(a==b);
0 голосов
/ 01 декабря 2009

Если вы действительно хотите убедиться, что a.equals(b) == true, но (a==b) == false имеет значение false для двух строк a и b, то вы можете использовать полностью недооцененный (^^) конструктор строки:

String a = new String("abc");
String b = new String("abc");
if (a.equals(b)) {
   doTheyAreEqual();
   if (a != b) {
     doButNotTheSame();
   }
}
...