Java中的集合(二):List

List是有序且元素可重復集合

ArrayList

ArrayList實現(xiàn)了一個可變大小的數(shù)組,允許包含所有的元素按脚,包括null析桥。
  由于ArrayList實現(xiàn)了List接口,所以ArrayList存儲的元素是有序授段,按照添加元素的先后順序進行排列。當然也可以通過Collections.sort(List<T> list);對ArrayList內(nèi)的元素進行排序番甩,但需要注意該方法的泛型參數(shù)類型應該是Comparable類型侵贵,所以ArrayList中的元素需要實現(xiàn)Comparable接口,并實現(xiàn)其int compareTo(T o)方法
  每一個ArrayList實例都會有一個初始容量Capacity缘薛,默認為10窍育,你可以在構造實例時根據(jù)需要設定改容量的大小,如下:
ArrayList arrayList = new ArrayList<Integer>(20);
在插入大量數(shù)據(jù)時掩宜,為了提升性能蔫骂,可以調(diào)用ArrayList中的ensureCapacity(int minCapacity)方法來增加ArrayList容量,從而提高插入的效率牺汤。
  需要注意的是辽旋,ArrayList是非線程安全的,如果多個線程同時訪問同一個ArrayList實例,并且其中至少有一個線程對ArrayList實例進行了修改补胚,為了保證線程安全码耐,需要在外部實現(xiàn)同步。你也可以這樣創(chuàng)建一個同步的ArrayList實例:
Collections.synchronizedList(new ArrayList<Integer>());
  ArrayList支持快速隨機訪問溶其,訪問某個元素的事件復雜度是O(1).但是插入和刪除元素的操作速度很慢骚腥。

CopyOnWriteArrayList

CopyOnWriteArrayListArrayList一樣,底層仍然是一個可變大小的數(shù)組實現(xiàn)的瓶逃,但CopyOnWriteArrayList的不同卻在于其利用了高并發(fā)往往是讀多寫少的特性束铭,對讀操作不加鎖,對寫操作加鎖厢绝。
  源碼中契沫,對于寫操作add(E e) | set(E e) | remove(int index),在進入方法后昔汉,首先加鎖懈万,然后復制一份新的數(shù)組,對新數(shù)組進行相應操作靶病,然后將新數(shù)組賦給舊的引用会通,然后再解鎖。
  由于CopyOnWriteArrayList在進行寫操作時娄周,對容器的基本數(shù)組進行了復制涕侈,內(nèi)存開銷會比較大,所以不適于存儲大數(shù)據(jù)量昆咽。

LinkedList

LinkedList底層是一個鏈表的實現(xiàn)驾凶,因此在內(nèi)部有許多具有鏈表特色的方法,比如:

public void addFirst(E e)//在表頭插入元素
public void addLast(E e)//在表尾插入元素
public E getFirst()//獲取鏈表的頭(第一個)元素
public E getLast()//獲取鏈表的尾(最后一個)元素
public E pop()
public E push()
...

在這里就不一一介紹了掷酗。
  LinkedList是非線程安全的,這一點同ArrayList是一樣的窟哺,獲取同步的LinkedList泻轰,可以這樣做:
Collections.synchronizedList(new LinkedList<Integer>());
  由于LinkedList是鏈表結構的,所以其插入操作的時間復雜度是常量級的且轨,但是查找浮声、刪除和更新的操作是O(n)。

Vector

VectorArrayList非常相似旋奢,底層也是一個可變長的數(shù)組泳挥,但是Vector是線程安全的,因此單純從性能尚來說至朗,Vector的性能要低于ArrayList屉符,但Vector類中也提供了一些,去盡可能的提升性能,優(yōu)化內(nèi)存存儲

/*
構造方法矗钟,使用制定的初始容量和容量增量實例化對象
*/
public Vector(int initialCapacity, int capacityIncrement)

public int capacity()//返回當前容量

public void  ensureCapacity (int minCapacity)//增加容量

public void trimToSize()//對實例的容量進行微調(diào)唆香,使其等于實例中元素的數(shù)量

Stack

StackVector的子類,所以改類也是線程安全的吨艇。其實現(xiàn)了數(shù)據(jù)結構中棧躬它,具有元素后進先出(LIFO)的規(guī)則。具有通常的push poppeek操作东涡。

遍歷操作

ArrayList<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);

1.foreach遍歷的方式

for(Integer i : list){
    System.out.println(i);
}

2.普通for循環(huán)遍歷的方式

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

注意前兩種方式在循環(huán)內(nèi)部都不能對集合的結構進行修改
  3.iterator遍歷的方式

Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
    System.out.println(iterator.next());
}

4.listIterator遍歷的方式

ListIterator<Integer> listIterator = list.listIterator();
while(listIterator.hasNext()){
    System.out.println(listIterator.next());
}

iterator和listIterator的相同與不同
相同點:1>都可以對List集合進行遍歷冯吓。這兩個方法都是快速失敗的,也就是說除非調(diào)用迭代器內(nèi)部修改集合集合的方法疮跑,否則無論在何處無論在何時修改集合都會產(chǎn)生快速失敗桑谍,迭代器都會拋出ConcurrentModificationException運行時異常。
不同點:2>iterator可以用于多種集合祸挪,set锣披、list、Map都可贿条,而listIterator只能用于list集合
3>兩者包含的方法不同雹仿。比如,ListIterator中有add()方法整以,而Iterator中沒有
4>ListIterator可以實現(xiàn)雙向遍歷胧辽,而Iterator只能單向向后(next())遍歷

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市公黑,隨后出現(xiàn)的幾起案子邑商,更是在濱河造成了極大的恐慌,老刑警劉巖凡蚜,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件人断,死亡現(xiàn)場離奇詭異,居然都是意外死亡朝蜘,警方通過查閱死者的電腦和手機恶迈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谱醇,“玉大人暇仲,你說我怎么就攤上這事「笨剩” “怎么了奈附?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煮剧。 經(jīng)常有香客問我斥滤,道長将鸵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任中跌,我火速辦了婚禮咨堤,結果婚禮上,老公的妹妹穿的比我還像新娘漩符。我一直安慰自己一喘,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布嗜暴。 她就那樣靜靜地躺著凸克,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闷沥。 梳的紋絲不亂的頭發(fā)上萎战,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音舆逃,去河邊找鬼蚂维。 笑死,一個胖子當著我的面吹牛路狮,可吹牛的內(nèi)容都是我干的虫啥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼奄妨,長吁一口氣:“原來是場噩夢啊……” “哼涂籽!你這毒婦竟也來了?” 一聲冷哼從身側響起砸抛,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤评雌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后直焙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體景东,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年箕般,在試婚紗的時候發(fā)現(xiàn)自己被綠了耐薯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡丝里,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出体谒,到底是詐尸還是另有隱情杯聚,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布抒痒,位于F島的核電站幌绍,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜傀广,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一颁独、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伪冰,春花似錦誓酒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吓懈,卻和暖如春歼冰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耻警。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工隔嫡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甘穿。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓腮恩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扒磁。 傳聞我的和親對象是個殘疾皇子庆揪,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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