Mục lục
Trong bài viết này chúng ta cùng nhau bàn luận về các đặc điểm của String, StringBuilder, StringBuffer để xem chúng có những đặc tính gì và trong trường hợp nào thì chúng ta cần sử dụng chúng.
String
String là một chuỗi ký tự immutable vì nó sẽ dễ dàng chia sẽ ra các method hoặc các thread khác nhau vì giá trị của chúng sẽ không đổi sau khi đã được khởi tạo.
Khi bạn khởi tạo một String bằng cách sử dụng cặp dấu “” thì việc đầu tiên java sẽ đi tìm trong JVM string pool xem có string nào có giá trị tương tự chưa? nếu có thì trả về reference vừa tìm được ngược lại khởi tạo object string và đưa vào string pool. Cơ chế này giúp JVM giảm thiểu đáng kể vùng nhớ. Nhưng khi thực hiện các hành động như cộng chuỗi, cắt chuỗi thì chúng sẽ khởi tạo một object mới thay vì sửa đổi trên giá trị cũ.
String vs StringBuffer
Bởi vì String có tính chất immutable nên khi khi thực hiện các hành động như nối chuỗi, cắt chuỗi thì nó sẽ khởi tạo một object string mới và loaị bỏ giá trị cũ cho trình dọn rác của Java xử lý.
Nếu chúng ta xử lý quá nhiều hành động trên String thì nó sẽ sinh ra rất nhiều giá trị rác ở heap. Vì vậy nên java cung cấp StringBuffer class sử dụng trong trường hợp chúng ta cần thao tác nhiều trên chuỗi.
StringBuffer và StringBuilder đều là mutable object cung cấp sẵn cho chúng ta các method append(), insert(), delete() etc.
StringBuider vs StringBuffer
Về mặt cơ bản thì StringBuider và StringBuffer là hoàn toàn giống nhau và đều là mutable object. Điểm khác biệt duy nhất giữa chúng là StringBuffer cung cấp cơ chế đồng bộ khi xử lý đa luồng trong khi StringBuilder thực hiện bất đồng bộ.
Việc StringBuffer xử lý đồng bộ khiến cho giảm performance đáng kể, và nếu chúng ta chỉ sử dụng chúng trong một luồng duy nhất thì thật lãng phí chính vì thế java đã cung cấp thêm StringBuilder để chúng ta sẽ sử dụng trên một singlethread.
Vì vậy hãy sử dụng StringBuffer khi thao tác với đa luồng và StringBuilder khi bạn chỉ thao tác trên một luồng duy nhất.
String vs StringBuilder vs StringBuffer
String là immutable trong khi StringBuilder và Stringbuffer là mutable.
StringBuffer cung cấp cơ chế đồng bộ thread safe nhung giảm hiệu năng trong khi StringBuilder thực hiện không đồng bộ hiệu năng cao hơn.
Khi thao tác với môi trường single thread chúng ta nên sử dụng StringBuilder để xử lý String.