Collection trong JavaMarch 26th, 2010 | Tags: Collection trong Java, Somes collection class in Java 1.2 Các lớp Collection Collection, Set, List, Map, ArrayList, Vector, Hashtable, Has
Trang 1Collection trong Java
March 26th, 2010 | Tags: Collection trong Java, Somes collection class in Java
1.2 Các lớp Collection (Collection, Set, List, Map, ArrayList, Vector, Hashtable, Hashset, HashMap)
Các lớp về collection được đặt trong gói java.util Đây là mối quan hệ giữa các lớp collection Java Collection Implementations Historical
Hash table Resizable Array Balanced Tree LinkedList
Interfaces Collection HashSet ArrayList TreeSet LinkedList
Set HashSet TreeSet
SortedSet TreeSet
List ArrayList LinkedList Vector, Stack
Map HashMap TreeMap HashTable, Properties
SortedMap TreeMap
Chúng ta sẽ đi vào chi tiết từng lớp
Collection là một interface với các phương thức phổ biến nhất để gom nhóm các đối tượng như:
• add thêm phần tử vào mảng
• isEmpty kiểm tra mảng có rỗng không
• remove xóa phần tử khỏi mảng
• size lấy kích thước mảng
• clear xóa tẩt cả các phần tử trong mảng
• toArray trả về mảng các đối tượng
• …
List là một interface dùng chứa danh sách liên tục, nó kế thừa từ Collection interface nên nó có các hàm trong Collection và một số hàm riêng của nó như:
• get lấy phần tử ra khỏi mảng
• indexOf tìm phần tử trong mảng
• set thay thế phần tử trong mảng
• …
ArrayList là một lớp kế thừa từ AbstractList và implement List interface và một vài interface khác
Ví dụ:
ArrayList<String> a = new ArrayList();
a.add(”Kien”);
a.add(0, “Anh”);
for(String s : a) {
System.out.print(s + “\t”); //In ra Anh Kien
}
Set, SortedSet, HashSet, TreeSet cũng là những lớp xử lý liên quan đến collection tuy nhiên chúng khác bên nhóm List là các phần tử trong Set là duy nhất
Trang 2Ví dụ:
Set set = new HashSet();
set.add(”Bernadine”);
set.add(”Elizabeth”);
set.add(”Gene”);
set.add(”Elizabeth”);
set.add(”Clara”);
System.out.println(set);
Chúng ta sẽ nhận được chuỗi in ra là: [Bernadine, Gene, Elizabeth, Clara]
Set, SortedSet là interface còn HashSet và TreeSet là những lớp implement interface Set và kế thừa từ AbstractSet TreeSet là collection được sắp xếp tức là các phần tử khi đưa vào TreeSet sẽ tự động được đưa đúng vị trí theo thứ tự sắp xếp, còn HashSet thì không
Ví dụ:
Set set = new TreeSet();
set.add(”Bernadine”);
set.add(”Elizabeth”);
set.add(”Gene”);
set.add(”Elizabeth”);
set.add(”Clara”);
System.out.println(set);
Ta sẽ nhận được kết quả: [Bernadine, Clara, Elizabeth, Gene]
Map, SortedMap, HashMap, TreeMap là những lớp dùng để xử lý collection theo dạng key-value
Map, SortedMap là interface và nó không kế thừa từ Collection interface như những interface ở trên Còn HashMap và TreeMap là hai lớp implement Map interface và kế thừa từ AbstractMap Ví dụ:
Map<Integer, String> map = new HashMap();
map.put(3, “Kien”);
map.put(1, “Nguyen”);
map.put(2, “Anh”);
System.out.println(map);
Map sortedMap = new TreeMap(map);
System.out.println(sortedMap);
Kết quả in ra màn hình sẽ là: {1=Nguyen, 2=Anh, 3=Kien}
{1=Nguyen, 2=Anh, 3=Kien}
Chúng ta có một vài lớp ra đời trước như như Vector, HashTable
Vector là một lớp tương tự ArrayList về mặt xử lý tuy nhiên chúng có sự khác biệt là Vector thì là đồng bộ (Synchronized) và được dùng nhiều trong ứng dụng đa luồng (multithreading) Chính vì đồng bộ nên sử dụng vector sẽ cho tốc độ chậm hơn một chút so với dùng ArrayList
HashTable là lớp tương tự HashMap về mặt ý nghĩa, và HashTable cũng là đồng bộ và được dùng nhiều trong ứng dụng đa luồng Còn HashMap thì không đồng bộ, tuy nhiên chúng ta có
Trang 3thể thêm chức năng đồng bộ cho HashMap nhưng mặc định thì HashMap không có HashMap ra đời sau nên nó có vẻ hiện đại và được sử dụng nhiều hơn Hashtable
Ví dụ:
Hashtable<Integer, String> map = new Hashtable<Integer, String>();
map.put(3, “Kien”);
map.put(1, “Nguyen”);
map.put(2, “Anh”);
System.out.println(map);
Kết quả in ra sẽ là: {3=Kien, 2=Anh, 1=Nguyen}
1.3 Nhóm lớp về String (String, StringBuffer, StringBuilder)
String là một đối tượng trong java dùng để xử lý chuỗi ký tự Giá trị của đối tượng một khi khởi tạo thì không thể thay đổi Ví dụ:
String str = “Luvina”;
str += “Company”;
System.out.println(str);
Trong ví dụ trên chuỗi LuvinaCompany được in ra màn hình, tuy nhiên đối tượng str không thay đổi mà là có một đối tượng khác được tạo ra có giá trị là chuỗi LuvinaCompany rồi sau đó gán vào đối tượng str
Một số phương thức thông dụng trong lớp String như:
• length lấy chiều dài hiện tại của chuỗi
• substring lấy ra một chuỗi trong chuỗi hiện hành
• compareTo so sánh 2 chuỗi có xét ký tự hoa, thường
• compareToIgnoreCase so sánh 2 chuỗi bỏ qua ký tự hoa thường
ví dụ:
String str = “Luvina”;
System.out.println(”Length: ” + str.length() + ” substring(1,2): ” + str.substring(1, 2));
Ta nhận được kết quả trên màn hình như sau: Length: 6 substring(1,2): u
StringBuffer và StringBuilder cũng là đối tượng trong java để xử lý chuỗi nhưng chúng khác String ở chỗ là giá trị tạo ra của chúng có thể thay đổi được mà không cần phải tạo một đối tượng mới trong bộ nhớ Thực ra khi chúng ta xử lý việc thay đổi giá trị trên String thì bên dưới trình JVM sẽ dùng các đối tượng StringBuffer và StringBuilder để xử lý và tạo ra các đối tượng String mới
Ví dụ:
StringBuffer str = new StringBuffer(”Luvina”);
str.append(”Company”);
System.out.println(str); //In ra LuvinaCompany
Từ đặc điểm trên ta có thể thấy khi xử lý chuỗi mà giá trị sẽ hay thay đổi (cộng chuỗi, cắt chuỗi,
…) thì nên dùng StringBuffer hoặc StringBuilder sẽ cho tốc độ nhanh hơn so với sử dụng String Một số phương thức thông dụng trong StringBuffer và StringBuilder:
• append thêm một chuỗi vào cuối chuỗi đang có
• insert chèn một chuỗi vào chuỗi đang có
• replace thay thế một chuỗi
• delete xóa một chuỗi trong chuỗi hiện hành
• lastIndexOf tìm một chuỗi
Trang 4• reverse đảo ngược một chuỗi
Ví dụ:
StringBuffer str = new StringBuffer(”Luvina”);
System.out.println(”Length: ” + str.length()
+ ” substring(1,2): ” + str.substring(1, 2)
+ ” str.append(\” Company\”): ” + str.append(” Company”)
+ ” str.lastIndexOf(\”n\”): ” + str.lastIndexOf(”n”)
+ ” str.reverse: ” + str.reverse());
Ta thu được kết quả trên màn hình từ đoạn code trên như sau:
Length: 6 substring(1,2): u str.append(” Company”): Luvina Company str.lastIndexOf(”n”): 12 str.reverse: ynapmoC anivuL
1.4 Các lớp tiện ích khác (StringTokenizer, Date, Calendar, SimpleDateFormat, Arrays)
StringTokenizer (java.util.StringTokenizer) là một lớp tiện ích giúp tách các chuỗi (string) được ngăn cách bởi các ký tự
Ví dụ:
String s = “subject:Demo StringTokenizer”;
StringTokenizer st = new StringTokenizer(s, “:”);
while(st.hasMoreTokens()) {
String key = st.nextToken();
String val = st.nextToken();
System.out.println(key + “:” + val);//In subject:Demo StringTokenizer
}
Date (java.util.Date) là một lớp tiện ích xử lý về ngày tháng
Ví dụ:
Date dObject = new Date(2009, 12, 22);
System.out.println(dObject.toString()); //In Sat Jan 22 00:00:00 ICT 3910
System.out.println(dObject.getDate()); //In 22
Calendar là một lớp trừu tượng giúp hỗ trợ trong việc biến đổi thông tin ngày tháng
Ví dụ:
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 0);
Date dObject = cal.getTime();
System.out.println(dObject.toString()); //In Tue Dec 22 17:28:46 ICT 2009
SimpleDateFormat (java.text SimpleDateFormat) là một lớp tiện ích giúp cho việc định dạng và trích thông tin thời gian
Ví dụ:
Date date = new Date();
SimpleDateFormat sdf;
Trang 5sdf = new SimpleDateFormat(”hh:mm:ss”);
System.out.println(sdf.format(date)); //In 05:35:38
sdf = new SimpleDateFormat(”dd MMM yyyy hh:mm:ss zzz”);
System.out.println(sdf.format(date)); //In 22 Dec 2009 05:35:38 ICT
Arrays (java.util.Arrays) là lớp chứa các phương thức static giúp cho việc thay đổi mảng (sắp xếp, tìm kiếm, thay thế) dễ dàng hơn Nó là bổ sung cho lớp Array Một số phương thức trong lớp Arrays như:
• binarySearch tìm kiếm phần tử trong mảng dùng thuật toán tìm kiếm nhị phân
• copyOf sao chép một mảng với chiều dài
• copyOfRange sao chép một mảng với một vùng từ vị trí đầu đến vị trí cuối
• equals so sánh 2 mảng
• sort sắp xếp mảng
• …
Ví dụ:
String[] a = { “Nguyen”, “Anh”, “Kien” };
String[] b = Arrays.copyOf(a, 2);
int indexOfAnh = Arrays.binarySearch(a, “Anh”);
/*sort a array*/
Arrays.sort(a);
System.out.println(indexOfAnh); //In ra 1 because find Anh before sorting a array
System.out.println(Arrays.toString(a)); //In ra [Anh, Kien, Nguyen]
System.out.println(Arrays.toString(b)); //In ra [Nguyen, Anh]
1.5 RegularExpression
Regular Expression hay còn gọi là biểu thức chính quy dùng để chỉ cách thức chúng ta nhận biết, kiểm tra một chuỗi (biểu thức) có đúng như định dạng chúng ta mong muốn hay không
Trong java hiện nay có 2 lớp là Pattern và Matcher (java.util.regex) giúp ta xử lý các vấn đến liên quan đến regular expression
Pattern là lớp dùng để biên dịch biểu thức, kết quả biên dịch để tạo ra đối tượng thuộc lớp Matcher để kiểm tra chuổi ký tự có đúng biểu thức đó
Một vài phương thức của lớp Pattern như:
• compile biên dịch biểu thức trong pattern
• matcher tạo ra đối tượng thuộc lớp Matcher từ pattern
• matches kiểm tra chuỗi có đúng với biểu thức trong pattern
• …
Matcher là lớp được tạo ra từ Pattern và dùng để thực hiện những việc như match, tìm kiếm Một vài phương thức trong lớp Matcher như:
• find tìm kiếm chuỗi mà match với mẫu biểu thức
• matches kiểm tra chuỗi có match với mẫu biểu thức
• …
Một vài pattern đơn giản:
Trang 6• ^ phủ định
• $ kết thúc một pattern
• [abc] ký tự a, b và c
• [^abc] bất kỳ ký tự nào trừ a, b, c
• [a-z0-9] các ký tự a đến z và 0 đến 9
• …
Ví dụ kiểm tra một chuỗi với các ký tự bắt buộc:
Pattern pat = Pattern.compile(”Nguyen.*Kien”);
Matcher matcher = pat.matcher(”Nguyen Anh Kien”);
boolean flag = matcher.matches();
System.out.println(flag); //In ra true
Ví dụ bạn cần kiểm tra điện thoại đúng định dạng XXX-XXXX-XXXX, mỗi khối X có ít nhất 1 ký tự và tối đa 3-4-4 ký tự:
String phone = “59-1111-1112″;
String phoneNumberPattern = “^[0-9]{1,3}-[0-9]{1,4}-[0-9]{1,4}$”;
boolean isMatch = Pattern.matches(phoneNumberPattern, phone);
System.out.println(isMatch); //In ra true
Ví dụ về kiểm tra địa chỉ email
/*Check email format*/
String email = “nakien2a@yahoo.com”;
String emailPattern = “[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-z]{2,7}$”;
boolean isMatch = Pattern.matches(emailPattern, email);
System.out.println(isMatch); //In ra true