Avatar
1
Phạm Vũ Beginner
Phạm Vũ Beginner
biến nullable trong kotlin
chào các anh chị, em mới nhập môn kotlin và gặp phải thắc mắc muốn nhờ anh chị giúp đỡ

em tìm được một ví dụ trên mạng như sau:

val a: Int = 100
val boxedA: Int? = a
val anotherBoxedA: Int? = a

val b: Int = 10000
val boxedB: Int? = b
val anotherBoxedB: Int? = b

println(boxedA === anotherBoxedA) // true
println(boxedB === anotherBoxedB) // false

kết quả là true false

theo như họ giải thích thì kết quả như vậy là do cơ chế tối ưu bộ nhớ integer nullable từ -128 đến 127

nhưng sau khi em chuyển biến a và b thành nullable như sau

val a: Int? = 100
val boxedA: Int? = a
val anotherBoxedA: Int? = a

val b: Int? = 10000
val boxedB: Int? = b
val anotherBoxedB: Int? = b

println(boxedA === anotherBoxedA) // true
println(boxedB === anotherBoxedB) // true

kết quả là true true

em đã tra gg khá nhiều mà k có kết quả, mong anh chị giúp đỡ ạ, em cảm ơn nhiều

  • Answer
kotlin
Remain: 5
1 Answer
Avatar
tvd12 Beginner
tvd12 Beginner
Em dùng IntelliJ dịch code ra em sẽ thấy:

public static final void a() {
  int a = 100;
  Integer boxedA = Integer.valueOf(a);
  Integer anotherBoxedA = Integer.valueOf(a);
  int b = 10000;
  Integer boxedB = Integer.valueOf(b);
  Integer anotherBoxedB = Integer.valueOf(b);
  boolean var6 = boxedA == anotherBoxedA;
  boolean var7 = false;
  System.out.println(var6);
  var6 = boxedB == anotherBoxedB;
  var7 = false;
  System.out.println(var6);
}

public static final void b() {
  Integer a = 100;
  Integer b = 10000;
  boolean var6 = a == a;
  boolean var7 = false;
  System.out.println(var6);
  var6 = b == b;
  var7 = false;
  System.out.println(var6);
}

Ở trường hợp 1, nó sẽ dịch ra thành 2 đối tượng Integer nhưng do vấn đề boxed value nên những số nằm ngoài khoảng −128 and 127 sẽ không thể sử dụng dấu == được nên là false, trường hợp này em sẽ cần dụng equals

Ở trường hớp 2, nó dịch thẳng ra kết quả luôn rồi, thế nên không có gì cần phải nói thêm em ạ

  • 0
  • Reply