Lớp java.lang.StringBuffer

StringBuffer là một lớp trong Java đại diện cho một chuỗi ký tự có thể thay đổi. Khác với lớp String là bất biến (không thể thay đổi), StringBuffer cho phép bạn sửa đổi nội dung của chuỗi mà không cần tạo ra một đối tượng mới mỗi lần.

Lớp StringBuffer nằm trong package java.lang: Đây là một package đặc biệt, các lớp trong package này được tự động import vào mọi file nguồn Java. Do đó, bạn có thể sử dụng các lớp trong package java.lang mà không cần khai báo import.

Đặc điểm của lớp StringBuffer

↳ An toàn cho đa luồng: Các phương thức của StringBuffer được đồng bộ hóa, đảm bảo rằng các hoạt động trên cùng một đối tượng StringBuffer từ nhiều luồng khác nhau diễn ra theo một thứ tự nhất quán.

↳ Có thể thay đổi: Bạn có thể thêm, xóa hoặc thay thế các ký tự trong một đối tượng StringBuffer.

↳ Có dung lượng: Mỗi StringBuffer có một dung lượng. Nếu chuỗi vượt quá dung lượng, bộ nhớ sẽ tự động được mở rộng.

Ⅰ. So sánh giữa lớp StringBuffer và lớp String trong Java.

Tiêu chíLớp StringLớp StringBuffer
Tính chấtBất biến (immutable)Có thể thay đổi (mutable)
Hiệu suất thay đổiKém hiệu quả với các thao tác thay đổi nhiều lần vì tạo ra đối tượng mới mỗi lần thay đổi.Hiệu quả hơn với các thao tác thay đổi nhiều lần vì thay đổi trực tiếp trên đối tượng hiện tại.
An toàn trong đa luồngAn toàn (thread-safe) vì là bất biến.An toàn (thread-safe) vì các phương thức được đồng bộ hóa.
Khả năng mở rộngKhông mở rộng kích thước (đối tượng không thay đổi).Tự động mở rộng kích thước khi cần.
Phương thức thay đổiKhông có phương thức để thay đổi nội dung.Cung cấp các phương thức như append(), insert(), delete(), replace().
Sử dụng trong đa luồngThích hợp khi làm việc với chuỗi không thay đổi.Thích hợp khi làm việc với chuỗi thay đổi trong môi trường đa luồng.
Khả năng tối ưu hóaTối ưu cho các thao tác với chuỗi bất biến.Tối ưu cho các thao tác thay đổi chuỗi.
Khả năng điều chỉnh kích thướcKhông hỗ trợ điều chỉnh kích thước.Hỗ trợ điều chỉnh kích thước tự động.
Tạo đối tượng mớiTạo đối tượng mới khi thực hiện thao tác thay đổi.Không tạo đối tượng mới khi thay đổi nội dung.

Khi nào nên sử dụng StringBuffer?

Xây dựng chuỗi động: Khi bạn cần xây dựng một chuỗi bằng cách liên tục thêm các phần tử vào.

Thực hiện nhiều thao tác trên chuỗi: Nếu bạn cần thực hiện nhiều phép nối, cắt, thay thế chuỗi trong một vòng lặp.

Môi trường đa luồng: Nếu bạn cần sử dụng chuỗi trong một môi trường đa luồng, StringBuffer là lựa chọn tốt hơn vì nó được đồng bộ hóa.

Ⅱ. Cú pháp khai báo lớp StringBuffer

Cú pháp

public final class StringBuffer
extends Object
implements Serializable, CharSequence

Dưới đây là giải thích chi tiết về cú pháp khai báo này:

↳ public: Từ khóa này chỉ ra rằng lớp StringBuffer có thể được truy cập từ bất kỳ đâu (không giới hạn phạm vi truy cập).

↳ final: Từ khóa này chỉ ra rằng lớp StringBuffer không thể bị kế thừa. Điều này có nghĩa là bạn không thể tạo một lớp con từ lớp StringBuffer.

↳ class StringBuffer: Đây là tên của lớp, là StringBuffer.

↳ extends Object: Lớp StringBuffer kế thừa từ lớp Object, lớp cha của tất cả các lớp trong Java. Điều này có nghĩa là lớp StringBuffer thừa hưởng các phương thức từ lớp Object.

Lớp java.lang.StringBuffer được implements từ các interface Serializable và CharSequence.

↳ implements Serializable: Lớp StringBuffer có thể được tuần tự hóa, nghĩa là nó có thể được chuyển đổi thành một chuỗi byte để lưu trữ hoặc truyền tải qua mạng.

↳ implements CharSequence: Lớp StringBuffer cung cấp các phương thức để thao tác với chuỗi ký tự. CharSequence là một giao diện đại diện cho một chuỗi các ký tự.

Tóm lại, khai báo trên định nghĩa rằng StringBuffer là một lớp không thể bị kế thừa, kế thừa các phương thức từ lớp Object, và có khả năng tuần tự hóa cũng như thao tác với chuỗi ký tự.

Ⅲ. Các hàm tạo của lớp StringBuffer

Lớp StringBuffer trong Java cung cấp một vài hàm tạo khác nhau để bạn có thể khởi tạo một đối tượng StringBuffer với các giá trị ban đầu khác nhau. Dưới đây là các hàm tạo phổ biến nhất:

↳ StringBuffer(): Tạo một đối tượng StringBuffer rỗng với dung lượng ban đầu là 16 ký tự.

↳ StringBuffer(CharSequence seq): Tạo một đối tượng StringBuffer chứa cùng các ký tự với đối tượng CharSequence được chỉ định.

↳ StringBuffer(int capacity): Tạo một đối tượng StringBuffer rỗng với dung lượng ban đầu được chỉ định.

↳ StringBuffer(String str): Tạo một đối tượng StringBuffer được khởi tạo với nội dung của chuỗi được chỉ định.

Dưới đây là ví dụ cho bốn hàm tạo của lớp StringBuffer trong java:

Ví dụ: Example.java

public class Example {
    public static void main(String[] args) {
        // Constructor không tham số: Tạo đối tượng StringBuffer rỗng với dung lượng ban đầu là 16 ký tự.
        StringBuffer sb1 = new StringBuffer();
        System.out.println("Dung lượng ban đầu của sb1: " + sb1.capacity()); // In ra dung lượng ban đầu

        // Constructor với CharSequence: Tạo đối tượng StringBuffer chứa các ký tự từ CharSequence.
        CharSequence cs = "Hello, CharSequence!";
        StringBuffer sb2 = new StringBuffer(cs);
        System.out.println("Nội dung của sb2: " + sb2.toString()); // In ra nội dung của sb2

        // Constructor với dung lượng: Tạo đối tượng StringBuffer rỗng với dung lượng ban đầu được chỉ định.
        StringBuffer sb3 = new StringBuffer(50);
        System.out.println("Dung lượng ban đầu của sb3: " + sb3.capacity()); // In ra dung lượng ban đầu

        // Constructor với chuỗi: Tạo đối tượng StringBuffer được khởi tạo với nội dung của chuỗi.
        String str = "Hello, StringBuffer!";
        StringBuffer sb4 = new StringBuffer(str);
        System.out.println("Nội dung của sb4: " + sb4.toString()); // In ra nội dung của sb4
    }
}

Kết quả của chương trình là:

Dung lượng ban đầu của sb1: 16
Nội dung của sb2: Hello, CharSequence!
Dung lượng ban đầu của sb3: 50
Nội dung của sb4: Hello, StringBuffer!

Trong ví dụ trên, các constructor của StringBuffer cho phép tạo đối tượng với dung lượng hoặc nội dung khác nhau tùy thuộc vào cách bạn khởi tạo chúng.

Ⅳ. Phương thức của lớp StringBuffer

Lớp StringBuffer cung cấp rất nhiều phương thức để bạn có thể thực hiện nhiều thao tác khác nhau trên chuỗi như thêm, xóa, thay thế, đảo ngược, v.v. trong một đối tượng StringBuffer sau khi nó được tạo. Việc phân nhóm các phương thức của lớp StringBuffer theo chức năng sẽ giúp bạn hiểu rõ hơn về cách sử dụng chúng. Dưới đây là cách tôi đề xuất phân nhóm:

Phương thức append() thêm dữ liệu vào cuối chuỗi của lớp StringBuffer

Phương thứcMô tả
StringBuffer append(boolean b)Thêm biểu diễn chuỗi của giá trị boolean b vào cuối chuỗi.
StringBuffer append(char c)Thêm ký tự c vào cuối chuỗi.
StringBuffer append(char[] str)Thêm toàn bộ mảng ký tự str vào cuối chuỗi.
StringBuffer append(char[] str, int offset, int len)Thêm một phần của mảng ký tự str vào cuối chuỗi, bắt đầu từ vị trí offset và có độ dài len.
StringBuffer append(CharSequence s)Thêm chuỗi ký tự s vào cuối chuỗi.
StringBuffer append(CharSequence s, int start, int end)Thêm một phần của chuỗi ký tự s vào cuối chuỗi, bắt đầu từ vị trí start và kết thúc tại vị trí end - 1.
StringBuffer append(double d)Thêm biểu diễn chuỗi của số thực d vào cuối chuỗi.
StringBuffer append(float f)Thêm biểu diễn chuỗi của số thực dấu phẩy động f vào cuối chuỗi.
StringBuffer append(int i)Thêm biểu diễn chuỗi của số nguyên i vào cuối chuỗi.
StringBuffer append(long lng)Thêm biểu diễn chuỗi của số nguyên dài lng vào cuối chuỗi.
StringBuffer append(Object obj)Thêm biểu diễn chuỗi của đối tượng obj vào cuối chuỗi.
StringBuffer append(String str)Thêm chuỗi str vào cuối chuỗi.
StringBuffer append(StringBuffer sb)Thêm nội dung của StringBuffer sb vào cuối chuỗi.
StringBuffer appendCodePoint(int codePoint)Thêm một điểm mã (codePoint) vào cuối chuỗi.

Phương thức delete() xóa ký tự hoặc chuỗi của lớp StringBuffer

Phương thứcMô tả
StringBuffer deleteCharAt(int index)Xóa ký tự duy nhất tại vị trí index trong chuỗi.
StringBuffer delete(int start, int end)Xóa tất cả các ký tự từ vị trí start đến end - 1 trong chuỗi StringBuffer.

Phương thức insert() chèn dữ liệu vào một vị trí cụ thể của lớp StringBuffer

Phương thứcMô tả
StringBuffer insert(int offset, boolean b)Chèn biểu diễn chuỗi của giá trị boolean b vào vị trí offset trong chuỗi.
StringBuffer insert(int offset, char c)Chèn ký tự c vào vị trí offset trong chuỗi.
StringBuffer insert(int offset, char[] str)Chèn toàn bộ mảng ký tự str vào vị trí offset trong chuỗi.
StringBuffer insert(int index, char[] str, int offset, int len)Chèn một phần của mảng ký tự str vào vị trí index trong chuỗi, bắt đầu từ vị trí offset và có độ dài len.
StringBuffer insert(int dstOffset, CharSequence s)Chèn chuỗi ký tự s vào vị trí dstOffset trong chuỗi.
StringBuffer insert(int dstOffset, CharSequence s, int start, int end)Chèn một phần của chuỗi ký tự s vào vị trí dstOffset trong chuỗi, bắt đầu từ vị trí start và kết thúc tại vị trí end - 1.
StringBuffer insert(int offset, double d)Chèn biểu diễn chuỗi của số thực d vào vị trí offset trong chuỗi.
StringBuffer insert(int offset, float f)Chèn biểu diễn chuỗi của số thực dấu phẩy động f vào vị trí offset trong chuỗi.
StringBuffer insert(int offset, int i)Chèn biểu diễn chuỗi của số nguyên i vào vị trí offset trong chuỗi.
StringBuffer insert(int offset, long l)Chèn biểu diễn chuỗi của số nguyên dài l vào vị trí offset trong chuỗi.
StringBuffer insert(int offset, Object obj)Chèn biểu diễn chuỗi của đối tượng obj vào vị trí offset trong chuỗi.
StringBuffer insert(int offset, String str)Chèn chuỗi str vào vị trí offset trong chuỗi.

Phương thức thay thế của lớp StringBuffer

Phương thứcMô tả
StringBuffer replace(startIndex, endIndex, replacement)Thay thế một đoạn chuỗi bằng một chuỗi khác.
void setCharAt(int index, char ch)Thay thế ký tự tại vị trí index bằng ký tự ch.

Các phương thức tìm kiếm của lớp StringBuffer

Kiểu trả vềPhương thứcMô tả
intindexOf(String str)Trả về vị trí bắt đầu của chuỗi con str trong chuỗi hiện tại. Trả về -1 nếu không tìm thấy.
intindexOf(String str, int fromIndex)Tương tự như trên, nhưng bắt đầu tìm kiếm từ vị trí fromIndex.
intlastIndexOf(String str)Trả về vị trí cuối cùng của chuỗi con str trong chuỗi hiện tại. Trả về -1 nếu không tìm thấy.
intlastIndexOf(String str, int fromIndex)Tương tự như trên, nhưng bắt đầu tìm kiếm từ vị trí fromIndex và tìm kiếm ngược lại.

Các phương thức truy vấn thông tin của lớp StringBuffer

Kiểu trả vềPhương thứcMô tả
intcapacity()Trả về dung lượng hiện tại của bộ đệm. Đây là số lượng ký tự tối đa mà bộ đệm có thể chứa trước khi cần phải mở rộng.
intlength()Trả về độ dài của chuỗi hiện tại trong bộ đệm. Đây là số lượng ký tự thực tế đang được lưu trữ.
charcharAt(int index)Trả về ký tự tại vị trí index trong chuỗi. Index bắt đầu từ 0.
StringtoString()Trả về một đối tượng String chứa nội dung của chuỗi hiện tại.

Phương thức đảo ngược chuỗi của lớp StringBuffer

Phương thứcMô tả
StringBuffer reverse() Đảo ngược toàn bộ thứ tự các ký tự trong chuỗi StringBuffer.

Các phương thức quản lý dung lượng chuỗi của lớp StringBuffer

Kiểu trả vềPhương thứcMô tả
voidensureCapacity(int minimumCapacity)Đảm bảo dung lượng của bộ đệm ít nhất bằng minimumCapacity.
voidsetLength(int newLength)Thiết lập độ dài mới cho chuỗi. Nếu newLength lớn hơn độ dài hiện tại, các ký tự mới sẽ có giá trị '\u0000'.
voidtrimToSize()Giảm dung lượng của bộ đệm xuống bằng với độ dài của chuỗi hiện tại nếu có thể.

Các phương thức làm việc với chuỗi con của lớp StringBuffer

Kiểu trả vềPhương thứcMô tả
CharSequencesubSequence(int start, int end)Trả về một chuỗi con của chuỗi hiện tại từ vị trí start đến end - 1.
Stringsubstring(int start)Trả về một chuỗi con của chuỗi hiện tại bắt đầu từ vị trí start.
Stringsubstring(int start, int end)Trả về một chuỗi con của chuỗi hiện tại từ vị trí start đến end - 1.
voidgetChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)Sao chép một phần của chuỗi từ vị trí srcBegin đến srcEnd vào mảng ký tự dst bắt đầu từ vị trí dstBegin.

Các phương thức xử lý Unicode của lớp StringBuffer

Kiểu trả vềPhương thứcMô tả
intcodePointAt(int index)Trả về điểm mã Unicode tại vị trí index trong chuỗi. Một điểm mã có thể đại diện cho một hoặc nhiều ký tự.
intcodePointBefore(int index)Trả về điểm mã Unicode trước vị trí index trong chuỗi.
intcodePointCount(int beginIndex, int endIndex)Trả về số lượng điểm mã Unicode trong khoảng từ beginIndex đến endIndex (không bao gồm endIndex).
intoffsetByCodePoints(int index, int codePointOffset)Trả về vị trí mới trong chuỗi sau khi di chuyển codePointOffset điểm mã từ vị trí index.

Trong phần tiếp theo chúng ta sẽ tìm hiểu chi tiết cách sử dụng chúng trong các tình huống thực tế.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”