String, StringBuilder và StringBuffer

Trong Java, chúng ta có 3 kiểu dữ liệu để lưu trữ các giá trị chuỗi là String, StringBufferStringBuilder.

Trong bài viết này, chúng ta sẽ tìm hiểu về sự khác nhau của 3 kiểu dữ liệu này và cách sử dụng chúng trong 1 ứng dụng viết bằng Java.

1. String

String là đối tượng immutable (một khi đã tạo thì không thể thay đổi). Đối tượng kiểu String được lưu trong Contant String Pool. Mỗi đối tượng immutable trong Java là thread safe (không thể được sử dụng bởi 2 luồng đồng thời).

String demo = "hello";
// Đối tượng trên được lưu trong Constant String Pool và giá trí của nó không thể thay đổi
demo = "Bye";
// Chuỗi "Bye" mới được lưu trong Constant String Pool và được tham chiếu bởi biến demo
// Chuỗi "hello" vẫn tồn tại trong Constant String Pool và giá trị của nó không được ghi đè nhưng chúng ta mất tham chiếu đến chuỗi "hello"

2. StringBuffer

StringBuffer là đối tượng mutable, có thể thay đổi giá trị của đối tượng. Đối tượng StringBuffer được lưu trong heap. StringBuffer có cùng các phương thức với StringBuilder, nhưng mỗi phương thức của StringBuffersynchronizedthread safe.

Vì là đối tượng mutable nên giá trị của đối tượng StringBuffer có thể thay đổi, nghĩa là chúng ta có thể gán giá trị mới cho đối tượng StringBuffer.

StringBuffer demo = new StringBuffer("Hello") ;
demo =new StringBuffer("Bye");

3. StringBuilder

StringBuilder tương tự như StringBuffer, nó lưu đối tượng trong heap và có thể thay đổi giá trị của đối tượng. Sự khác biệt chính giữa StringBufferStringBuilder là các phương thức của StringBuilder không phải thread safe. Chính vì điều này mà nó cho tốc độ xử lý nhanh hơn StringBuffer.

StringBuilder demo2= new StringBuilder("Hello");
demo2=new StringBuilder("Bye");

 

Bảng dưới đây sẽ tóm tắt những điểm khác nhau chính của 3 kiểu dữ liệu String, StringBuilder và StringBuffer:

String StringBuffer StringBuilder
Storage Area Constant String Pool Heap Heap
Modifiable No (immutable) Yes (mutable) Yest (Mutable)
Thread Safe Yes Yes No
Performance Fast Very slow Fast

 

4. Khi nào thì sử dụng String, StringBuilder hay StringBuffer

Các kiểu đối tượng StringBufferStringBuilder được sử dụng khi cần thao tác nhiều với các chuỗi ký tự. Không giống như Strings, các đối tượng kiểu StringBufferStringBuilder có thể thay đổi giá trị nhiều lần mà không tạo ra nhiều đối tượng không sử dụng.

Kiểu StringBuilder được giới thiệu từ Java 5 và điểm khác biệt lớn nhất giữa StringBuilderStringBuffer là các phương thức của StringBuilder không phải là thread safe.

Nếu đặc tính thread safe là cần thiết thì StringBuffer là lựa chọn tốt nhất. Trong các trường hợp khác, chúng ta nên sử dụng StringBuilder để cho tốc độ xử lý nhanh hơn.

 

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.