Đối tượng String, được định nghĩa trong package java.lang, là một đối tượng cơ bản trong Java. Các bạn sẽ sử dụng nó thường xuyên và là một đối tượng không thể thiếu đối với tất cả chúng ta khi lập trình với Java. Trong bài viết này, mình sẽ trình bày với các bạn sâu hơn về đối tượng String này để các bạn hiểu rõ thêm về nó các bạn nhé!
Khởi tạo đối tượng String
Chúng ta có nhiều cách để khởi tạo một đối tượng String, đó là:
– Sử dụng toán tử new
Ví dụ:
1 |
String a = new String("Khanh"); |
– Sử dụng toán tử gán (“=”)
Ví dụ:
1 |
String b = "Khanh"; |
– Khai báo trong dấu nháy kép
Ví dụ:
1 |
System.out.println("Khanh"); |
Sự khác nhau giữa các cách khai báo trên, đó là:
Nếu các bạn khai báo đối tượng String sử dụng toán tử new thì Java sẽ tạo ra những đối tượng Java riêng biệt, lưu trữ ở những vị trí khác nhau trong bộ nhớ.
Do đó, khi các bạn so sánh những đối tượng này sử dụng toán tử quan hệ (“==”) thì kết quả sẽ là false. Hãy xem ví dụ sau nhé các bạn:
1 2 3 4 5 6 7 8 9 10 11 |
package com.huongdanjava.javaexample; public class Example { public static void main(String[] args) { String a = new String("Khanh"); String b = new String("Khanh"); System.out.println(a == b); } } |
Kết quả:
Nếu các bạn khởi tạo đối tượng String bằng cách sử dụng toán tử gán (“=”) thì khi so sánh những đối tượng này sử dụng toán tử quan hệ (“==”) thì kết quả sẽ là true.
Hãy xem xét ví dụ sau nhé các bạn:
1 2 3 4 5 6 7 8 9 10 11 |
package com.huongdanjava.javaexample; public class Example { public static void main(String[] args) { String a = "Khanh"; String b = "Khanh"; System.out.println(a == b); } } |
Kết quả:
Nguyên nhân là do đâu các bạn? Đó là bởi vì khi bạn khởi tạo biến String a với nội dung là “Khanh” sử dụng toán tử gán (“=”) thì Java sẽ tạo một chuỗi “Khanh” được lưu trữ ở một vị trí xác định trong bộ nhớ gọi là String pool. Khi các bạn tạo các biến String khác cũng cùng nội dung là “Khanh”, thì Java sẽ trả về chuỗi ký tự “Khanh” đã được tạo ra trước đó trong String pool. Và do đó, khi các bạn so sánh những đối tượng như thế này, kết quả sẽ luôn là true.
Đối với trường hợp thứ ba thì cũng giống như trường hợp thứ hai, khi so sánh những String được khai báo trong dấu ngoặc kép bằng toán tử quan hệ (“==”) kết quả sẽ luôn luôn true.
Hãy xem xét ví dụ sau nhé:
1 2 3 4 5 6 7 8 |
package com.huongdanjava.javaexample; public class Example { public static void main(String[] args) { System.out.println("Khanh" == "Khanh"); } } |
Kết quả:
Khái niệm Immutable trong String
Làm việc với String, các bạn sẽ gặp khái niệm Immutable. Vậy Immutable là gì? Mình sẽ nói ngay: Immutable là khái niệm để chỉ những đối tượng mà nội dung hay trạng thái của nó không thể bị thay đổi bởi bất cứ đối tượng nào khác.
String là một đối tượng Immutable như thế!
Vậy làm thế nào String có thể là một đối tượng Immutable, mình xin trình bày như sau:
– String lưu trữ giá trị của nó trong một biến mảng với kiểu dữ liệu char. Biến mảng này được định nghĩa với access modifier là private.
– Biến mảng này được khai báo với từ khóa final. Như các bạn đã biết, nếu một biến được định nghĩa với từ khóa final thì nó chỉ được khởi tạo một lần duy nhất.
– Không một phương thức nào trong đối tượng String thao tác với biến mảng này.
Chi tiết, các bạn có thể xem thêm tại đây.
Thành
phần “Khái niệm Immutable trong String” a viết rất hay và bổ ích tuy nhiên ở phần trên e có góp ý a nên nói về vùng nhớ Heap và StringPool để người đọc hiểu rõ hơn
Khanh Nguyen
Thanks em, anh đã đề cập một xí nhưng thiết nghĩ để mọi người hiểu rõ hơn về Java Heap, anh nghĩ mình cần viết một bài viết khác về nó.