Lập trình Java cơ bản

Bài 22: StringBuffer và StringBuilder

1. StringBuffer

Lớp StringBuffer trong Java được sử dụng để tạo chuỗi có thể sửa đổi (chuỗi dạng mutable). Lớp StringBuffer giống như lớp String trong Java, ngoại trừ ở điểm là nó là có thể sửa đổi.  
Lớp StringBuffer là an toàn luồng (Thread-safe), ví dụ: nhiều Thread không thể truy cập nó đồng thời. Vì thế nó là an toàn và sẽ cho kết quả trong một thứ tự.
Các constructor quan trọng của StringBuffer:
  • StringBuffer(): tạo một bộ đệm chuỗi trống với dung lượng capacity ban đầu là 16.
  • StringBuffer(String str): tạo một bộ đệm chuỗi với chuỗi đã xác định.
  • StringBuffer(int capacity): tạo một bộ đệm chuỗi trống với dung lượng capacity đã cho.
Các phương thức của StringBuffer:
Phương thứcMô tả
append()Phương thức này nối thêm một chuỗi hoặc một mảng ký tự tại vị trí cuối cùng của một đối tượng StringBuffer.
Ví dụ: StringBuffer s1 = new StringBuffer(“Good”);
s1.append(“evening”);
s1 bây giờ là goodevening
insert()Phương thức này lấy hai tham số. Tham số đầu tiên là vị trí chèn. Tham số thứ hai có thể là một chuỗi, một ký tự (char), một giá trị nguyên (int), hay một giá trị số thực (float) được chèn vào. Vị trí chèn sẽ lớn hơn hay bằng đến 0, và nhỏ hơn hay bằng chiều dài của đối tượng Stringbuffer. Bất kỳ đối số nào, trừ ký tự hoặc chuỗi, được chuyển vào biểu mẫu chuỗi, và sau đó được chèn vào.
Ví dụ: StringBuffer str = new StringBuffer(“Java sion”);
str.insert(1,’b’);
Biến “str” chứa chuỗi “Java sion”.
charAt()Phương thức này trả về một giá trị ký tự trong đối tượng StringBuffer tại vị trí được chỉ định.
Ví dụ: StringBuffer str = new StringBuffer(“James Gosling”);
char letter = str.charAt(6); //chứa “G”
setCharAt()Phương thức này được sử dụng để thay thế ký tự trong một StringBuffer với những cái khác tại một vị trí được chỉ định. 
Ví dụ: StringBuffer name = new StringBuffer(“Java”);
name.setCharAt(2,’v’);
Biến “name” chứa “Java”.
setLength()Phương thức này thiết lập chiều dài của đối tượng StringBuffer. Nếu chiều dài được chỉ định nhỏ hơn chiều dài nguyên thuỷ của bộ nhớ trung gian, thì các ký tự thừa sẽ bị cắt bớt. Nếu chiểu dài chỉ định nhiều hơn chiều dài nguyên thủy của bộ nhớ đệm, các ký tự null được thêm vào tại vị trí cuối cùng của bộ nhớ đệm.
Ví dụ:  StringBuffer str = new StringBuffer(10);
str.setLength(str.legth() +10);
getChars()Phương thức này được sử dụng để trích ra các ký tự từ đối tượng StringBuffer, và sao chép chúng vào một mảng.
Ví dụ: StringBuffer str = new StringBuffer(“Leopard”);
char ch[] = new char[10];
str.getChars(3,6,ch,0);
Bây giờ biến “ch” chứa “par”
reverse()Phương thức này đảo ngược nội dung của một đối tượng StringBuffer, và trả về một đối tượng StringBuffer.
Ví dụ: StringBuffer str = new StringBuffer(“devil”);
StringBuffer strrev = str.reverse();
Biến “strrev” chứa “lived”.

2. StringBuilder

Lớp StringBuilder trong Java được sử dụng để tạo chuỗi có thể thay đổi (chuỗi dạng mutable). Lớp StringBuilder là giống như lớp StringBuffer ngoại trừ rằng nó là không đồng bộ. Lớp này có sẵn từ JDK 1.5.  
Các constructor quan trọng của StringBuilder
  • StringBuilder(): tạo một Builder trống với dung lượng capacity ban đầu là 16.
  • StringBuilder(String str): tạo một Builder với chuỗi đã xác định.
  • StringBuilder(int capacity): tạo một Builder trống với dung lượng capacity đã cho.
Các phương thức của StringBuilder là tương tự so với StringBuffer nhưng không được đồng bộ. Sau đây chúng ta sẽ làm rõ hơn ở phần so sánh 2 lớp này.

3. So sánh StringBuffer và StringBuilder

    Có nhiều điểm khác nhau giữa lớp String và StringBuffer trong Java. Bảng dưới liệt kê các điểm khác nhau này:
StringBufferStringBuilder
Lớp StringBuffer là đồng bộ (synchronized), tức là an toàn luồng (thread safe). Nghĩa là hai Thread không thể gọi đồng thời các phương thức của lớp StringBuffer  StringBuilder là không đồng bộ (non-synchronized) tức là không an toàn luồng. Nghĩa là hai Thread có thể gọi đồng thời các phương thức của lớp StringBuilder  
StringBuffer là kém hiệu quả hơn StringBuilderStringBuilder là hiệu quả hơn StringBuffer
So sánh hiệu suất của StringBuffer và StringBuilder:
package com.company;

public class Main {
    public static void main(String args[]) {
        long startTime = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer("Java");
        for (int i = 0; i < 100000; i++) {
            sb.append("BkitSoftware");
        }
        System.out.println("Thoi gian tieu ton boi StringBuffer: " + (System.currentTimeMillis() - startTime) + "ms");
        startTime = System.currentTimeMillis();
        StringBuilder sb2 = new StringBuilder("Java");
        for (int i = 0; i < 100000; i++) {
            sb2.append("BkitSoftware");
        }
        System.out.println("Thoi gian tieu ton boi StringBuilder: " + (System.currentTimeMillis() - startTime) + "ms");
    }
}
Thoi gian tieu ton boi StringBuffer: 16ms
Thoi gian tieu ton boi StringBuilder: 6ms
Từ ví dụ có thể thấy, StringBuilder có hiệu suất tốt hơn StringBuffer.

Danh sách bài học