Lớp java.lang.String
Như đã biết, chuỗi trong Java không phải là một kiểu dữ liệu nguyên thủy như số nguyên (int), ký tự (char) hay kiểu logic (boolean). Thay vào đó, chuỗi là một đối tượng thuộc lớp java.lang.String. Điều này có nghĩa là chuỗi sở hữu các phương thức và thuộc tính phong phú, cho phép bạn thực hiện nhiều thao tác linh hoạt trên dữ liệu văn bản.
Bạn không cần phải khai báo import java.lang.String vì lớp này được tự động import vào mọi chương trình Java. Nhờ đó, bạn có thể sử dụng lớp String và các lớp khác trong gói java.lang. một cách trực tiếp mà không cần khai báo thêm.
Trong các phần tiếp theo, chúng ta sẽ đi sâu vào việc khám phá các phương thức và thuộc tính của lớp java.lang.String để hiểu rõ hơn về cách làm việc với chuỗi trong Java.
Khi nào nên sử dụng String?
↳ Chuỗi không đổi: Khi bạn có một chuỗi mà giá trị của nó không thay đổi trong suốt quá trình thực hiện chương trình.
↳ Làm khóa: Sử dụng String làm khóa trong các cấu trúc dữ liệu như HashMap vì tính không thay đổi của nó.
↳ Đọc dữ liệu từ file hoặc database: Khi bạn đọc dữ liệu từ file hoặc database, thường là các chuỗi không đổi.
Ⅰ. Cú pháp khai báo lớp String
Cú pháp
public final class String
extends Object
implements Serializable, Comparable<String>, 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 String 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 String 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 String.
↳ class String: Đây là tên của lớp, là String.
↳ extends Object: Lớp String 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 String thừa hưởng các phương thức từ lớp Object.
Lớp java.lang.String được implements từ các interface Serializable, Comparable and CharSequence.
↳ implements Serializable: Lớp String thực hiện giao diện Serializable, có nghĩa là các đối tượng của lớp này có thể được tuần tự hóa (chuyển đổi thành một chuỗi byte để lưu trữ hoặc truyền tải).
↳ implements Comparable<String>: Lớp String thực hiện giao diện Comparable<String>, có nghĩa là các đối tượng String có thể được so sánh với nhau để xác định thứ tự sắp xếp (thứ tự tự nhiên của chúng).
↳ implements CharSequence: Lớp String thực hiện giao diện CharSequence, đại diện cho một chuỗi các ký tự và cung cấp các phương thức để làm việc với các chuỗi ký tự.

Ⅱ. Trường dữ liệu của lớp String
Trong lớp String của Java, CASE_INSENSITIVE_ORDER là một trường dữ liệu tĩnh (static field) đại diện cho một đối tượng Comparator dùng để so sánh các chuỗi mà không phân biệt chữ hoa và chữ thường.
static Comparator<String> CASE_INSENSITIVE_ORDER: Một đối tượng so sánh (Comparator) dùng để sắp xếp các đối tượng kiểu String theo thứ tự của phương thức compareToIgnoreCase.
Giải thích chi tiết:
↳ Comparator<String>: Đây là một giao diện trong Java được sử dụng để so sánh các đối tượng. Ở đây, nó được đặc biệt hóa để so sánh các đối tượng kiểu String.
↳ CASE_INSENSITIVE_ORDER: Đây là một hằng số (static) đại diện cho một đối tượng Comparator cụ thể. Đối tượng này sẽ so sánh hai chuỗi mà không phân biệt chữ hoa chữ thường.
↳ compareToIgnoreCase(): Đây là một phương thức của lớp String dùng để so sánh hai chuỗi. Nó trả về một số nguyên:
↳ Âm: Nếu chuỗi hiện tại nhỏ hơn chuỗi được truyền vào.
↳ Dương: Nếu chuỗi hiện tại lớn hơn chuỗi được truyền vào.
↳ 0: Nếu hai chuỗi bằng nhau.
Điểm đặc biệt của compareToIgnoreCase() là nó sẽ bỏ qua sự khác biệt giữa chữ hoa và chữ thường khi so sánh.
Hãy cùng xem xét một ví dụ chi tiết về cách sử dụng Comparator<String> CASE_INSENSITIVE_ORDER để sắp xếp các chuỗi mà không phân biệt chữ hoa và chữ thường.
Ví dụ: Example.java
import java.util.Arrays;
import java.util.List;
public class Example {
public static void main(String[] args) {
// Tạo một danh sách các chuỗi
List<String> strings = Arrays.asList("Apple", "banana", "Cherry", "apple", "Banana", "cherry");
// In danh sách trước khi sắp xếp
System.out.println("Trước khi sắp xếp:");
for (String s : strings) {
System.out.println(s);
}
// Sắp xếp danh sách sử dụng String.CASE_INSENSITIVE_ORDER
strings.sort(String.CASE_INSENSITIVE_ORDER);
// In danh sách sau khi sắp xếp
System.out.println("\nSau khi sắp xếp:");
for (String s : strings) {
System.out.println(s);
}
}
}
Kết quả của chương trình là:
Apple
banana
Cherry
apple
Banana
cherry
Sau khi sắp xếp:
Apple
banana
Banana
Cherry
cherry
Hy vọng ví dụ này giúp bạn hiểu rõ hơn về cách sử dụng CASE_INSENSITIVE_ORDER trong Java!
Ⅲ. Các hàm khởi tạo (Constructor) của lớp String
Lớp String trong Java cung cấp nhiều hàm khởi tạo (constructor) khác nhau để tạo ra các đối tượng chuỗi. Mỗi hàm khởi tạo có cách thức tạo chuỗi khác nhau. Dưới đây là Danh sách các hàm khởi tạo của lớp String:
↳ String(): Tạo một chuỗi rỗng.
↳ String(byte[] bytes): Tạo một chuỗi bằng cách giải mã mảng byte sử dụng charset mặc định của hệ thống.
↳ String(byte[] bytes, Charset charset): Tạo một chuỗi bằng cách giải mã mảng byte sử dụng charset được chỉ định.
↳ String(char[] value): Tạo một chuỗi từ một mảng ký tự.
↳ String(char[] value, int offset, int count): Tạo một chuỗi từ một phần của mảng ký tự.
↳ String(int[] codePoints, int offset, int count): Tạo một chuỗi từ một mảng các điểm mã Unicode.
↳ String(String original): Tạo một bản sao của chuỗi đã cho.
↳ String(StringBuffer buffer): Tạo một chuỗi từ nội dung của một đối tượng StringBuffer.
↳ String(StringBuilder builder): Tạo một chuỗi từ nội dung của một đối tượng StringBuilder.
Dưới đây là ví dụ về một lớp Example trong đó có sử dụng cả 9 constructor của lớp String mà chúng tôi đã đề cập:
Ví dụ: Example.java
import java.nio.charset.Charset;
public class Example {
public static void main(String[] args) {
// 1. String(): Tạo một chuỗi rỗng.
String str1 = new String();
System.out.println("Chuỗi rỗng: '" + str1 + "'");
// 2. String(byte[] bytes): Tạo một chuỗi bằng cách giải mã mảng byte sử dụng charset mặc định của hệ thống.
byte[] byteArray = {72, 101, 108, 108, 111}; // "Hello" trong ASCII
String str2 = new String(byteArray);
System.out.println("Chuỗi từ mảng byte: " + str2);
// 3. String(byte[] bytes, Charset charset): Tạo một chuỗi bằng cách giải mã mảng byte sử dụng charset được chỉ định.
Charset charset = Charset.forName("UTF-8");
String str3 = new String(byteArray, charset);
System.out.println("Chuỗi từ mảng byte với charset: " + str3);
// 4. String(char[] value): Tạo mộ
// t chuỗi từ một mảng ký tự.
char[] charArray = {'J', 'a', 'v', 'a'};
String str4 = new String(charArray);
System.out.println("Chuỗi từ mảng ký tự: " + str4);
// 5. String(char[] value, int offset, int count): Tạo một chuỗi từ một phần của mảng ký tự.
String str5 = new String(charArray, 1, 2); // "av"
System.out.println("Chuỗi từ phần của mảng ký tự: " + str5);
// 6. String(int[] codePoints, int offset, int count): Tạo một chuỗi từ một mảng các điểm mã Unicode.
int[] codePoints = {0x0048, 0x0065, 0x006C, 0x006C, 0x006F}; // "Hello" trong Unicode
String str6 = new String(codePoints, 0, codePoints.length);
System.out.println("Chuỗi từ các điểm mã Unicode: " + str6);
// 7. String(String original): Tạo một bản sao của chuỗi đã cho.
String original = "Original String";
String str7 = new String(original);
System.out.println("Bản sao của chuỗi đã cho: " + str7);
// 8. String(StringBuffer buffer): Tạo một chuỗi từ nội dung của một đối tượng StringBuffer.
StringBuffer stringBuffer = new StringBuffer("StringBuffer");
String str8 = new String(stringBuffer);
System.out.println("Chuỗi từ StringBuffer: " + str8);
// 9. String(StringBuilder builder): Tạo một chuỗi từ nội dung của một đối tượng StringBuilder.
StringBuilder stringBuilder = new StringBuilder("StringBuilder");
String str9 = new String(stringBuilder);
System.out.println("Chuỗi từ StringBuilder: " + str9);
}
}
Kết quả của chương trình là:
Chuỗi từ mảng byte: Hello
Chuỗi từ mảng byte với charset: Hello
Chuỗi từ mảng ký tự: Java
Chuỗi từ phần của mảng ký tự: av
Chuỗi từ các điểm mã Unicode: Hello
Bản sao của chuỗi đã cho: Original String
Chuỗi từ StringBuffer: StringBuffer
Chuỗi từ StringBuilder: StringBuilder
Hy vọng ví dụ này giúp bạn hiểu rõ hơn về cách sử dụng các hàm khởi tạo (constructor) trong Java!
Ⅳ. Phương thức của lớp String
Lớp String cung cấp rất nhiều phương thức để thao tác với chuối. Việc phân nhóm các phương thức của lớp String 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:
Các phương thức kiểm tra nội dung chuỗi trong lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
boolean | contains(CharSequence s) | Kiểm tra xem chuỗi có chứa chuỗi con s hay không. |
boolean | startsWith(String prefix) | Kiểm tra xem chuỗi có bắt đầu bằng chuỗi prefix hay không. |
boolean | startsWith(String prefix, int toffset) | Kiểm tra xem chuỗi con bắt đầu từ vị trí toffset có bắt đầu bằng chuỗi prefix hay không. |
boolean | endsWith(String suffix) | Kiểm tra xem chuỗi có kết thúc bằng một chuỗi hậu tố nào đó hay không. |
boolean | isEmpty() | Kiểm tra xem chuỗi có rỗng hay không. |
boolean | matches(String regex) | Kiểm tra xem chuỗi có khớp với một biểu thức chính quy nào đó hay không. |
Các phương thức so sánh nội dung chuỗi trong lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
boolean | equals(Object anObject) | So sánh hai đối tượng xem có bằng nhau không (áp dụng cho cả chuỗi). |
boolean | equalsIgnoreCase(String anotherString) | So sánh hai chuỗi, bỏ qua chữ hoa chữ thường. |
boolean | contentEquals(CharSequence cs) | So sánh nội dung của chuỗi hiện tại với chuỗi cs . |
boolean | contentEquals(StringBuffer sb) | So sánh nội dung của chuỗi hiện tại với với StringBuffer được chỉ định. cs . |
boolean | regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) | Kiểm tra xem hai vùng của chuỗi có bằng nhau hay không, có thể bỏ qua chữ hoa chữ thường. |
boolean | regionMatches(int toffset, String other, int ooffset, int len) | Kiểm tra xem hai vùng của chuỗi có bằng nhau hay không. |
int | compareTo(String anotherString) | So sánh hai chuỗi theo thứ tự từ điển. |
int | compareToIgnoreCase(String str) | So sánh hai chuỗi theo thứ tự từ điển, bỏ qua chữ hoa chữ thường. |
Các phương thức xác định vị trí của ký tự trong chuỗi của lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
int | indexOf(int ch) | Trả về vị trí xuất hiện đầu tiên của ký tự ch trong chuỗi. |
int | indexOf(int ch, int fromIndex) | Trả về vị trí xuất hiện đầu tiên của ký tự ch trong chuỗi bắt đầu từ vị trí fromIndex . |
int | indexOf(String str) | Trả về vị trí xuất hiện đầu tiên của chuỗi con str trong chuỗi. |
int | indexOf(String str, int fromIndex) | Trả về vị trí xuất hiện đầu tiên của chuỗi con str trong chuỗi bắt đầu từ vị trí fromIndex . |
int | lastIndexOf(int ch) | Trả về vị trí xuất hiện cuối cùng của ký tự ch trong chuỗi. |
int | lastIndexOf(int ch, int fromIndex) | Trả về vị trí xuất hiện cuối cùng của ký tự ch trong chuỗi, tìm kiếm từ vị trí fromIndex về trước. |
int | lastIndexOf(String str) | Trả về vị trí xuất hiện cuối cùng của chuỗi con str trong chuỗi. |
int | lastIndexOf(String str, int fromIndex) | Trả về vị trí xuất hiện cuối cùng của chuỗi con str trong chuỗi, tìm kiếm từ vị trí fromIndex về trước. |
Phương thức xác định độ dài chuỗi của lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
int | length() | Trả về độ dài của chuỗi (số lượng ký tự). |
Các phương thức chuyển đổi giá trị thành chuỗi trong lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
static String | valueOf(boolean b) | Chuyển đổi giá trị boolean thành chuỗi. |
static String | valueOf(char c) | Chuyển đổi ký tự thành chuỗi. |
static String | valueOf(char[] data) | Chuyển đổi mảng ký tự thành chuỗi. |
static String | valueOf(char[] data, int offset, int count) | Chuyển đổi một phần của mảng ký tự thành chuỗi. |
static String | valueOf(double d) | Chuyển đổi số thực thành chuỗi. |
static String | valueOf(float f) | Chuyển đổi số thực đơn độ chính xác thành chuỗi. |
static String | valueOf(int i) | Chuyển đổi số nguyên thành chuỗi. |
static String | valueOf(long l) | Chuyển đổi số nguyên dài thành chuỗi. |
static String | valueOf(Object obj) | Chuyển đổi đối tượng thành chuỗi. |
byte[] | getBytes() | Chuyển đổi chuỗi thành mảng byte sử dụng charset mặc định của hệ thống. |
byte[] | getBytes(Charset charset) | Chuyển đổi chuỗi thành mảng byte sử dụng charset được chỉ định. |
byte[] | getBytes(String charsetName) | Chuyển đổi chuỗi thành mảng byte sử dụng charset có tên được chỉ định. |
char[] | toCharArray() | Chuyển đổi chuỗi thành mảng ký tự. |
static String | copyValueOf(char[] data) | Tạo một chuỗi từ mảng ký tự data. |
static String | copyValueOf(char[] data, int offset, int count) | Tạo một chuỗi từ một phần của mảng ký tự data. |
Các phương thức định dạng chuỗi theo mẫu trong lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
static String | format(Locale l, String format, Object... args) | Tạo một chuỗi được định dạng theo định dạng và đối số cho trước, sử dụng locale cụ thể. |
static String | format(String format, Object... args) | Tạo một chuỗi được định dạng theo định dạng và đối số cho trước. |
Các phương thức nối chuỗi trong lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
String | concat(String str) | Nối chuỗi đã chỉ định vào cuối chuỗi này. |
static String | join(CharSequence delimiter, CharSequence... elements) | Nối các phần tử CharSequence với nhau bằng một dấu phân cách. |
static String | join(CharSequence delimiter, Iterable<? extends CharSequence> elements) | Nối các phần tử CharSequence với nhau bằng một dấu phân cách. |
Các phương thức thay thế ký tự và chuỗi con trong lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
String | replace(char oldChar, char newChar) | Thay thế tất cả các ký tự oldChar bằng ký tự newChar . |
String | replace(CharSequence target, CharSequence replacement) | Thay thế tất cả các chuỗi con khớp với target bằng replacement . |
String | replaceAll(String regex, String replacement) | Thay thế tất cả các chuỗi con khớp với biểu thức chính quy regex bằng replacement . |
String | replaceFirst(String regex, String replacement) | Thay thế chuỗi con đầu tiên khớp với biểu thức chính quy regex bằng replacement . |
Các phương thức truy xuất chuỗi và ký tự trong lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
String | substring(int beginIndex) | Trả về một phần của chuỗi bắt đầu từ một vị trí nhất định. |
String | substring(int beginIndex, int endIndex) | Trả về một phần của chuỗi nằm giữa hai vị trí. |
char | charAt(int index) | Trả về ký tự tại vị trí index trong chuỗi. |
void | getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | Sao chép các ký tự từ chuỗi này vào mảng ký tự đích. |
Các phương thức tách chuỗi bằng biểu thức chính quy của lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
String[] | split(String regex) | Tách chuỗi này xung quanh các phần khớp với biểu thức chính quy đã cho. |
String[] | split(String regex, int limit) | Tách chuỗi này xung quanh các phần khớp với biểu thức chính quy đã cho, với giới hạn số lần tách. |
Các phương thức chuyển đổi chữ hoa và chữ thường của lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
String | toUpperCase() | Chuyển đổi tất cả ký tự trong chuỗi thành chữ hoa. |
String | toUpperCase(Locale locale) | Chuyển đổi tất cả ký tự trong chuỗi thành chữ hoa theo quy tắc của locale . |
String | toLowerCase() | Chuyển đổi tất cả ký tự trong chuỗi thành chữ thường. |
String | toLowerCase(Locale locale) | Chuyển đổi tất cả ký tự trong chuỗi thành chữ thường theo quy tắc của locale . |
Phương thức loại bỏ khoảng trắng chuỗi của lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
String | trim() | Loại bỏ các khoảng trắng ở đầu và cuối chuỗi. |
Các phương thức này hỗ trợ xử lý điểm mã Unicode của lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
int | codePointAt(int index) | Trả về điểm mã Unicode tại một vị trí cụ thể. |
int | codePointBefore(int index) | Trả về điểm mã Unicode trước một vị trí cụ thể. |
int | codePointCount(int beginIndex, int endIndex) | Trả về số lượng điểm mã Unicode trong một khoảng chỉ định của chuỗi. |
int | offsetByCodePoints(int index, int codePointOffset) | Tính toán vị trí mới dựa trên vị trí ban đầu và số lượng điểm mã dịch chuyển. Các phương thức này đặc biệt hữu ích khi làm việc với các ký tự đặc biệt hoặc các ngôn ngữ khác nhau, nơi một ký tự có thể được biểu diễn bằng nhiều điểm mã. |
Phương thức lấy mã băm (Hash Code) đại diện cho chuỗi của lớp String
Kiểu trả về | Phương thức | Mô tả |
---|---|---|
int | hashCode() | Trả về một giá trị mã băm đại diện cho chuỗi. Mã băm này được sử dụng trong các cấu trúc dữ liệu như HashMap để định vị và quản lý các đối tượng một cách hiệu quả. |
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ế.