Lớp java.lang.StringBuilder
StringBuilder là một lớp trong Java đại diện cho một chuỗi ký tự có thể thay đổi. Nó tương tự như StringBuffer nhưng không đảm bảo tính đồng bộ, điều này làm cho nó nhanh hơn trong môi trường đơn luồng.
Lớp StringBuilder 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 chính của lớp StringBuilder
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 StringBuilder.
Không an toàn cho đa luồng: Các phương thức của StringBuilder không được đồng bộ hóa, vì vậy không nên sử dụng nó trong môi trường đa luồng.
Có dung lượng: Mỗi StringBuilder 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 StringBuilder và lớp String trong Java.
String và StringBuilder là hai lớp quan trọng trong Java để xử lý chuỗi, nhưng chúng có những điểm khác biệt cơ bản. Dưới đây là một so sánh giữa chúng:
Tiêu chí | Lớp String | Lớp StringBuilder |
---|---|---|
Tính chất | Bất biến (immutable) | Có thể thay đổi (mutable) |
Hiệu suất thay đổi | Ké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ồng | An toàn (thread-safe) vì là bất biến. | Không an toàn (non-thread-safe), cần đồng bộ hóa thủ công. |
Khả năng mở rộng | Khô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 đổi | Khô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ồng | Thích hợp khi làm việc với chuỗi không thay đổi. | Không an toàn trong môi trường đa luồng, cần sử dụng StringBuffer nếu cần an toàn. |
Khả năng tối ưu hóa | Tố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ước | Khô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ới | Tạ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 StringBuilder?
Nên sử dụng khi bạn làm việc trong một môi trường đơn luồng hoặc khi bạn không cần đến tính đồng bộ.
Khi bạn muốn có hiệu suất cao hơn trong việc thao tác với chuỗi.
Ⅱ. So sánh chi tiết giữa lớp StringBuffer và lớp StringBuilder trong Java
StringBuffer và StringBuilder là hai lớp trong Java được sử dụng để biểu diễn các chuỗi có thể thay đổi (mutable). Cả hai lớp đều cung cấp các phương thức để thêm, xóa, thay thế các ký tự trong chuỗi. Tuy nhiên, chúng có một điểm khác biệt chính liên quan đến đa luồng.
Đồng bộ hóa (Synchronization)
StringBuffer: Là một lớp đồng bộ hóa (synchronized). Điều này có nghĩa là các phương thức của StringBuffer được thiết kế để an toàn khi sử dụng trong môi trường đa luồng. Khi nhiều luồng cùng truy cập và sửa đổi một đối tượng StringBuffer, các phương thức sẽ được thực thi một cách tuần tự, tránh xung đột dữ liệu.
StringBuilder: Không đồng bộ. Điều này làm cho StringBuilder hiệu quả hơn StringBuffer trong các môi trường đơn luồng, nhưng không an toàn khi sử dụng trong môi trường đa luồng. Nếu nhiều luồng cùng truy cập và sửa đổi một đối tượng StringBuilder, có thể dẫn đến các vấn đề về đồng bộ hóa và lỗi không mong muốn.
Hiệu suất
StringBuilder: Vì không có cơ chế đồng bộ hóa, StringBuilder thường nhanh hơn StringBuffer.
StringBuffer: Do cơ chế đồng bộ hóa, StringBuffer thường chậm hơn StringBuilder.
Dưới đây là bảng so sánh giữa StringBuffer và StringBuilder trong Java:
Tiêu chí | Lớp StringBuffer | Lớp StringBuilder |
---|---|---|
Tính chất | Có thể thay đổi (mutable) | Có thể thay đổi (mutable) |
Hiệu suất | Tương tự StringBuilder nhưng có thêm đồng bộ hóa vì an toàn trong đa luồng. | Hiệu quả hơn do không có đồng bộ hóa. |
An toàn trong đa luồng | An toàn (thread-safe) vì các phương thức được đồng bộ hóa. | Không an toàn trong môi trường đa luồng. |
Khả năng mở rộng | Tự động mở rộng kích thước khi cần. | Tự động mở rộng kích thước khi cần. |
Phương thức thay đổi | Cung cấp các phương thức như append() , insert() , delete() , replace() . | Cung cấp các phương thức tương tự như append() , insert() , delete() , replace() . |
Sử dụng trong đa luồng | Thích hợp cho môi trường đa luồng nhờ tính đồng bộ hóa. | Thích hợp cho môi trường đơn luồng hoặc khi đồng bộ hóa không cần thiết. |
Khả năng tối ưu hóa | Tối ưu cho các thao tác trong môi trường đa luồng nhờ sự đồng bộ hóa. | Tối ưu cho các thao tác đơn luồng do không có đồng bộ hóa. |
Khả năng điều chỉnh kích thước | Hỗ trợ điều chỉnh kích thước tự động. | Hỗ trợ điều chỉnh kích thước tự động. |
Tạo đối tượng mới | Không tạo đối tượng mới khi thay đổi nội dung. | Không tạo đối tượng mới khi thay đổi nội dung. |
Tóm lại: Khi lựa chọn giữa StringBuffer và StringBuilder, bạn cần cân nhắc giữa hiệu suất và tính an toàn cho đa luồng. Nếu hiệu suất là ưu tiên hàng đầu và bạn chắc chắn rằng chỉ có một luồng truy cập, hãy sử dụng StringBuilder. Ngược lại, nếu bạn cần đảm bảo tính an toàn cho đa luồng, hãy sử dụng StringBuffer.
Ⅲ. Cú pháp khai báo lớp StringBuilder
Cú pháp
public final class StringBuilder
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 StringBuilder 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 StringBuilder 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 StringBuilder.
↳ class StringBuilder: Đây là tên của lớp, là StringBuilder.
↳ extends Object: Lớp StringBuilder 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 StringBuilder thừa hưởng các phương thức từ lớp Object.
Lớp java.lang.StringBuilder được implements từ các interface Serializable và CharSequence.
↳ implements Serializable: Lớp StringBuilder 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 StringBuilder 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 StringBuilder 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 StringBuilder
Lớp StringBuilder 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 StringBuilder 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:
↳ StringBuilder(): Tạo một đối tượng StringBuilder rỗng với dung lượng ban đầu là 16 ký tự.
↳ StringBuilder(CharSequence seq): Tạo một đối tượng StringBuilder chứa cùng các ký tự với đối tượng CharSequence được chỉ định.
↳ StringBuilder(int capacity): Tạo một đối tượng StringBuilder rỗng với dung lượng ban đầu được chỉ định.
↳ StringBuilder(String str): Tạo một đối tượng StringBuilder được khởi tạo với nội dung của chuỗi được chỉ định.
Dưới đây là ví dụ về các constructor của lớp StringBuilder trong Java:
Ví dụ: Example.java
ppublic class Example {
public static void main(String[] args) {
// Constructor không tham số: Tạo đối tượng StringBuilder rỗng với dung lượng ban đầu là 16 ký tự.
StringBuilder sb1 = new StringBuilder();
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 StringBuilder chứa các ký tự từ CharSequence.
CharSequence cs = "Hello, CharSequence!";
StringBuilder sb2 = new StringBuilder(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 StringBuilder rỗng với dung lượng ban đầu được chỉ định.
StringBuilder sb3 = new StringBuilder(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 StringBuilder được khởi tạo với nội dung của chuỗi.
String str = "Hello, StringBuilder!";
StringBuilder sb4 = new StringBuilder(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à:
Nội dung của sb2: Hello, CharSequence!
Dung lượng ban đầu của sb3: 50
Nội dung của sb4: Hello, StringBuilder!
Trong ví dụ trên, các constructor của StringBuilder cho phép tạo các đố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 StringBuilder
Lớp StringBuilder 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 StringBuilder sau khi nó được tạo. Việc phân nhóm các phương thức của lớp StringBuilder 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 StringBuilder
Phương thức | Mô tả |
---|---|
StringBuilder append(boolean b) | Thêm biểu diễn chuỗi của giá trị boolean b vào cuối chuỗi. |
StringBuilder append(char c) | Thêm ký tự c vào cuối chuỗi. |
StringBuilder append(char[] str) | Thêm toàn bộ mảng ký tự str vào cuối chuỗi. |
StringBuilder 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 . |
StringBuilder append(CharSequence s) | Thêm chuỗi ký tự s vào cuối chuỗi. |
StringBuilder 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 . |
StringBuilder append(double d) | Thêm biểu diễn chuỗi của số thực d vào cuối chuỗi. |
StringBuilder 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. |
StringBuilder append(int i) | Thêm biểu diễn chuỗi của số nguyên i vào cuối chuỗi. |
StringBuilder 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. |
StringBuilder append(Object obj) | Thêm biểu diễn chuỗi của đối tượng obj vào cuối chuỗi. |
StringBuilder append(String str) | Thêm chuỗi str vào cuối chuỗi. |
StringBuilder append(StringBuilder sb) | Thêm nội dung của StringBuilder sb vào cuối chuỗi. |
StringBuilder 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 StringBuilder
Phương thức | Mô tả |
---|---|
StringBuilder deleteCharAt(int index) | Xóa ký tự duy nhất tại vị trí index trong chuỗi. |
StringBuilder delete(int start, int end) | Xóa tất cả các ký tự từ vị trí start đến end - 1 trong chuỗi StringBuilder . |
Phương thức insert() chèn dữ liệu vào một vị trí cụ thể của lớp StringBuilder
Phương thức | Mô tả |
---|---|
StringBuilder 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. |
StringBuilder insert(int offset, char c) | Chèn ký tự c vào vị trí offset trong chuỗi. |
StringBuilder insert(int offset, char[] str) | Chèn toàn bộ mảng ký tự str vào vị trí offset trong chuỗi. |
StringBuilder 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 . |
StringBuilder insert(int dstOffset, CharSequence s) | Chèn chuỗi ký tự s vào vị trí dstOffset trong chuỗi. |
StringBuilder 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 . |
StringBuilder 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. |
StringBuilder 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. |
StringBuilder 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. |
StringBuilder 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. |
StringBuilder 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. |
StringBuilder 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 StringBuilder
Phương thức | Mô tả |
---|---|
StringBuilder 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 StringBuilder
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
int | indexOf(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. |
int | indexOf(String str, int fromIndex) | Tương tự như trên, nhưng bắt đầu tìm kiếm từ vị trí fromIndex . |
int | lastIndexOf(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. |
int | lastIndexOf(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 StringBuilder
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
int | capacity() | 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. |
int | length() | 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ữ. |
char | charAt(int index) | Trả về ký tự tại vị trí index trong chuỗi. Index bắt đầu từ 0. |
String | toString() | 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 StringBuilder
Phương thức | Mô tả |
---|---|
StringBuilder reverse() | Đảo ngược toàn bộ thứ tự các ký tự trong chuỗi StringBuilder. |
Các phương thức quản lý dung lượng chuỗi của lớp StringBuilder
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
void | ensureCapacity(int minimumCapacity) | Đảm bảo dung lượng của bộ đệm ít nhất bằng minimumCapacity . |
void | setLength(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'. |
void | trimToSize() | 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 StringBuilder
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
CharSequence | subSequence(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 . |
String | substring(int start) | Trả về một chuỗi con của chuỗi hiện tại bắt đầu từ vị trí start . |
String | substring(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 . |
void | getChars(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 StringBuilder
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
int | codePointAt(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ự. |
int | codePointBefore(int index) | Trả về điểm mã Unicode trước vị trí index trong chuỗi. |
int | codePointCount(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 ). |
int | offsetByCodePoints(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ế.