Comparable和Comparetor
-
Comparable
一個(gè)實(shí)現(xiàn)了Comparable接口的對(duì)象的實(shí)例可以被用于相同對(duì)象的不同實(shí)例階段渡讼。
![
-
Comparator
一個(gè)實(shí)現(xiàn)了Comparator接口的對(duì)象能夠?qū)Ρ炔煌瑢?duì)象喂走。
降序排序
升序排序
![XYS$$%8N]](EY`076%DM%9B.png](http://upload-images.jianshu.io/upload_images/2457754-ed021dccdd92d001.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Set接口
- Set不保存重復(fù)的元素坡贺。Set中最常被使用的是測(cè)試歸屬性,可以很容易的詢問(wèn)某個(gè)對(duì)象是否在某個(gè)Set中。Set具有與Collection完全一樣的接口,因此沒(méi)有任何額外的功能。實(shí)際上Set就是Collection馋评,只是行為不同。
實(shí)現(xiàn)了Set接口的主要有HashSet刺啦、TreeSet留特、LinkedHashSet這幾個(gè)共同點(diǎn)就是每個(gè)相同的項(xiàng)只保存一份。他們也有不同點(diǎn):
1.HashSet
HashSet使用的是相當(dāng)復(fù)雜的方式來(lái)存儲(chǔ)元素的,使用HashSet能夠最快的獲取集合中的元素蜕青,效率非常高(以空間換時(shí)間)苟蹈。會(huì)根據(jù)hashcode和equals來(lái)判斷是否是同一個(gè)對(duì)象,如果hashcode一樣右核,并且equals返回true慧脱,則是同一個(gè)對(duì)象,不能重復(fù)存放贺喝。用hashCode()和equals()方法來(lái)區(qū)分同一對(duì)象后菱鸥,就不能存放同一對(duì)象了。如果注釋這兩個(gè)方法躏鱼,則所有對(duì)象視為不同對(duì)象氮采,都可以存放。
HashSet的特點(diǎn):
(1)不能保證元素的排列順序染苛,順序有可能發(fā)生變化
(2)不是同步的
(3) 集合元素可以是null,但只能放入一個(gè)null
2.TreeSet
TreeSet也不能存放重復(fù)對(duì)象鹊漠,但是TreeSet會(huì)自動(dòng)排序,如果存放的對(duì)象不能排序則會(huì)報(bào)錯(cuò)茶行,所以存放的對(duì)象必須指定排序規(guī)則躯概。排序規(guī)則包括自然排序和客戶排序。
自然排序:TreeSet要添加哪個(gè)對(duì)象就在哪個(gè)對(duì)象類上面實(shí)現(xiàn)java.lang.Comparable接口畔师,并且重寫comparaTo()方法楞陷,返回0則表示是同一個(gè)對(duì)象,否則為不同對(duì)象茉唉。
客戶排序:建立一個(gè)第三方類并實(shí)現(xiàn)java.util.Comparator接口。并重寫方法结执。定義集合形式為TreeSet ts = new TreeSet(new 第三方類());
3.LinkedHashSet
LinkedHashSet按照插入順序保存對(duì)象度陆,同時(shí)還保存了HashSet的查詢速度。LinkedHashSet集合是根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置献幔,但是它同時(shí)使用鏈表維護(hù)元素的次序懂傀。這樣使得元素看起 來(lái)像是以插入順序保存的,也就是說(shuō)蜡感,當(dāng)遍歷該集合時(shí)候蹬蚁,LinkedHashSet將會(huì)以元素的添加順序訪問(wèn)集合的元素。
LinkedHashSet在迭代訪問(wèn)Set中的全部元素時(shí)郑兴,性能比HashSet好犀斋,但是插入時(shí)性能稍微遜色于HashSet。