Pregunta sobre Identidad de objeto e Igualdad de objeto y excepción de clase de cadena

StackOverflow https://stackoverflow.com/questions/1824540

  •  22-07-2019
  •  | 
  •  

Pregunta

Esta es una pregunta de Java y C #. Todos sabemos que, Identidad de Objeto (==) prueba si dos objetos se refieren a la misma ubicación y Obejct Equality (método de Igualdad) prueba si dos objetos diferentes (no idénticos) tienen el mismo valor. La igualdad de objetos es la misma. Por ejemplo, por debajo de dos expresiones booleanas en declaraciones if devuelven verdadero

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

¿Por qué es así? ¿Cuál es la razón detrás de esta decisión de diseño?

¿Fue útil?

Solución

Java y C # utilizan una técnica de ahorro de memoria llamada internamiento de cadenas . Debido a que las cadenas son inmutables en estos idiomas, pueden agrupar cadenas de uso frecuente (incluidos los literales de cadena codificados, como en su ejemplo) y utilizar múltiples referencias a esa cadena en la memoria para ahorrar espacio.

Otros consejos

Hasta donde yo sé, en .net, el operador == para cadenas está sobrecargado para usar Equals () en lugar de la identidad del objeto. Consulte esta explicación para obtener más detalles: http://www.dotnetperls.com/string-equals

Si necesita saber si es realmente el mismo objeto, use esto:

Object.ReferenceEquals(string1, string2)

En realidad, al menos en Java, hay un mecanismo de almacenamiento en caché en las cadenas. Un error es que dos cadenas que son iguales a veces, pero no siempre devuelven verdaderas cuando se aplica el operador de identidad. el siguiente código imprime falso:

String a="123";
String b="12";
b=b+"3";
System.out.println(a==b);

Si realmente quiere asegurarse, que a.equals (b) == true pero (a == b) == false se evalúa como falso para dos Cadena ayb, entonces puede usar el constructor de cadena completamente infravalorado (^^):

String a = new String("abc");
String b = new String("abc");
if (a.equals(b)) {
   doTheyAreEqual();
   if (a != b) {
     doButNotTheSame();
   }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top