Mục lục bài họcĐang ở d01-b3
The String Class and Immutability
Strings never change; String methods build new Strings
A String object is immutable. No method in the class edits the characters it already holds; every method that looks like an edit actually returns a brand-new String and leaves the original alone. So s.toUpperCase(); on its own does nothing useful, while s = s.toUpperCase(); does what you meant.
The methods in the AP subset, with the exact conventions they use:
length()— number of characters; indices run from0tolength() - 1.substring(from)— from that index to the end.substring(from, to)— includesfrom, excludesto, so its length isto - from.indexOf(str)— index of the first occurrence, or-1if it is not there.equals(other)— same characters, case sensitive.compareTo(other)— negative, zero, or positive; it does not return −1 and 1 by contract.
Because a String variable is a reference, == asks “same object?” while equals asks “same characters?”. Two Strings built at run time can hold identical text and still fail ==. Comparing Strings with == is the single most common silent bug in this unit.
Đối tượng String là bất biến. Không phương thức nào trong lớp này sửa được dãy ký tự nó đang giữ; mọi phương thức trông như “sửa” thật ra trả về một String mới toanh và để nguyên chuỗi cũ. Vì thế s.toUpperCase(); đứng một mình không làm gì cả, còn s = s.toUpperCase(); mới đúng ý bạn.
Bộ phương thức có trong đề AP, kèm đúng quy ước của từng cái:
length()— số ký tự; chỉ số chạy từ0tớilength() - 1.substring(from)— lấy từ vị trí đó tới hết.substring(from, to)— lấy vị trífrom, bỏ vị tríto, nên độ dài kết quả đúng bằngto - from.indexOf(str)— vị trí lần xuất hiện đầu tiên, không có thì trả về-1.equals(other)— cùng dãy ký tự, có phân biệt hoa thường.compareTo(other)— trả về số âm, số 0 hoặc số dương; đề không hứa là −1 và 1, nên chỉ được xét dấu.
Vì biến String là một tham chiếu, dấu == hỏi “có phải cùng một đối tượng không”, còn equals hỏi “có cùng dãy ký tự không”. Hai chuỗi dựng lúc chạy có thể giống hệt nhau về chữ mà vẫn cho == ra false. So sánh chuỗi bằng == là lỗi âm thầm hay gặp nhất của cả Unit 1.
n nằm sau chữ thứ n. substring(a, b) cắt đúng đoạn giữa vạch a và vạch b, nên độ dài luôn bằng b - a và không cần nhớ “bao gồm hay không bao gồm”. Cũng nhờ cách đếm này mà s.substring(0, s.length()) ra đúng cả chuỗi, còn s.substring(s.length()) ra chuỗi rỗng chứ không phải lỗi.Cho String s = "Computer Science";. Xác định giá trị in ra của từng dòng, rồi cho biết vì sao dòng cuối in ra false.
System.out.println(s.substring(9, 12));
System.out.println(s.indexOf("Sci") + " " + s.indexOf("sci"));
String t = s.substring(0, 8);
String u = "Computer";
System.out.println(t.equals(u) + " " + (t == u));Dòng 1. Đếm vạch: vạch 9 đứng ngay trước chữ S, vạch 12 đứng sau ba ký tự. Kết quả là Sci, dài đúng 12 - 9 = 3.
Dòng 2. indexOf phân biệt hoa thường. Cụm Sci bắt đầu ở vị trí 9. Cụm sci viết thường không có trong chuỗi nên trả về -1. Dòng in ra 9 -1.
Dòng 3 và 4. t là một String mới do substring dựng ra lúc chạy, còn u là một String hằng viết thẳng trong mã. Hai đối tượng khác nhau, cùng dãy ký tự.
Dòng 5. t.equals(u) so từng ký tự nên ra true. Còn t == u so địa chỉ hai đối tượng nên ra false. Dòng in ra true false.
Đây đúng là hình huống nguy hiểm nhất: nếu bạn viết chương trình bằng == và thử với chuỗi hằng thì nó chạy đúng, tới khi dữ liệu tới từ bàn phím hay từ substring thì nó sai — mà không có thông báo lỗi nào.
==. Nó có thể ra true trong lúc bạn thử bài, vì hai chuỗi hằng giống nhau được Java gộp về một đối tượng, rồi ra false khi chạy thật. Cách chặn: đặt luật cứng cho chính mình — trong bài thi CS A, hai chuỗi chỉ được so bằng equals hoặc compareTo, dấu == chỉ dùng cho số và cho null. Bẫy kèm theo: quên rằng substring(a, b) bỏ vị trí b, và gọi substring với b lớn hơn length() thì nổ StringIndexOutOfBoundsException lúc chạy.substring(a, b) lấy a bỏ b, dài b - a. indexOf không thấy thì trả -1. So chuỗi bằng equals, không bao giờ bằng ==.Đọc xong rồi — làm thử ngay
Bài tập của chương Unit 1 — Using Objects and Methods gồm 14 câu trắc nghiệm và 8 đề tự luận. Đáp án hiện ngay khi chọn, miễn phí.