¿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.

  • Kotlin: generics y varianza
  • ¿Puedo invocar el complemento noargs de Kotlin desde la command-line o desde Ant?
  • kotlin cómo referir el scope externo esto en funciones de aplicación multicapa
  • ¿Cómo puedo ejecutar files Kotlin-Script (* .kts) desde dentro de Gradle?
  • ¿Cómo crear caching / versión caliente de rx.Single?
  • Genéricos de class sellados en kotlin no relacionados con classs internas
  • Escribir en una database con Android
  • ¿Kotlin admite que una class implemente una interfaz fuera de su file de definición?
  • ¿Cuál es la solución preferida para Kotlin koan "Partition" y por qué?
  • Sabor del producto: class duplicada encontrada
  • Usar Glide para almacenar imágenes de la vista web en caching