Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 11 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
11
Dung lượng
187 KB
Nội dung
Giáo trình Java tóm tắt Strings Strings Strings 1 1. Giới thiệu 1 2. Lớp String 1 3. Lớp StringBuffer và StringBuilder 8 4. StringBuffer hay String 10 1. Giới thiệu Trong Java, việc xử lý chuỗi trở nên rất nhẹ nhàng do các công việc liên quan đều đã được cài đặt sẵn trong JDK, thông qua các lớp String, StringBuffer và StringBuilder. String: là lớp đơn giản nhất, có đặc tính là không thể thay đổi nên tiết kiệm bộ nhớ, xử lý nhanh và có thể dùng chung ở nhiều nơi khác nhau. StringBuffer: cũng có chức năng biểu diễn dữ liệu dạng chuỗi như String nhưng có thể thay đổi các ký tự trong đó. Thêm vào đó lớp này còn có tính năng đồng bộ hóa nên có thể được dùng trong môi trường đa tiểu trình. Tuy nhiên, do có nhiều tính năng mạnh nên StringBuffer cồng kềnh và chậm chạp hơn String. StringBuilder: có chức năng tương tự như StringBuffer, nhưng không có tính năng đồng bộ hóa nên thích hợp cho môi trường đơn tiểu trình. Mỗi lớp đều có điểm mạnh và điểm yếu riêng, nên tùy trường hợp mà ta chọn lớp phù hợp: nếu chỉ cần lưu chuỗi mà ít xử lý thì chọn String, cần thay đổi chuỗi nhiều thì dùng StringBuilder, nếu dùng trong môi trường đa tiểu trình thì dùng StringBuffer. 2. Lớp String 2.1. Giới thiệu Trong Java lớp String (package java.lang) được dùng để biểu diễn các chuỗi ký tự. Tất cả các dạng literal như "hello", "abc", đều là những đối tượng thuộc lớp String. Các đối tượng String đều là hằng, có nghĩa là ta không thể thay đổi giá trị của chúng sau khi chúng được tạo ra, do đó ta có thể dùng một String ở nhiều nơi khác nhau Để "thay đổi" một String , ta chỉ có cách tạo ra String mới dựa vào String gốc, rồi dùng String mới này thay cho String cũ . Điều này sẽ dẫn tới việc phát sinh ra nhiều "rác" và tốn nhiều thời gian xử lý nếu ta thường xuyên "thay đổi" các String. String là một final class nên ta không thể tạo ra các lớp con từ nó. public final class String extends Object implements Serializable, Comparable<String>, CharSequence Châu Hải Duy 1/11 Giáo trình Java tóm tắt Strings 2.2. Tạo ra một String Để tạo ra một đối tượng String, có nhiều cách: 2.2.1. Dùng string literal Đối tượng String chứa literal sẽ được tạo ra trong constant pool. Ví dụ: String s="abc"; Khi đó, nếu ta tạo ra một chuỗi s2 mới: String s2="abc"; thì s2 sẽ quản lý cùng một chuỗi "abc" như s, (chỉ có handle mới là s2, không có đối tượng String mới nào được tạo ra), do đó phép so sánh (s==s2) sẽ trả về true. Lưu ý: String litertal cũng là các đối tượng, nên ta có thể gọi các phương thức từ chúng. System.out.println("Hello Strings".length()); // 13 2.2.2. Dùng constructor Đối tượng String này sẽ nằm trong heap. Constructor Ý nghĩa String() Tạo ra một chuỗi rỗng. Lưu ý: chuỗi rỗng khác với chuỗi null. String(byte[] data) Tạo ra chuỗi từ mảng byte, giải mã theo bộ ký tự hiện hành của hệ thống. String(byte[] data, int offset, int length) Tạo ra chuỗi từ một phần của mảng byte, bắt đầu từ byte thứ offset trong mảng, dùng tất cả length byte, giải mã theo bộ ký tự hiện hành của hệ thống. String(char[] data) Tạo ra chuỗi từ mảng ký tự. String(char[] data, int offset, int count) Tạo ra chuỗi từ một phần của mảng ký tự, bắt đầu từ ký tự thứ offset trong mảng, độ dài tổng cộng là length. String(String original) Tạo ra String từ một đối tượng String khác String(StringBuffer buf) Tạo ra String từ một StringBuffer bằng cách sao chép mảng ký tự của StringBuffer. Bảng 1: Một số constructor của String Ví dụ: char data[]={'a','b','c'}; String s=new String(data); Châu Hải Duy 2/11 Giáo trình Java tóm tắt Strings String s2=new String("Hello"); Khi đó, nếu ta tạo ra một chuỗi s3 mới: String s3=new String("Hello"); thì phép so sánh s2 == s3 sẽ trả về false. Muốn so sánh dữ liệu của chúng, ta phải dùng phương thức equals(). 2.3. Kết nối các String Trong Java, ta có thể ghép nối tiếp các String một cách dễ dàng bằng toán tử "+". String s1="Hello"; String s2="Java"; String s3=s1+s2; // s3 sẽ là "HelloJava" Thêm vào đó, ta cũng có thể ghép nối một đối tượng bất kỳ vào String cũng bằng toán tử + này. Khi đó, đối tượng sẽ được tự biến thành chuỗi bằng phương thức toString(), sau đó chuỗi kết quả mới được ghép vào như trường hợp ghép hai chuỗi. int i=100; String s="Hello"+i; // s sẽ là "Hello100" Cộng hai biến int vào chuỗi: int i=100; int j=200; String s="Hello"+i+j; // s sẽ là "Hello100200" Cộng hai biến int vào chuỗi, dùng dấu ngoặc để tính tổng các số nguyên trước: int i=100; int j=200; String s="Hello"+(i+j); // s sẽ là "Hello300" Ngoài cách dùng toán tử +, ta cũng có thể dùng phương thức concat(). String s1="Hello"; String s2="Java"; String s3=s1.concat(s2); // s3 sẽ là "HelloJava" Lưu ý: Nếu đối số của phương thức concat() là chuỗi rỗng (length = 0), kết quả trả về chính là chuỗi gọi phương thức (this). String s1="abc"; String s2=""; String s3=s1.concat(s2);// s3 sẽ là "abc" if (s3==s1) // true, vì s3 và s1 cùng quản lý một đối tượng System.out.println("Bang nhau"); Nếu đối số của phương thức concat() là chuỗi khác rỗng, một String mới (là "tổng" của this và đối số) sẽ được tạo ra. Châu Hải Duy 3/11 Giáo trình Java tóm tắt Strings Xét phép nối chuỗi sau: String s="Java"; s+="String"; // s sẽ là "JavaString" phép nối chuỗi này thoạt nhìn thì giống như là thêm đọan "String" vào chuỗi "Java", nhưng thực ra không phải như vậy. Trong Java, String là đối tượng không thể thay đổi nên không thể nối thêm một phần vào chuỗi "Java" được. Bản chất của lệnh đó là tạo ra một chuỗi mới có giá trị "JavaString" , sau đó cho handle s quản lý chuỗi mới đó , chuỗi "String" cũ không hề thay đổi và sẽ tồn tại nếu vẫn còn handle nào đó quản lý nó. 2.4. Trích ký tự từ String Ta có thể lấy ra từng ký tự, mảng ký tự hoặc mảng byte từ dãy ký tự của String bằng các phương thức sau: Phương thức Ý nghĩa char charAt(int index) Trả về ký tự ở vị trí index trong chuỗi. int codePointAt(int index) Trả về mã Unicode của ký tự ở vị trí index. byte[] getBytes() Trích toàn chuỗi ra một mảng byte, dùng bảng mã mặc định của hệ thống. void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) Trích một phần của chuỗi ra một mảng ký tự, từ ký tự ở vị trí srcBegin tới ký tự ở vị trí srcEnd, lưu vào mảng kể từ phần tử thứ dstBegin. char[] toCharArray() Trích toàn chuỗi ra một mảng ký tự. Bảng 2: Một số phương thức trích ký tự từ String Ví dụ: Trích ra từng ký tự: String s="Hello Java"; System.out.print("Chuoi dao nguoc cua "+s+" la: "); for(int i=s.length()-1;i>=0;i ) System.out.print(s.charAt(i)); System.out.println(); kết quả: Chuoi dao nguoc cua Hello Java la: avaJ olleH Press any key to continue Trích ra mảng ký tự: String s="String"; char[]chars=s.toCharArray(); for(int i=0;i<chars.length;i++) System.out.println("Ky tu thu "+i+" la: "+chars[i]); kết quả: Ky tu thu 0 la: S Châu Hải Duy 4/11 Giáo trình Java tóm tắt Strings Ky tu thu 1 la: t Ky tu thu 2 la: r Ky tu thu 3 la: i Ky tu thu 4 la: n Ky tu thu 5 la: g Press any key to continue Trích ra mảng byte: String s="ABCabc"; byte[]bytes=s.getBytes(); for(int i=0;i<bytes.length;i++) System.out.println("Byte thu "+i+" la: "+bytes[i]); kết quả: Byte thu 0 la: 65 Byte thu 1 la: 66 Byte thu 2 la: 67 Byte thu 3 la: 97 Byte thu 4 la: 98 Byte thu 5 la: 99 Press any key to continue 2.5. So sánh và tìm kiếm trên String Java cung cấp sẵn các phương thức sau: Phương thức Ý nghĩa int compareTo(String str) So sánh dãy ký tự của str với this theo giá trị của từng ký tự trong bảng mã (VD: 'a'<'b', 'F'<'f', 'Z'<'a', ). Giá trị trả về sẽ là độ chênh lệch về mã giữa hai ký tự khác nhau đầu tiên trong hai dãy, tính từ trái sang phải. Do đó: Trả về 0 nếu hai dãy ký tự giống nhau Trả về < 0 nếu dãy của this nhỏ hơn str Trả về > 0 nếu dãy của this lớn hơn str int compareToIgnoreCase (String str) Tương tự compareTo(String) nhưng không phân biệt chữ HOA với chữ thường ('A' và 'a' là như nhau). boolean contains(CharSequence s) Trả về true nếu trong chuỗi this có xuất hiện dãy ký tự s. boolean equals(Object o) So sánh chuỗi với đối tượng khác. boolean equalsIgnoreCase (String str) So sánh chuỗi với chuỗi khác, không phân biệt HOA thường. Châu Hải Duy 5/11 Giáo trình Java tóm tắt Strings int indexOf(char c) Cho biết vị trí xuất hiện đầu tiên của ký tự c trong chuỗi this. Quy ước: trả về -1 nếu trong this không có c. int indexOf(char c, int from) Cho biết vị trí xuất hiện đầu tiên của ký tự c trong chuỗi this, tính từ vị trí from trở về sau. Quy ước: trả về -1 nếu kể từ vị trí from, trong this không có c. int indexOf(String str) Cho biết vị trí xuất hiện đầu tiên của chuỗi con str trong chuỗi this. Quy ước: trả về -1 nếu trong this không có str. int indexOf(String str, int from) Cho biết vị trí xuất hiện đầu tiên của chuỗi con str trong chuỗi this, tính từ vị trí from trở về sau. Quy ước: trả về -1 nếu kể từ vị trí from, trong this không có str. int lastIndexOf(char c) Cho biết vị trí xuất hiện sau cùng của ký tự c trong chuỗi this. Quy ước: trả về -1 nếu trong this không có c. Các phương thức lastIndexOf(char, int), lastIndexOf(String), lastIndexOf(String, int) cũng tương tự. Bảng 3: Các phương thức so sánh và tìm kiếm trên String Ví dụ: String s="Java Strings"; System.out.println(s.compareTo("Java Object")); // 4 vì 'S'-'O' = 4 System.out.println(s.compareTo("Java Thread")); // -1 vì 'S'-'T' = -1 System.out.println(s.contains("ring")); // true System.out.println(s.contains("good")); // false System.out.println(s.indexOf('a')); // 1 System.out.println(s.indexOf('x')); // -1 System.out.println(s.indexOf('a',2)); // 3 System.out.println(s.indexOf("ring")); // 7 System.out.println(s.indexOf("good")); // -1 System.out.println(s.lastIndexOf('a')); // 3 2.6. Mộ số phương thức khác Java cung cấp các phương thức sau: Phương thức Ý nghĩa Châu Hải Duy 6/11 Giáo trình Java tóm tắt Strings String replace(char old, char new) Trả về chuỗi mới từ chuỗi this, thay tất cả các ký tự old bởi ký tự new. String replace(CharSequence old, CharSequence new) Trả về chuỗi mới từ chuỗi this, thay tất cả các dãy ký tự old bởi dãy ký tự new. String replaceAll(String regex, String new) Trả về chuỗi mới từ chuỗi this, thay tất cả các dãy ký tự thỏa biểu thức chính quy regex old bởi dãy ký tự new. Chi tiết về biểu thức chính quy (regular expression) xin xem thêm trong Java Documents. String replaceFirst(String regex, String new) Tương tự replaceAll nhưng chỉ thay thế dãy ký tự đầu tiên thỏa biểu thức chính quy. String[]split(String regex) Tách chuỗi theo biểu thức chính quy. String toLowerCase() Trả về chuỗi mới, là chuỗi thường của this. String toUpperCase() Trả về chuỗi mới, là chuỗi HOA của this. String trim() Trả về chuỗi mới, là chuỗi giống như this nhưng không có khoảng trắng đầu và cuối. Bảng 4: Một số phương thức khác của String Và còn nhiều phương thức nữa, chi tiết xin xem trong Java API Documents. Ví dụ: String s="Java Strings"; System.out.println(s.replaceAll("a","x")); // Jxvx Strings System.out.println(s.replaceAll("a|i","x")); // Jxvx Strxngs System.out.println(s.toLowerCase()); // "java strings" System.out.println(s.toUpperCase()); // "JAVA STRINGS" System.out.println(" Spaces ".trim()); // "spaces" "boo:and:foo".split(":")); // {"boo", "and", "foo"} "boo:and:foo".split("o"); // {"b", "", ":and:f"} "boo:and:foo".split("f|a"); // {"boo:", "nd:", "oo"} String s="chduy@hcmuns.edu.vn"; s.split("@|\\."); // {"chduy", "hcmuns", "edu", "vn"} Nhắc lại: Châu Hải Duy 7/11 Giáo trình Java tóm tắt Strings Trong tất cả phương thức chuỗi gốc this không bị thay đổi, chuỗi kết quả do phương thức trả về là một chuỗi mới hoàn toàn. 3. Lớp StringBuffer và StringBuilder 3.1. Giới thiệu 3.1.1. Lớp StringBuffer StringBuffer có thể xem như lớp "nâng cấp" của String do StringBuffer có đủ các tính năng của String và có thêm tính năng thay đổi (thêm, xóa, sửa, thay thế, ) các ký tự bên trong nó. Do có tính năng đồng bộ hóa, StringBuffer có thể được dùng chung trong nhiều thread. Tương tự như String, StringBuffer cũng là lớp final. public final class StringBuffer extends Object implements Serializable, CharSequence Bên cạch độ dài (length) là số ký tự đang dùng, StringBuffer có một thông số khác là sức chứa (capacity), đó là số ký tự tối đa nó có thể chứa mà không cần xin thêm bộ nhớ. Do đó, length không thể vượt quá capacity. Nếu ta ghép hoặc chèn vào StringBuffer một chuỗi mới, nếu capatity vẫn đủ chứa phần chuỗi ban đầu và phần chuỗi mới thì StringBuffer không cần xin cấp bộ nhớ nên tốc độ sẽ nhanh hơn. Nếu capatity không đủ thì StringBuffer sẽ tự động xin thêm bộ nhớ. Trong thao tác cộng của String, StringBuffer đóng vai trò "làm việc sau hậu trường". Ví dụ: đoạn code sau String s="X" + 4 + "Y"; sẽ được chuyển thành String s = new StringBuffer().append("X").append(4).append("Y").toString(); 3.1.2. Lớp StringBuilder Nhìn chung lớp này có các phương thức tương tự như StringBuffer, nhưng không có tính năng đồng bộ hóa. Lớp StringBuilder được bổ sung vào JDK 1.5 để giúp cho việc xử lý chuỗi trong môi trường đa tiểu trình được hiệu quả hơn. Đây cũng là lớp final nên không thể tạo lớp con từ nó. public final class StringBuilder extends Object implements Serializable, CharSequence Do hai lớp này khá giống nhau nên trong phần tiếp theo sẽ trình bày StringBuffer làm đại diện. Châu Hải Duy 8/11 Giáo trình Java tóm tắt Strings 3.2. Khởi tạo Constructor Ý nghĩa StringBuffer() Tạo ra một StringBuffer rỗng. StringBuffer(CharSequence seq) Tạo ra một StringBuffer từ một CharSequence. StringBuffer(int cap) Tạo ra một StringBuffer rỗng với sức chứa cap. StringBuffer(String str) Tạo ra một StringBuffer từ một String. Bảng 5: Các constructor của StringBuffer Lưu ý: Không thể tạo StringBuffer và StringBuilder từ string literal mà phải gọi constructor tương ứng. StringBuffer sb="Hello Java"; // Sai StringBuffer sb=new StringBuffer("Hello Java"); // Đúng 3.3. Các phương thức chính Dưới đây là một số phương thức đặc trưng của StringBuffer. Ngoài những phương thức dưới đây, StringBuffer còn có một số phương thức tương tự như String. Phương thức Ý nghĩa StringBuffer append(Object obj) Ghép dạng chuỗi của obj (sau khi gọi toString()) vào cuối this. Ngoài ra còn có các dạng overload với kiểu cơ bản (int, char, float, ), kiểu CharSequence, String và StringBuffer. int capacity() Trả về sức chứa StringBuffer delete(int start, int end) Xóa dãy ký tự từ vị trí start tới vị trí end-1. Nếu start bằng end thì sẽ không có chuyện gì xảy ra. StringBuffer deleteCharAt(int index) Xóa ký tự ở vị trí index. StringBuffer insert(int offset, Object obj) Chèn một đối tượng vào vị trí offset. Ngoài ra còn có các dạng overload với kiểu cơ bản (int, char, float, ), kiểu CharSequence và String. StringBuffer replace(int start, int end, String str) Thay thế dãy ký tự từ vị trí start tới vị trí end-1 bởi chuỗi str. Trước tiên phần ký tự trong khoảng đó sẽ được xóa, sau đó chuỗi str sẽ được chèn vào vị trí start. Nếu start bằng end thì Châu Hải Duy 9/11 Giáo trình Java tóm tắt Strings StringBuffer sẽ không bị xóa còn str vẫn được chèn vào. StringBuffer reverse() Đảo ngược dãy ký tự. StringBuffer setCharAt(int index, char ch) Thay ký tự ở ở vị trí index bởi ký tự ch. String substring(int start, int end) Trả về chuỗi con là dãy ký tự từ vị trí start tới vị trí end. Bảng 6: Một số phương thức của StringBuffer Ví dụ: StringBuffer s=new StringBuffer("Java"); s.append(" StringBuffer"); System.out.println(s); // "Java StringBuffer" StringBuffer s=new StringBuffer("Java StringBuffer"); s.reverse(); System.out.println(s); // "reffuBgnirtS avaJ" StringBuffer s=new StringBuffer("Java Strings"); s.insert(5,"ABCD "); System.out.println(s); // "Java ABCD StringBuffer" StringBuffer s=new StringBuffer("Java StringBuffer"); s.delete(5,11); // Xóa từ 5 tới 10 System.out.println(s); // Java Buffer StringBuffer s=new StringBuffer("Java StringBuffer"); s.replace(5,11,"STRING"); // Xóa từ 5 tới 10, chèn chuỗi mới vào 5 System.out.println(s); // Java STRINGBuffer 4. StringBuffer hay String 4.1. Cách lựa chọn Ta thấy: String thì gọn nhẹ nhưng thiếu chức năng, phải sinh ra đối tượng mới nếu cần "thay đổi" nội dung. Còn StringBuffer thì cồng kềnh nhưng nhiều chức năng và không cần sinh ra đối tượng mới khi xử lý thay đổi nội dung chuỗi. Do đó mỗi lớp có ưu-khuyết điểm riêng và cần cân nhắc khi sử dụng chúng. Nếu trong chương trình chỉ cần lưu trữ chuỗi mà ít khi có thao tác thay đổi giá trị của chuỗi: dùng String sẽ sẽ tăng tốc độ xử lý và tiết kiệm bộ nhớ do String gọn nhẹ hơn StringBuffer. Châu Hải Duy 10/11 [...].. .Giáo trình Java tóm tắt Strings Nếu trong chương trình có nhiều thao tác thay đổi chuỗi: dùng StringBuffer sẽ tăng tốc độ xử lý và tiết kiệm bộ nhớ do không cần sinh ra các đối tượng StringBuffer trung gian để làm việc "đàng... String s=""; for(int i=0;i . Giáo trình Java tóm tắt Strings Strings Strings 1 1. Giới thiệu 1 2. Lớp String 1 3. Lớp StringBuffer và StringBuilder 8 4. StringBuffer hay String 10 1. Giới thiệu Trong Java, việc. sẽ được tạo ra. Châu Hải Duy 3/11 Giáo trình Java tóm tắt Strings Xét phép nối chuỗi sau: String s=" ;Java& quot;; s+="String"; // s sẽ là "JavaString" phép nối chuỗi này. HOA thường. Châu Hải Duy 5/11 Giáo trình Java tóm tắt Strings int indexOf(char c) Cho biết vị trí xuất hiện đầu tiên của ký tự c trong chuỗi this. Quy ước: trả về -1 nếu trong this không có c. int