Bài 2.6. Tìm hiểu lớp String
Nội dung bài học
- Bản chất của String
- Phép nối chuỗi
- Các kí tự đặc biệt
- Phép cộng String với các giá trị số
- Các phương thức của lớp String
- Nhập dữ liệu từ bàn phím
- Bài tập thực hành
Bản chất của String
- Kiểu String dùng để lưu trữ chuỗi các kí tự trong ngôn ngữ lập trình Java. Chuỗi kí tự là tập các kí tự được sắp đặt theo một trật tự nhất định nhằm biểu đạt một ý nghĩa nào đó và đặt trong cặp nháy kép “”.
- Ví dụ: String message = “I Love You”;
- String là một kiểu bất biến (immutable) trong ngôn ngữ lập trình Java.
- Về bản chất nó là một final class.
- Kiểu bất biến là một kiểu mà giá trị của nó kể từ sau khi được gán thì không thể thay đổi.
- Khi tạo biến kiểu String thì đó là biến kiểu đối tượng(object) không phải biến của kiểu nguyên thủy. Do đó ta có thể thực hiện các thao tác gọi phương thức trên đối tượng của kiểu String.
- Ví dụ:
public class Lesson26 {
public static void main(String[] args) {
String fullName = "Lê Nguyễn Bảo Ngọc";
String upperCaseName = fullName.toUpperCase(); // viết hoa toàn bộ chuỗi kí tự
var lowerCaseName = fullName.toLowerCase(); // viết thường toàn bộ chuỗi kí tự
// hiển thị kết quả lên màn hình
System.out.println("Họ và tên: " + fullName);
System.out.println("Họ và tên viết HOA: " + upperCaseName);
System.out.println("Họ và tên viết thường: " + lowerCaseName);
}
}
Họ và tên: Lê Nguyễn Bảo Ngọc
Họ và tên viết HOA: LÊ NGUYỄN BẢO NGỌC
Họ và tên viết thường: lê nguyễn bảo ngọc
Phép nối chuỗi
- Để nối chuỗi trong Java ta dùng toán tử +. Khi nối chuỗi thì chuỗi được nối, tức sau dấu + sẽ cắm vào cuối chuỗi trước đó.
- Chuỗi kết quả sau khi nối là một đối tượng String mới được tạo ra với nội dung chứa cả 2 chuỗi được nối.
- Tính đến phiên bản Java 21 ta có ít nhất 4 cách nối chuỗi kí tự:
- Sử dụng toán tử +.
- Sử dụng phương thức concat().
- Sử dụng string template. Chi tiết về string template ta tìm hiểu ở mục kế tiếp.
- Sử dụng StringBuilder/StringBuffer. Chi tiết ta tìm hiểu ở một bài học gần cuối chương này.
- Ví dụ:
public class Sample {
public static void main(String[] args) {
var first = "Ngọc";
var last = "Lê";
var middle = "Nguyễn Bảo";
// cách 1: dùng toán tử +
var fullName = last + " " + middle + " " + first;
System.out.println(fullName);
// cách 3: sử dụng phương thức nối chuỗi
fullName = last.concat(" ").concat(middle).concat(" ").concat(first);
System.out.println(fullName);
}
}
Lê Nguyễn Bảo Ngọc
Lê Nguyễn Bảo Ngọc
Các kí tự đặc biệt
- Trong ví dụ trên ta thấy rằng, để hiển thị ra dấu nháy kép “ thì ta phải cho thêm dấu \ trước “ thành \”. Đó là ví dụ về các kí tự đặc biệt trong Java. Nội dung của String trong Java quy ước nằm trong cặp “” nên nếu bạn muốn in ra “ mà không cung cấp thêm \ ở trước thì sẽ bị lỗi.
- Sau đây là một số kí tự đặc biệt khác trong ngôn ngữ Java:
Kí tự đặc biệt |
Mô tả chức năng |
\’ | Đại diện cho kí tự ‘ |
\” | Đại diện cho kí tự “ |
\\ | Đại diện cho kí tự \ |
\n | Xuống dòng mới |
\t | Tạo một tab ngang thường tương đương với 4 kí tự |
- Ví dụ minh họa sử dụng các kí tự đặc biệt trên:
public class Lesson26 {
public static void main(String[] args) {
// một số kí tự đặc biệt
var someMessage = "Xin chào bạn 'Hương'";
System.out.println(someMessage);
someMessage = "Xin chào bạn \"Hương\"";
System.out.println(someMessage);
// \n
var message = "Where\nare\nyou\nnow?";
System.out.println(message);
// \t
message = "Welcome\tto\tBranium!";
System.out.println(message);
// \\
var path = "C:\\Users\\trieu\\Downloads\\IT_Report_2023_Vie.pdf";
System.out.println(path);
}
}
Xin chào bạn 'Hương'
Xin chào bạn "Hương"
Where
are
you
now?
Welcome to Branium!
C:\Users\trieu\Downloads\IT_Report_2023_Vie.pdf
Phép cộng String với các giá trị số
- Khi thực hiện phép cộng + với String ta phải hết sức lưu ý. Bởi vì mặc định chương trình Java coi rằng nếu có 1 toán hạng của phép + là String thì đó là phép nối chuỗi. Không phải phép cộng hai số.
- Khi ta cộng số với String, kết quả nhận được là String. Do đó ví dụ sau cho kết quả không như ta mong muốn:
int numberA = 200;
int numberB = 500;
String result = "numberA + numberB = " + numberA + numberB;
// Mong muốn: numberA + numberB = 700
System.out.println(result);
// Thực tế: numberA + numberB = 200500
- Để có được kết quả chính xác ta sử dụng cặp ngoặc tròn ( ) gói cụm biểu thức cần ưu tiên thực hiện lại. Ví dụ sau đã sửa lại:
int numberA = 200;
int numberB = 500;
String result = "numberA + numberB = " + (numberA + numberB);
// Mong muốn: numberA + numberB = 700
System.out.println(result);
// Thực tế: numberA + numberB = 700
Các phương thức của lớp String
- Lưu ý rằng vị trí của kí tự trong chuỗi, mảng của Java luôn bắt đầu từ 0. Do đó phần tử đầu tiên của chuỗi kí tự là vị trí 0, phần tử thứ hai bắt đầu từ vị trí 1… Phần tử cuối cùng của chuỗi có chỉ số là N – 1 với N là độ dài chuỗi lấy từ phương thức length().
- Sau đây là một số phương thức thường dùng của lớp String và ý nghĩa của nó:
Phương thức |
Ý nghĩa sử dụng |
length() | Cho biết độ dài của chuỗi tính theo số kí tự. Luôn >= 0 |
toUpperCase() | Viết hoa toàn bộ chuỗi |
toLowerCase() | Viết thường toàn bộ chuỗi |
indexOf() | Tìm vị trí đầu tiên của một kí tự/một chuỗi con trong chuỗi kí tự |
lastIndexOf() | Tìm vị trí cuối cùng của một kí tự/chuỗi con trong chuỗi gốc |
charAt(index) | Lấy ra kí tự tại vị trí index. Giá trị index phải >= 0 và < length() của chuỗi đang xét |
compareTo(other) | So sánh sự tương đương có phân biệt chữ hoa, chữ thường về mặt giá trị của hai chuỗi. Kết quả trả về giá trị số âm, 0 hoặc dương tùy vào mức độ tương quan của hai chuỗi. |
compareToIgnoreCase(other) | So sánh hai chuỗi về mặt giá trị. Không phân biệt chữ hoa chữ thường. Kết quả trả về giá trị âm nếu chuỗi hiện thời đứng trước other. Bằng 0 nếu hai chuỗi cùng giá trị. Dương nếu chuỗi hiện thời đứng sau chuỗi other. |
trim() | Loại bỏ kí tự khoảng trắng ở đầu và cuối chuỗi. Khoảng trắng là các kí tự dấu cách, dấu tab, xuống dòng. |
replace(old, newStr) | Thay thế kí chuỗi kí tự old bằng kí tự/chuỗi kí tự newStr. Thực hiện thay thế toàn bộ chuỗi old bằng newStr xuất hiện trong chuỗi. |
replaceAll(regex, newStr) | Thay thế tất cả các chuỗi con thỏa mãn regex trong chuỗi gốc bằng newStr. |
split(regex) | Tách chuỗi và trả về mảng String sau khi tách. regex là mẫu kí tự so khớp cần để xác định điều kiện tách chuỗi. Ví dụ regex =”\\s+” chỉ định tách chuỗi tại vị trí có 1 hoặc nhiều dấu cách. Chi tiết về regex và các quy tắc so khớp bạn tìm hiểu trong chương Regular Expression. |
substring(startIndex) | Trích xuất chuỗi con của chuỗi gốc từ vị trí startIndex đến hết chuỗi gốc. |
substring(start, end) | Trích xuất chuỗi con của chuỗi gốc từ vị trí start đến trước vị trí end. |
isEmpty() | Kiểm tra xem chuỗi hiện thời có rỗng hay không. Kết quả nhận được là true nếu độ dài chuỗi bằng 0 và ngược lại kết quả là false. |
isBlank() | Kiểm tra xem chuỗi hiện thời có rỗng hoặc chỉ chứa các kí tự khoảng trắng hay không. Kí tự khoảng trắng là các kí tự như dấu cách, dấu tab, xuống dòng. Như vậy một chuỗi là blank chưa chắc empty. |
format(Locale loc, String format, Object… args)
format(String format, Object… args) |
Định dạng đối tượng dữ liệu thành String có dạng được chỉ định. |
- Để biết thêm các phương thức khác bạn để con trỏ chuột sau tên đối tượng String. Nhấn phím . sẽ hiện ra lúc này bạn chọn phương thức và ấn Ctrl, click chuột trái vào tên phương thức để xem mô tả chức năng chi tiết.
- Để hiển thị dữ liệu lên màn hình theo định dạng, ta sử dụng phương thức printf() với các định dạng sau:
- Hiển thị số nguyên: %d.
- Hiển thị số thực: %f.
- Hiển thị kí tự: %c.
- Hiển thị chuỗi kí tự: %s.
- Hiển thị %: %%.
- Chi tiết thêm về các loại định dạng bạn tìm hiểu thêm trong bài học 2.9 của chương này nhé.
- Ví dụ 1: sử dụng một số phương thức phổ biến của String.
public class Lesson26 {
public static void main(String[] args) {
var fullName = "lê nguyễn hoàng long";
System.out.printf("Độ dài của fullName: %d\n", fullName.length());
System.out.printf("Viết hoa: %s\n", fullName.toUpperCase());
System.out.printf("Viết thường: %s\n", fullName.toLowerCase());
System.out.printf("Vị trí đầu tiên của kí tự 'o': %d\n", fullName.indexOf('o'));
System.out.printf("Vị trí cuối cùng của kí tự 'g': %d\n", fullName.lastIndexOf('g'));
System.out.printf("Kí tự tại vị trí 5: %c\n", fullName.charAt(5));
var newFullName = fullName.replace('l', 'L');
System.out.printf("Họ tên sau khi thay thế: %s\n", newFullName);
var message = " Phong Vân ";
System.out.printf("Sau khi loại bỏ khoảng trắng thừa: \"%s\"\n", message.trim());
var words = fullName.split("\\s+");
System.out.printf("Số từ trong tên: %d\n", words.length);
}
}
Độ dài của fullName: 32
Viết hoa: LÊ NGUYỄN HOÀNG LONG
Viết thường: lê nguyễn hoàng long
Vị trí đầu tiên của kí tự 'o': 20
Vị trí cuối cùng của kí tự 'g': 31
Kí tự tại vị trí 5:
Họ tên sau khi thay thế: Lê nguyễn hoàng Long
Sau khi loại bỏ khoảng trắng thừa: "Phong Vân"
Số từ trong tên: 4
- Ví dụ 2: so sánh hai chuỗi kí tự với nhau.
String nam = "Nam";
String other = "nam";
System.out.println(nam.compareTo(other));
System.out.println(nam.compareToIgnoreCase(other));
// kết quả:
-32
0
- Ví dụ 3: định dạng dữ liệu với String.format():
public class Lesson26 {
public static void main(String[] args) {
long income = 9999999999L;
double PI = 3.14159265358979323846;
double price = 1899.12345;
// bổ sung dấu phẩy ngăn cách giữa phần nghìn và phần còn lại
System.out.printf("%s\n", String.format("%,d", income));
// làm tròn đến hai chữ số và dùng dấu phẩy phân tách phần nghìn
System.out.printf("%s\n", String.format("%,.2f", price));
// làm tròn đến 3 chữ số đằng sau dấu chấm phân tách phần nguyên, thực
System.out.printf("%s\n", String.format("%.3f", PI));
}
}
9,999,999,999
1,899.12
3.142
Nhập dữ liệu từ bàn phím
- Để nhập dữ liệu cho chuỗi kí tự từ bàn phím. Ta dùng phương thức sau:
- next(): Đọc vào từng từ. Việc đọc sẽ dừng khi gặp khoảng trắng như dấu cách, dấu tab, hoặc ấn phím enter.
- nextLine(): Đọc vào cả dòng. Việc đọc sẽ dừng khi bạn ấn phím enter.
- Chú ý: khi đọc một số, một từ hay một kí tự mà sau đó ta đọc cả dòng, cần phải đọc bỏ kí tự thừa của lần đọc trước đó với nextLine(). Tức là phải nextLine() hai lần.
- Ví dụ:
import java.util.Scanner;
public class Lesson26 {
public static void main(String[] args) {
// tạo đối tượng Scanner
Scanner scanner = new Scanner(System.in);
// đọc vào một dòng:
System.out.println("Họ và tên bạn là gì?");
var fullName = scanner.nextLine();
// đọc vào một số:
System.out.println("Bạn có bao nhiêu người yêu cũ rồi?");
var numberOfEx = scanner.nextInt();
// đọc vào một từ:
System.out.println("Người yêu hiện tại của bạn có tuyệt vời không?");
var status = scanner.next();
System.out.println("==> Thông tin người dùng: ");
System.out.printf("Họ và tên: %s\n", fullName);
System.out.printf("Số lượng người yêu cũ: %d\n", numberOfEx);
System.out.printf("Người yêu hiện tại có tuyệt vời không: %s\n", status);
}
}
Họ và tên bạn là gì?
Nguyễn Hoàng Long
Bạn có bao nhiêu người yêu cũ rồi?
101
Người yêu hiện tại của bạn có tuyệt vời không?
Có
==> Thông tin người dùng:
Họ và tên: Nguyễn Hoàng Long
Số lượng người yêu cũ: 101
Người yêu hiện tại có tuyệt vời không: Có
Bài tập thực hành
Đề bài đầy đủ: nhấn vào đây
Bài giải mẫu: nhấn vào đây