30/09/2018, 18:42

String Pool trong Java

Mình mới học Java, có một thắc mắc nhỏ nhờ mấy bạn giải đáp dùm, đây là Source Code:

String a = “dmcs”;
String b = new String();
b = “dmcs”;
System.out.print(a == b)

Kết quả: True

String a = “dmcs”;
String b = new String(“dmcs”);
System.out.print(a == b);

Kết quả: false

Vậy sự khác nhau của việc khai báo một String rỗng sau đó gán cho nó bằng một biến kiểu String khác và việc gán cho nó ngay từ đầu là gì, như ở câu b mình kiểm tra hashCode của cả a và b là bằng nhau, vậy tại sao hai biến đó lại tham chiếu đến hai biến khác nhau (theo mình hiểu thì Java sử dụng String Pool, 2 biến tham chiếu đến 2 String hoàn toàn giống nhau thì cùng địa chỉ với nhau)

viết 20:53 ngày 30/09/2018

String Pool chỉ có trong trường hợp bạn gán cụ thể một chuỗi vào biến String thôi nhé. Ở ví dụ đầu khi bạn gán b = “dmcs” tức là nó đã vứt cái tham chiếu của object String mới tạo kia đi và gán vào chuỗi cụ thể là “dmcs” có trong String Pool

viết 20:47 ngày 30/09/2018

hashCode bằng nhau vì chuỗi của nó có giá trị bằng nhau. Khi bạn gán chuỗi cụ thể thì nó mới nằm trong String pool để dùng khi trùng giá trị, còn nếu bạn dùng new để tạo Object thì nó sẽ là từng Object riêng rẽ, không liên quan gì đến String pool cả.

Nguyen Ca viết 20:52 ngày 30/09/2018

String a = “dmcs”;

String literal được lưu trong String common pool

String b = new String();

được lưu trong heap.

b = “dmcs”;

Bởi vì Java string là immutable bởi vậy khi gán mới nó sẽ được lưu trong vùng nhớ mới.
Mà do String pool đã lưu giá trị này nên nó refer đến String pool

Quang Trần Kỳ viết 20:56 ngày 30/09/2018

Bạn có thể chỉ rõ cho mình biết khi mình new String(“dmcs”); thì nó lưu biến này trong vùng nào không, chắc là không phải String common pool phải không?

Quang Trần Kỳ viết 20:52 ngày 30/09/2018

Mình hiểu rồi. Cảm ơn bạn rất nhiều

Bài liên quan
0