
ìm hi u Java Collections Frameworkể
Tr l iả ờ Liên hệ
Khung c ng tác c a các s u t p Java (Java Collections Framework) là r ng l n. Có r t nhi u l p và giao di n trong khungộ ủ ư ậ ộ ớ ấ ề ớ ệ
c ng tác. T i đây, chúng ta s trình bày nhi u h n, dù không ph i là t t c v chúng.ộ ạ ẽ ề ơ ả ấ ả ề
Các giao di n và các l p s u t pệ ớ ư ậ
Khung công tác c a các s u t p Java d a trên tri n khai th c hi n c th m t s giao di n đ nh nghĩa các ki u s u t pủ ư ậ ự ể ự ệ ụ ể ộ ố ệ ị ể ư ậ
(collection):
•Giao di n List đ nh nghĩa m t s u t p các ph n t Object có th d n h ng.ệ ị ộ ư ậ ầ ử ể ẫ ướ
•Giao di n Set đ nh nghĩa m t s u t p không có các ph n t trùng l p.ệ ị ộ ư ậ ầ ử ặ
•Giao di n Map đ nh nghĩa m t s u t p các c p khóa - giá tr .ệ ị ộ ư ậ ặ ị
Chúng ta s nói v m t vài tri n khai th c hi n c th trong h ng d n này. Đây không ph i là m t danh sách đ y đ ,ẽ ề ộ ể ự ệ ụ ể ướ ẫ ả ộ ầ ủ
nh ng nhi u kh năng b n th ng xuyên th y nh ng th sau đây trong các d án phát tri n b ng ngôn ng Java:ư ề ả ạ ườ ấ ữ ứ ự ể ằ ữ
Giao di nệ Các tri n khai th c hi nể ự ệ
List ArrayList, Vector
Set HashSet, TreeSet
Map HashMap
T t c các giao di n trong khung c ng tác, tr Map là các giao di n con c a giao di n Collection, trong đó đ nh nghĩa c uấ ả ệ ộ ừ ệ ủ ệ ị ấ
trúc chung nh t c a m t s u t p. M i s u t p g m nhi u ph n t . V i vai trò là trình th c hi n các giao di n con c aấ ủ ộ ư ậ ỗ ư ậ ồ ề ầ ử ớ ự ệ ệ ủ
Collection, t t c ki u s u t p chia s chung (theo tr c giác) m t s hành vi:ấ ả ể ư ậ ẻ ự ộ ố
•Các ph ng th c đ mô t kích th c c a s u t p (nh size() và isEmpty()).ươ ứ ể ả ướ ủ ư ậ ư
•Các ph ng th c đ mô t n i dung c a s u t p (nh contains() và containsAll()).ươ ứ ể ả ộ ủ ư ậ ư
•Các ph ng th c đ h tr thao tác v n i dung c a s u t p (nh add(), remove() và clear()).ươ ứ ể ỗ ợ ề ộ ủ ư ậ ư
•Các ph ng th c đ cho phép b n chuy n đ i m t s u t p thành m t m ng (nh toArray()).ươ ứ ể ạ ể ổ ộ ư ậ ộ ả ư
•M t ph ng th c đ cho phép b n nh n đ c m t trình vòng l p (iterator) trên m ng các ph n t (iterator()).ộ ươ ứ ể ạ ậ ượ ộ ặ ả ầ ử
Chúng ta s nói v m t s ph ng th c trên trong ph n này. Đ ng th i chúng ta s th o lu n trình vòng l p (iterator) là gìẽ ề ộ ố ươ ứ ầ ồ ờ ẽ ả ậ ặ
và cách s d ng nó nh th nào.ử ụ ư ế
L u ý r ng các Map là đ c bi t. Th t s chúng hoàn toàn không là m t s u t p. Tuy nhiên, chúng có hành vi r t gi ng cácư ằ ặ ệ ậ ự ộ ư ậ ấ ố
s u t p, vì v y chúng ta cũng nói v chúng trong ph n này.ư ậ ậ ề ầ
Các tri n khai th c hi n Danh sách (List)ể ự ệ
Các phiên b n cũ h n c a JDK ch a m t l p đ c g i làả ơ ủ ứ ộ ớ ượ ọ Vector. Nó v n còn có trong các phiên b n m i h n, nh ng b nẫ ả ớ ơ ư ạ
ch nên s d ng nó khi b n c n có m t s u t p đ ng b hoá -- đó là, m t trong nh ng y u t là an toàn phân lu ng. (Nóiỉ ử ụ ạ ầ ộ ư ậ ồ ộ ộ ữ ế ố ồ
v phân lu ng đã v t ra ngoài ph m vi c a bài vi t này, chúng ta s th o lu n ng n g n v khái ni m y trong ph nề ồ ượ ạ ủ ế ẽ ả ậ ắ ọ ề ệ ấ ầ
Tóm t t). Trong các tr ng h p khác, b n nên s d ng l pắ ườ ợ ạ ử ụ ớ ArrayList. B n v n có th s d ng Vector, nh ng nó áp đ tạ ẫ ể ử ụ ư ặ
m t s chi phí thêm mà b n th ng không c n.ộ ố ạ ườ ầ
M tộ ArrayList là cái nh tên c a nó g i ý: danh sách các ph n t theo th t . Chúng ta đã th y làm th nào đ t o ra m tư ủ ợ ầ ử ứ ự ấ ế ể ạ ộ
danh sách và làm th nào đ thêm các ph n t vào nó, trong bài h ng d n gi i thi u tr c. Khi chúng ta t o ra m t l pế ể ầ ử ướ ẫ ớ ệ ướ ạ ộ ớ
Wallet l ng trong trong h ng d n này, chúng ta đã tích h p vào đó m tồ ướ ẫ ợ ộ ArrayList đ gi các hoá đ n thanh toán c aể ữ ơ ủ
Adult:
Ph ng th c getMoneyTotal() s d ng m t trình vòng l p (iterator) đ duy t qua danh sách các hoá đ n thanh toán và tínhươ ứ ử ụ ộ ặ ể ệ ơ
t ng giá tr c a chúng. M t Iterator t ng t nh m t Enumeration trong các phiên b n cũ h n c a ngôn ng Java. Khi b nổ ị ủ ộ ươ ự ư ộ ả ơ ủ ữ ạ

nh n đ c m t trình vòng l p trên s u t p (b ng cách g i iterator()), trình vòng l p cho phép b n duy t qua (traverse) toànậ ượ ộ ặ ư ậ ằ ọ ặ ạ ệ
b s u t p b ng cách s d ng m t s ph ng th c quan tr ng, đ c minh h a trong mã l nh trên:ộ ư ậ ằ ử ụ ộ ố ươ ứ ọ ượ ọ ệ ở
hasNext() cho b n bi t còn có m t ph n t ti p theo khác trong s u t p không.ạ ế ộ ầ ử ế ư ậ
next() cho b n ph n t ti p theo đó.ạ ầ ử ế
Nh chúng ta đã th o lu n trên, b n ph i ép ki u đúng khi b n trích ra các ph n t t s u t p khi s d ng next().ư ả ậ ở ạ ả ể ạ ầ ử ừ ư ậ ử ụ
Tuy nhiên, Iterator còn cho chúng ta m t s kh năng b sung thêm. Chúng ta có th lo i b các ph n t kh i l p ArrayListộ ố ả ổ ể ạ ỏ ầ ử ỏ ớ
b ng cách g i remove() (hay removeAll(), hay clear()), nh ng chúng ta cũng có th s d ng Iterator đ làm đi u đó. Hãyằ ọ ư ể ử ụ ể ề
thêm m t ph ng th c r t đ n gi n đ c g i là spendMoney() t i Adult:ộ ươ ứ ấ ơ ả ượ ọ ớ
Ph ng th c này g i removeBill() trên Wallet:ươ ứ ọ
Chúng ta nh n đ c m t Iterator trên các hoá đ n thanh toán ArrayList, và duy t qua danh sách đ tìm m t k t qu kh pậ ượ ộ ơ ệ ể ộ ế ả ớ
v i giá tr hóa đ n đ c chuy n qua (aBill). N u chúng ta tìm th y m t k t qu kh p, chúng ta g i remove() trên trìnhớ ị ơ ượ ể ế ấ ộ ế ả ớ ọ
vòng l p đ lo i b hóa đ n đó. Cũng đ n gi n, nh ng còn ch a ph i là đ n gi n h t m c. Mã d i đây th c hi n cùngặ ể ạ ỏ ơ ơ ả ư ư ả ơ ả ế ứ ướ ự ệ
m t công vi c và d đ c h n nhi u:ộ ệ ễ ọ ơ ề
Có th b n s không th ng xuyên g i remove() trên m t Iterator nh ng s r t t t n u có công c đó khi b n c n nó.ể ạ ẽ ườ ọ ộ ư ẽ ấ ố ế ụ ạ ầ
Lúc này, chúng ta có th lo i b ch m t hóa đ n riêng l m i l n kh i Wallet. S là t t h n n u s d ng s c m nh c aể ạ ỏ ỉ ộ ơ ẻ ỗ ầ ỏ ẽ ố ơ ế ử ụ ứ ạ ủ
m t List đ giúp chúng ta lo i b nhi u hóa đ n cùng m t lúc, nh sau:ộ ể ạ ỏ ề ơ ộ ư
Chúng ta c n ph i thêm removeBills() vào wallet c a chúng ta đ th c hi n vi c này. Hãy th mã d i đây:ầ ả ủ ể ự ệ ệ ử ướ
Đây là vi c tri n khai th c hi n d dàng nh t mà chúng ta có th s d ng. Chúng ta g i removeAll() trên List các hoá đ nệ ể ự ệ ễ ấ ể ử ụ ọ ơ
c a chúng ta, chuy n qua m t Collection. Sau đó ph ng th c này lo i b t t c các ph n t kh i danh sách có trongủ ể ộ ươ ứ ạ ỏ ấ ả ầ ử ỏ
Collection. Hãy th ch y mã d i đây:ử ạ ướ
Các k t qu không ph i là nh ng gì mà chúng ta mu n. Chúng ta đã k t thúc mà không còn hóa đ n nào trong ví c . T iế ả ả ữ ố ế ơ ả ạ
sao? B i vì removeAll() lo i b t t c các k t qu kh p. Nói cách khác, b t kỳ và t t c các k t qu kh p v i m t m cở ạ ỏ ấ ả ế ả ớ ấ ấ ả ế ả ớ ớ ộ ụ
trong List mà chúng ta chuy n cho ph ng th c đ u b lo i b . Các hoá đ n thanh toán mà chúng ta đã chuy n cho ph ngể ươ ứ ề ị ạ ỏ ơ ể ươ
th c có ch a 1 và 2. Ví c a chúng ta có ch a hai s 1 và m t s 2. Khi removeAll() tìm ki m k t qu kh p v i ph n t sứ ứ ủ ứ ố ộ ố ế ế ả ớ ớ ầ ử ố
1, nó tìm th y hai k t qu kh p và lo i b chúng c hai. Đó không ph i là nh ng gì mà chúng ta mu n! Chúng ta c n thayấ ế ả ớ ạ ỏ ả ả ữ ố ầ
đ i mã c a chúng ta trong removeBills() đ s a l i đi u này:ổ ủ ể ử ạ ề
Mã này ch lo i b m t k t qu kh p riêng r , ch không ph i là t t c các k t qu kh p. Nh c n th n v i removeAll().ỉ ạ ỏ ộ ế ả ớ ẽ ứ ả ấ ả ế ả ớ ớ ẩ ậ ớ
Tri n khai th c hi n t p h pể ự ệ ậ ợ
Có hai tri n khai th c hi n T p h p (Set) th ng đ c s d ng ph bi n:ể ự ệ ậ ợ ườ ượ ử ụ ổ ế
•HashSet, không đ m b o th t vòng l p.ả ả ứ ự ặ
•TreeSet, b o đ m th t vòng l p.ả ả ứ ự ặ
Các tài li u h ng d n ngôn ng Java g i ý r ng b n s đi đ n ch s d ng tri n khai th c hi n th nh t trong h u h tệ ướ ẫ ữ ợ ằ ạ ẽ ế ỗ ử ụ ể ự ệ ứ ấ ầ ế

các tr ng h p. Nói chung, n u b n c n ph i ch c ch n r ng các ph n t trong Set c a b n x p theo m t th t nh tườ ợ ế ạ ầ ả ắ ắ ằ ầ ử ủ ạ ế ộ ứ ự ấ
đ nh nào đó khi b n duy t qua nó b ng m t trình vòng l p, thì hãy s d ng tri n khai th c hi n th hai. N u không, sị ạ ệ ằ ộ ặ ử ụ ể ự ệ ứ ế ử
d ng cách th nh t. Th t c a các ph n t trong m t TreeSet (có th c hi n giao di n SortedSet) đ c g i là th t tụ ứ ấ ứ ự ủ ầ ử ộ ự ệ ệ ượ ọ ứ ự ự
nhiên (natural ordering); đi u này có nghĩa là, h u h t m i tr ng h p, b n s có kh năng s p x p các ph n t d a trênề ầ ế ọ ườ ợ ạ ẽ ả ắ ế ầ ử ự
phép so sánh equals().
Gi s r ng m i Adult có m t t p h p các bi t hi u. Chúng ta th c s không quan tâm đ n chúng đ c s p đ t th nào,ả ử ằ ỗ ộ ậ ợ ệ ệ ự ự ế ượ ắ ặ ế
nh ng các b n sao s không có ý nghĩa. Chúng ta có th s d ng m t HashSet đ l u gi chúng. Tr c tiên, chúng ta thêmư ả ẽ ể ử ụ ộ ể ư ữ ướ
m t bi n cá th :ộ ế ể
Sau đó chúng ta thêm m t ph ng th c đ thêm bi t hi u vào Set:ộ ươ ứ ể ệ ệ
Bây gi hãy th ch y mã này:ờ ử ạ
B n s th y ch có m t Bobby đ n l xu t hi n trên màn hình.ạ ẽ ấ ỉ ộ ơ ẻ ấ ệ
Các tri n khai th c hi n Mapể ự ệ
Map (Ánh x ) là m t t p h p các c p khóa - giá tr . Nó không th ch a các khóa gi ng h t nhau. M i khóa ph i ánh x t iạ ộ ậ ợ ặ ị ể ứ ố ệ ỗ ả ạ ớ
m t giá tr đ n l , nh ng giá tr đó có th là b t kỳ ki u gì. B n có th nghĩ v m t ánh x nh là List có đ t tên. Hãyộ ị ơ ẻ ư ị ể ấ ể ạ ể ề ộ ạ ư ặ
t ng t ng m t List trong đó m i ph n t có m t tên mà b n có th s d ng đ trích ra ph n t đó tr c ti p. Khóa cóưở ượ ộ ỗ ầ ử ộ ạ ể ử ụ ể ầ ử ự ế
th là b t c cái gì ki u Object, gi ng nh giá tr . M t l n n a, đi u đó có nghĩa là b n không th l u tr các giá tr ki uể ấ ứ ể ố ư ị ộ ầ ữ ề ạ ể ư ữ ị ể
nguyên th y (primitive) tr c ti p vào trong m t Map (b n có ghét các giá tr ki u nguyên th y không đ y ?). Thay vào đó,ủ ự ế ộ ạ ị ể ủ ấ
b n ph i s d ng các l p bao gói ki u nguyên th y đ l u gi các giá tr đó.ạ ả ử ụ ớ ể ủ ể ư ữ ị
M c dù đây là m t chi n l c tài chính m o hi m, chúng ta s cung c p cho m i Adult m t t p h p các th tín d ng đ nặ ộ ế ượ ạ ể ẽ ấ ỗ ộ ậ ợ ẻ ụ ơ
gi n nh t có th ch p nh n đ c. M i th s có m t tên và m t s d (ban đ u là 0). Tr c tiên, chúng ta thêm m t bi nả ấ ể ấ ậ ượ ỗ ẻ ẽ ộ ộ ố ư ầ ướ ộ ế
cá th :ể
Sau đó chung ta thêm m t ph ng th c đ b sung thêm m t th tín d ng (CreditCard)t i Map:ộ ươ ứ ể ổ ộ ẻ ụ ớ
Giao di n c a Map khác v i các giao di n c a các s u t p khác. B n g i put() v i m t khóa và m t giá tr đ thêm m tệ ủ ớ ệ ủ ư ậ ạ ọ ớ ộ ộ ị ể ộ
m c vào ánh x . B n g i get() v i khóa đ trích ra m t giá tr . Chúng ta s làm vi c này trong m t ph ng th c đ hi nụ ạ ạ ọ ớ ể ộ ị ẽ ệ ộ ươ ứ ể ể
th s d c a m t th :ị ố ư ủ ộ ẻ
T t c nh ng gì còn l i là thêm ph ng th c charge() đ cho phép c ng thêm vào s d c a chúng ta:ấ ả ữ ạ ươ ứ ể ộ ố ư ủ
Bây gi hãy th ch y mã d i đây, nó s hi n th cho b n 19.95 trên màn hình.ờ ử ạ ướ ẽ ể ị ạ
M t th tín d ng đi n hình có m t tên, m t s tài kho n, m t h n m c tín d ng và m t s d . M i m c trong m t Mapộ ẻ ụ ể ộ ộ ố ả ộ ạ ứ ụ ộ ố ư ỗ ụ ộ

ch có th có m t khóa và m t giá tr . Các th tín d ng r t đ n gi n c a chúng ta r t phù h p, b i vì chúng ch có m t tênỉ ể ộ ộ ị ẻ ụ ấ ơ ả ủ ấ ợ ở ỉ ộ
và m t s d hi n t i. Chúng ta có th làm cho ph c t p h n b ng cách t o ra m t l p đ c g i là CreditCard, v i cácộ ố ư ệ ạ ể ứ ạ ơ ằ ạ ộ ớ ượ ọ ớ
bi n cá th dành cho t t c các đ c tính c a m t th tín d ng, sau đó l u tr các cá th c a l p này nh các giá tr cho cácế ể ấ ả ặ ủ ộ ẻ ụ ư ữ ể ủ ớ ư ị
m c trong Map c a chúng ta.ụ ủ
Có m t s khía c nh thú v khác v giao di n Map đ trình bày tr c khi chúng ta đi ti p (đây không ph i là m t danh sáchộ ố ạ ị ề ệ ể ướ ế ả ộ
đ y đ ):ầ ủ
Ph ng th cươ ứ Hành vi
containsKey() Tr l i Map có ch a khóa đã cho hay không.ả ờ ứ
containsValue() Tr l i Map có ch a giá tr đã cho hay không.ả ờ ứ ị
keySet() Tr v m t Set t p h p các khóa.ả ề ộ ậ ợ
values() Tr v m t Set t p h p các giá tr .ả ề ộ ậ ợ ị
entrySet() Tr v m t Set t p h p các c p khóa - giá tr , đ c đ nh nghĩa nh là các cá th c a các Map.Entry.ả ề ộ ậ ợ ặ ị ượ ị ư ể ủ
remove() Cho phép b n lo i b giá tr cho m t khóa đã cho.ạ ạ ỏ ị ộ
isEmpty() Tr l i Map có r ng không (r ng có nghĩa là, không ch a khóa nào).ả ờ ỗ ỗ ứ
M t s trong các ph ng th c này, ch ng h n nh isEmpty() ch là đ cho ti n thôi, nh ng m t s là r t quan tr ng. Víộ ố ươ ứ ẳ ạ ư ỉ ể ệ ư ộ ố ấ ọ
d , cách duy nh t đ th c hi n vòng l p qua các ph n t trong m t Map là thông qua m t trong các t p h p có liên quanụ ấ ể ự ệ ặ ầ ử ộ ộ ậ ợ
(t p h p các khóa, các giá tr , ho c các c p khóa-giá tr ).ậ ợ ị ặ ặ ị
L p Collectionsớ
Khi b n đang s d ng khung c ng tác các s u t p Java, b n c n ph i n m đ c nh ng gì có s n trong l p Collections.ạ ử ụ ộ ư ậ ạ ầ ả ắ ượ ữ ẵ ớ
L p này g m có m t kho l u tr các ph ng th c tĩnh đ h tr các thao tác trên s u t p. Chúng tôi s không trình bày t tớ ồ ộ ư ữ ươ ứ ể ỗ ợ ư ậ ẽ ấ
c chúng đây, b i vì b n có th t mình đ c API, nh ng chúng tôi s trình bày hai ph ng th c th ng xuyên xu t hi nả ở ở ạ ể ự ọ ư ẽ ươ ứ ườ ấ ệ
trong mã Java:
•copy()
•sort()
Ph ng th c đ u tiên cho phép b n sao chép các n i dung c a m t s u t p này t i m t s u t p khác, nh sau:ươ ứ ầ ạ ộ ủ ộ ư ậ ớ ộ ư ậ ư
Mã này sao chép t ngu n (source) vào đích (target). Đích ph i có cùng kích th c nh ngu n, vì th b n không th saoừ ồ ả ướ ư ồ ế ạ ể
chép m t List vào m t List r ng.ộ ộ ỗ
Ph ng th c sort() s p x p các ph n t theo th t t nhiên c a chúng. T t c các ph n t ph i tri n khai th c hi n giaoươ ứ ắ ế ầ ử ứ ự ự ủ ấ ả ầ ử ả ể ự ệ
di n Comparable sao cho chúng có th so sánh v i nhau. Các l p có s n gi ng nh String đã th c hi n đi u này. Vì v y,ệ ể ớ ớ ẵ ố ư ự ệ ề ậ
đ i v i m t t p h p các chu i ký t , chúng ta có th s p x p chúng theo th t tăng d n theo ki u biên so n t đi n b ngố ớ ộ ậ ợ ỗ ự ể ắ ế ứ ự ẫ ể ạ ừ ể ằ
mã sau đây:
B n s nh n đ c [four, one, three, two] trên màn hình. Nh ng b n có th s p x p các l p mà b n t o ra nh th nào?ạ ẽ ậ ượ ư ạ ể ắ ế ớ ạ ạ ư ế
Chúng ta có th làm đi u này cho Adult. Tr c tiên, chúng ta làm cho l p Adult có th so sánh l n nhau:ể ề ướ ớ ể ẫ
Sau đó, chúng ta ghi đè compareTo() đ so sánh hai cá th Adult Chúng ta s duy trì vi c so sánh r t đ n gi n đ làm ví d ,ể ể ẽ ệ ấ ơ ả ể ụ

do đó nó làm r t ít vi c:ấ ệ
B t kỳ s nào nh h n 0 có nghĩa là "bé h n", và -1 là giá tr thích h p đ s d ng. T ng t , 1 là thu n ti n đ dành choấ ố ỏ ơ ơ ị ợ ể ử ụ ươ ự ậ ệ ể
"l n h n". Nh b n có th th y, 0 có nghĩa là "b ng nhau". So sánh hai đ i t ng theo cách này rõ ràng là m t quá trìnhớ ơ ư ạ ể ấ ằ ố ượ ộ
th công. B n c n ph i đi qua các bi n cá th và so sánh t ng bi n. Trong tr ng h p này, chúng ta so sánh tên và h vàủ ạ ầ ả ế ể ừ ế ườ ợ ọ
s p x p th c t theo h . Nh ng b n nên bi t, t i sao ví d c a chúng ta l i r t đ n gi n. M i Adult có nhi u h n là chắ ế ự ế ọ ư ạ ế ạ ụ ủ ạ ấ ơ ả ỗ ề ơ ỉ
tên và h . N u chúng ta mu n làm m t phép so sánh sâu h n, chúng ta s ph i so sánh các Wallet c a m i Adult đ xemọ ế ố ộ ơ ẽ ả ủ ỗ ể
xem chúng có b ng nhau không, nghĩa là chúng ta s ph i tri n khai th c hi n compareTo() trên Wallet và ph n còn l i.ằ ẽ ả ể ự ệ ầ ạ
Ngoài ra, đ th t chính xác khi so sánh, b t c khi nào b n ghi đè compareTo(), b n c n ph i ch c ch n là phép so sánh làể ậ ấ ứ ạ ạ ầ ả ắ ắ
t ng thích v i equals(). Chúng ta không tri n khai th c hi n equals(), vì th chúng ta không lo l ng v vi c t ng thíchươ ớ ể ự ệ ế ắ ề ệ ươ
v i nó, nh ng chúng ta có th ph i làm. Trong th c t , tôi đã th y mã có bao g m m t dòng nh sau, tr c khi tr vớ ư ể ả ự ế ấ ồ ộ ư ướ ả ề
EQUAL:
Cách ti p c n khác đ so sánh các đ i t ng là trích thu t toán trong compareTo() vào m t đ i t ng có ki u Trình so sánhế ậ ể ố ượ ậ ộ ố ượ ể
(Comparator), sau đó g i Collections.sort() v i s u t p c n s p x p và Comparator, nh sau:ọ ớ ư ậ ầ ắ ế ư
B n s th y "Al Jones" và "Bob Smith", theo th t đó, trong c a s màn hình c a b n.ạ ẽ ấ ứ ự ử ổ ủ ạ
Có m t s lý do thích đáng đ s d ng cách ti p c n th hai. Các lý do k thu t v t ra ngoài ph m vi c a h ng d nộ ố ể ử ụ ế ậ ứ ỹ ậ ượ ạ ủ ướ ẫ
này. Tuy nhiên, t vi n c nh c a phát tri n h ng đ i t ng, đây có th là m t ý t ng t t khi tách bi t ph n mã so sánhừ ễ ả ủ ể ướ ố ượ ể ộ ưở ố ệ ầ
vào trong đ i t ng khác, h n là cung c p cho m i Adult kh năng t so sánh v i nhau. Tuy nhiên, vì đây th c s là nh ngố ượ ơ ấ ỗ ả ự ớ ự ự ữ
gì mà equals() th c hi n, m c dù k t qu là toán t boolean, có các l p lu n thích h p ng h cho c hai cách ti p c n.ự ệ ặ ế ả ử ậ ậ ợ ủ ộ ả ế ậ
Using collections
Khi nào b n nên s d ng m t ki u s u t p c th ? Đó là m t phán xét c n đ n năng l c c a b n, và chính vì th mà b nạ ử ụ ộ ể ư ậ ụ ể ộ ầ ế ự ủ ạ ế ạ
hy v ng s đ c tr l ng h u hĩ khi là m t l p trình viên.ọ ẽ ượ ả ươ ậ ộ ậ
B t ch p nh ng gì mà nhi u chuyên gia tin t ng, có r t ít các quy t c ch c ch n và nhanh chóng đ xác đ nh c n sấ ấ ữ ề ưở ấ ắ ắ ắ ể ị ầ ử
d ng nh ng l p nào trong m t tình hu ng đã cho nào đó. Theo kinh nghi m cá nhân c a tôi, trong ph n l n các l n khi sụ ữ ớ ộ ố ệ ủ ầ ớ ầ ử
d ng các s u t p, m t ArrayList ho c m t HashMap (hãy nh , m t Map không th t s là m t s u t p) đ u b ch i khăm.ụ ư ậ ộ ặ ộ ớ ộ ậ ự ộ ư ậ ề ị ơ
R t có kh năng, b n cũng t ng có tr i nghi m nh v y. D i đây là m t s quy t c ngón tay cái, m t s là hi n nhiênấ ả ạ ừ ả ệ ư ậ ướ ộ ố ắ ộ ố ể
h n nh ng cái còn l i:ơ ữ ạ
•Khi b n nghĩ r ng mình c n có m t s u t p, hãy b t đ u v i m t List, sau đó c đ cho các mã s báo cho b nạ ằ ầ ộ ư ậ ắ ầ ớ ộ ứ ể ẽ ạ
bi t có c n m t ki u khác không.ế ầ ộ ể
•N u b n ch c n nhóm các th gì đó, hãy s d ng m t Set.ế ạ ỉ ầ ứ ử ụ ộ
•N u th t trong vòng l p là r t quan tr ng khi duy t qua m t s u t p, hãy s d ng Tree... m t h ng v khácế ứ ự ặ ấ ọ ệ ộ ư ậ ử ụ ộ ươ ị
c a s u t p, khi đó có s n.ủ ư ậ ở ẵ
•Tránh s d ng Vector, tr khi b n c n kh năng đ ng b hóa c a nó.ử ụ ừ ạ ầ ả ồ ộ ủ
•Không nên lo l ng v vi c t i u hóa cho đ n khi (và tr khi) hi u năng tr thành m t v n đ .ắ ề ệ ố ư ế ừ ệ ở ộ ấ ề
Các b s u t p là m t trong nh ng khía c nh m nh m nh t c a ngôn ng Java. Đ ng ng i khi s d ng chúng, nh ngộ ư ậ ộ ữ ạ ạ ẽ ấ ủ ữ ừ ạ ử ụ ư
c n c nh giác v các v "Tìm ra r i" (gotchas). Ví d , có m t cách thu n ti n đ chuy n đ i t m t Array thành m tầ ả ề ụ ồ ụ ộ ậ ệ ể ể ổ ừ ộ ộ
ArrayList:
Mã này đ a ra m t UnsupportedOperationException, vì List đ c Arrays.asList() tr v là không thay đ i đ c. B n khôngư ộ ượ ả ề ổ ượ ạ
th thêm m t ph n t m i vào m t List không thay đ i. Hãy đ ý.ể ộ ầ ử ớ ộ ổ ể
Theo IBM Vi t Namệ

