聊聊java的容器類

java的容器類庫可以說是我們平時平時編程時使用最頻繁的類庫了月帝。下面介紹下這個使用最頻繁的兄弟伙:

java容器的分類圖

(http://www.cnblogs.com/wishyouhappy/p/3669198.html)

Paste_Image.png

圖一 java容器簡化圖
圖的解釋:點線框表示接口瑰艘,實線框表示普通的(具體的)類。帶有空心箭頭的點線表示一個特定的類實現(xiàn)了一個接口盹牧,實心箭頭表示某個類可以生成箭頭所指向類的對象

Paste_Image.png

圖二 java容器詳細(xì)圖

1)Collection:一個獨立元素的序列熄守,這些元素都服從一條或多條規(guī)則。(注:Collection其實就是將一組數(shù)據(jù)對象按照一維線性的方式組織起來)List必須按照插入的順序保存元素灌曙,而set不能有重復(fù)元素菊碟。Queue按照排隊規(guī)則來確定對象產(chǎn)生的順序(通常與它們被插入的順序相同)。
2)Map:一組成對的“鍵值對”對象在刺,允許你使用鍵來查找值逆害。(注:Map其實是將鍵與值形成的二元組按照一維線性的方式組織起來头镊,這里值得注意的是值可以使一個Collection或者M(jìn)ap,即嵌套結(jié)構(gòu)魄幕,如:Map<Integer,List<String>>,Map<String,Map<String>>)從另一個角度來考慮Map相艇,其實Map相當(dāng)于ArrayList或者更簡單的數(shù)組的一種擴(kuò)展、推廣纯陨。在數(shù)組中我們可以利用下標(biāo)即數(shù)字訪問數(shù)組當(dāng)中的不同元素坛芽,那么數(shù)字與對象之間形成了一種關(guān)聯(lián),那么如果將這個數(shù)字的概念擴(kuò)展成為對象翼抠,那同樣的我們可以將對象與對象之間關(guān)聯(lián)起來咙轩。即Map,也稱為映射表机久、關(guān)聯(lián)數(shù)組臭墨、字典允許我們使用一個對象來查找某個對象。

容器類的接口和抽象容器類

容器接口是容器的基礎(chǔ)膘盖。

使用接口可以將容器的實現(xiàn)與容器接口分開胧弛,因而可以使用相同的方法訪問容器而不需關(guān)心容器具體的數(shù)據(jù)結(jié)構(gòu)。同理侠畔,Iterator接口也使用戶能夠使用相同的方法訪問不同的容器類结缚。

常見的容器接口

  • collection接口
        * boolean add(Object obj): 添加對象,集合發(fā)生變化則返回true
        * Iterator iterator():返回Iterator接口的對象
        * int size()    
    * boolean isEmpty()
        * boolean contains(Object obj)
        * void clear()
        * <T> T[] toArray(T[] a)
  • Map接口(Map中的值也可以是一個容器)
    * Object get(Object key)
        * Object put(Object key, Object value)
        * Set keySet() : returns the keys set Set<K> keySet()
        * Set entrySet(): returns mappings set Set<Map.Entry<K,V>> entrySet()
        * containsKey()    * containsValue()
  • Iterator接口
        * Object next()
        * boolean hasNext()
        * void remove()

For each 與迭代器

Iterator软棺,即迭代器红竭。
主要用于遍歷容器

public static void main(String[] args){
Collection<String> cs = new LinkedList<String>();
Collection.addAll(cs,"take the long way home".split(" "));
for(String s:cs){
system.out.println(s);
}
}

之所以能夠使用foreach遍歷容器,是因為容器實現(xiàn)了iterator接口喘落。
只要實現(xiàn)了iterator接口就可以使用foreach遍歷茵宪,所以我們也可以實現(xiàn)自己的實現(xiàn)類。
exp:

public class IterableClass implements Iterable<String>{
protected String[] words = ("And that is how " +
"we know the Earch to be banana-shaped.").split(" ");
public Iterator<String> iterator(){
return new Iterator<String>(){
private int index = 0;
public boolean hasNext(){
return index < words.length;
}
public String next(){
return words[index++];
}
public void remove(){
throw new UnsupportedOperationException();
}
}

}
}

適配Collection的迭代器接口

針對我們自己創(chuàng)建的類我們可以通過實現(xiàn)Iterable接口來完成我們自己需要的遍歷操作瘦棋。然而如果我們利用foreach操作遍歷Java類庫中提供的Collection時稀火,就會限制我們的遍歷操作,因為如Java在ArrayList中只提供了從前往后的順序遍歷迭代器赌朋,假設(shè)我想要逆序遍歷

import java.util.*;
class ReversibleArrayList<T> extends ArrayList<T> {
public ReversibleArrayList(Collection<T> c) { super(c); }
public Iterable<T> reversed() {
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
int current = size() - 1;
public boolean hasNext() { return current > -1; }
public T next() { return get(current--); }
public void remove() { // Not implemented
throw new UnsupportedOperationException();
}
};
}
};
}
}
public class AdapterMethodIdiom {
public static void main(String[] args) {
ReversibleArrayList<String> ral =
new ReversibleArrayList<String>(
Arrays.asList("To be or not to be".split(" ")));
// Grabs the ordinary iterator via iterator():
for(String s : ral)
System.out.print(s + " ");
System.out.println();
// Hand it the Iterable of your choice
for(String s : ral.reversed())

        System.out.print(s + " "); 
} 

} /* Output:
To be or not to be
be to not or be To

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凰狞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沛慢,更是在濱河造成了極大的恐慌赡若,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件团甲,死亡現(xiàn)場離奇詭異逾冬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伐庭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門粉渠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來分冈,“玉大人,你說我怎么就攤上這事霸株〉癯粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵去件,是天一觀的道長坡椒。 經(jīng)常有香客問我,道長尤溜,這世上最難降的妖魔是什么倔叼? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮宫莱,結(jié)果婚禮上丈攒,老公的妹妹穿的比我還像新娘。我一直安慰自己授霸,他們只是感情好巡验,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碘耳,像睡著了一般显设。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辛辨,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天捕捂,我揣著相機(jī)與錄音,去河邊找鬼斗搞。 笑死指攒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的僻焚。 我是一名探鬼主播幽七,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溅呢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猿挚,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤咐旧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绩蜻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铣墨,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年办绝,在試婚紗的時候發(fā)現(xiàn)自己被綠了伊约。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姚淆。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屡律,靈堂內(nèi)的尸體忽然破棺而出腌逢,到底是詐尸還是另有隱情,我是刑警寧澤超埋,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布搏讶,位于F島的核電站,受9級特大地震影響霍殴,放射性物質(zhì)發(fā)生泄漏媒惕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一来庭、第九天 我趴在偏房一處隱蔽的房頂上張望妒蔚。 院中可真熱鬧,春花似錦月弛、人聲如沸肴盏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叁鉴。三九已至,卻和暖如春佛寿,著一層夾襖步出監(jiān)牢的瞬間幌墓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工冀泻, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留常侣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓弹渔,卻偏偏與公主長得像胳施,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肢专,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法舞肆,類相關(guān)的語法,內(nèi)部類的語法博杖,繼承相關(guān)的語法椿胯,異常的語法,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法剃根,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法哩盲,并非Fa...
    孫小磊閱讀 1,982評論 0 3
  • 本篇文章帶你從Java源碼深入解析關(guān)于Java容器的概念。 參考文獻(xiàn): Java容器相關(guān)知識全面總結(jié) Java官方...
    Tsy遠(yuǎn)閱讀 19,785評論 13 142
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 875評論 0 1
  • 中國人說話做事一般留有余地抒线,所以才會有"三十年河?xùn)|班巩,三十年河西"的不斷循環(huán),今天褒明天也許就貶了十兢,過幾天或許又重...
    無用堂主閱讀 642評論 1 4