¿Por qué kotlin use === compare primitive type se igualan si tienen el mismo valor?

val hello1 = "hello" val hello2 = "hello" printf(hello1 === hello2) 

¿Por qué imprimir verdadero?

Supongo que kotlin tiene un grupo de types primitivos (o algo así). Si el valor es igualdad, un puntero apunta al mismo lugar. No estoy seguro.

Igualdad en Kotlin

Expliqué la comprensión de igualdad de Kotlin en esta respuesta ya. Para hacerlo mas simple:

  1. igualdad estructural: == se comstack a los equals de Java y ===

  2. Igualdad referencel: === es lo que == hace en Java: las references se comparan entre sí. Es verdad si se están comparando los mismos objects.

¿Qué pasa con Strings en tu ejemplo?

Las cadenas son especiales ya que funcionan con un grupo de constante de cadenas llamado. Por ejemplo, incluso en Java, lo siguiente es true para ambas comparaciones:

  public static void main(String[] args) { String s = "prasad"; String s2 = "prasad"; System.out.println(s.equals(s2)); System.out.println(s == s2); } 

Por otro lado, este fragment funciona de manera diferente, porque se están creando cadenas new :

 String foo = new String("hello"); String bar = new String("hello"); System.out.println(foo == bar); // prints 'false' 

Lea sobre esto aquí: ¿Qué es el set de cadenas de Java y cómo es "s" diferente del nuevo String ("s")?

FYI: Las String no son primitivas.

un literal de cadena siempre se refiere a la misma instancia de class String. Esto se debe a que los literales de cadena (o, más generalmente, las cadenas que son los valores de las expresiones constantes (§15.28)) son "internados" para compartir instancias únicas, utilizando el método String.intern.

Kotlin simplemente reutiliza el mismo mecanismo. Vea Is String Literal Pool una colección de references al String Object, o una colección de objects y Java String literal pool y object de cadena para explicaciones adicionales.

https://kotlinlang.org/docs/reference/equality.html

En Kotlin hay dos types de igualdad:

  • Igualdad referencel (dos references apuntan al mismo object);
  • Igualdad estructural (un cheque para iguales ()).

La igualdad referencel se comtesting mediante la operación === (y su contraparte negada !== ). a === b evalúa como verdadero si y solo si a y b apuntan al mismo object .

La igualdad estructural es comprobada por la operación == (y su contraparte negada != ). Por convención, una expresión como a == b se traduce a: Así que ves

 a?.equals(b) ?: (b === null) 

Entonces ves: == significa equals y === significa igualdad referencel

Eso implicaría que

 val hello1 = "hello" val hello2 = "hello" printf(hello1 === hello2) 

es referencel comparado que debería conducir a false . PERO: cuando utiliza un literal de cadena como "hello" , se utiliza el caching de cadenas de java (esta es una optimization para save memory). De modo que obtiene las dos veces la misma reference y, por lo tanto, la igualdad de reference es verdadera.

  • Usando Anko getting type Error de falta de correspondencia requerido AnkoContext <ViewGroup> Found AnkoContext <Context>
  • Kotlin reflect proguard SmallSortedMapa
  • Oyente binding; No se puede encontrar el colocador
  • ¿Cuál es una forma adecuada de crear una instancia de class a partir de KType?
  • Cómo animar ConstraintLayout de abajo hacia arriba de la pantalla?
  • Realm executeTransactionAsync no escribe datos en DB
  • Cómo crear una list inmutable que debe recorrer un campo de otra list
  • IncompatibleClassChangeError: Class 'java.lang.VirtualMachineError' no implementa la interfaz 'java.lang.CharSequence'
  • ¿Cuál es la mejor práctica para crear un componente de IU personalizado en tornadofx?
  • ¿Cuál es la diferencia entre Foo :: class.java y Foo :: javaClass?
  • Referencia no resuelta de Kotlin: agregar después de convertir del código de Java