List接口
概述
java.util.List
接口繼承自Collection
接口,是單列集合的一個重要分支,習慣性地會將實現了List
接口的對象稱爲List集合。在List集合中允許出現重複的元素,所有的元素是以一種線性方式進行存儲的,在程序中可以通過索引來訪問集合中的指定元素。另外,List集合還有一個特點就是元素有序,即元素的存入順序和取出順序一致。
特點
- 它是一個元素存取有序的集合。元素的存入順序和取出順序一致。
- 它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數組的索引是一個道理)。
- 集合中可以有重複的元素,通過元素的equals方法,來比較是否爲重複的元素。
List接口的子類java.util.ArrayList類,該類中的方法都是來自List中定義。
常用方法
List作爲Collection集合的子接口,不但繼承了Collection接口中的全部方法,而且還增加了一些根據元素索引來操作集合的特有方法,如下:
public void add(int index, E element)
: 將指定的元素,添加到該集合中的指定位置上。public E get(int index)
:返回集合中指定位置的元素。public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。public E set(int index, E element)
:用指定元素替換集合中指定位置的元素,返回值的更新前的元素。
注意
List集合所有的方法都是跟索引相關,操作索引的時候,一定要防止索引越界異常
IndexOutOfBoundsException
:索引越界異常,集合會報ArrayIndexOutOfBoundsException
:數組索引越界異常StringIndexOutOfBoundsException
:字符串索引越界異常
代碼:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo01List {
public static void main(String[] args) {
// 創建一個List集合對象,多態
List<String> list = new ArrayList<>();
// 使用add方法往集合添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("a");
list.add("d");
// 打印集合
//System.out.println(list); // [a, b, c, a, d] 重寫了toString方法
// 添加
list.add(3,"itheima");
//System.out.println(list); //[a, b, c, itheima, a, d]
// 獲取
String r = list.get(10); // IndexOutOfBoundsException: 數組索引越界異常
// 移除
String removeE = list.remove(2);
System.out.println("被移除的元素:" + removeE); // 被移除的元素:c
//System.out.println(list); // [a, b, itheima, a, d]
// 替換
String setE = list.set(4, "A");
System.out.println("被替換的元素:" + setE); // 被替換的元素:d
//System.out.println(list); // [a, b, itheima, a, A]
}
}
結果:
被移除的元素:c
被替換的元素:d
遍歷的三種方式
- for循環
- 迭代器
- 增強for循環(迭代器簡化版)
代碼:
// 1. for循環
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.print(s +"\t");
}
System.out.println("\n" + "======================");
// 2. 迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.print(s +"\t");
}
System.out.println("\n" + "======================");
// 3. 增強for循環(迭代器簡化版)
for(String s :list) {
System.out.print(s +"\t");
}
結果:
a b itheima a A
======================
a b itheima a A
======================
a b itheima a A
======================
List實現類
ArrayList集合
java.util.ArrayList
集合數據存儲的底層結構是數組結構。元素增刪慢,查找快,由於日常開發中使用最多的功能爲查詢數據、遍歷數據,所以ArrayList
是最常用的集合。
注意:此實現不是同步的,多線程,速度快
LinkedList集合
java.util.LinkedList
集合數據存儲的結構是鏈表結構。它是一個雙向鏈表,方便元素添加、刪除的集合。找到頭和尾非常方便,裏邊有大量的操作首尾元素的方法。
注意:此實現不是同步的,多線程,速度快
LinkedList集合也可以作爲堆棧,隊列的結構使用。實際開發中對一個集合元素的添加與刪除經常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。這些方法我們作爲了解即可:
-
public void addFirst(E e)
:將指定元素插入此列表的開頭。 -
public void addLast(E e)
:將指定元素添加到此列表的結尾。 -
public void push(E e)
:將元素推入此列表所表示的堆棧。 -
public E getFirst()
:返回此列表的第一個元素。 -
public E getLast()
:返回此列表的最後一個元素。 -
public E removeFirst()
:移除並返回此列表的第一個元素。 -
public E removeLast()
:移除並返回此列表的最後一個元素。 -
public E pop()
:從此列表所表示的堆棧處彈出一個元素。 -
public boolean isEmpty()
:如果列表不包含元素,則返回true。
LinkedList集合的特點
java.util.LinkedList集合 implements List接口
-
底層是一個鏈表結構:查詢慢,增刪快
-
裏邊包含了大量操作首尾元素的方法
-
若想使用LinkedList集合特有的方法,不能用多態
方法演示:
import java.util.LinkedList;
public class Demo02LinkedList {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>();
//添加元素
link.addFirst("abc1");
link.push("sss"); // 作用相同
link.addLast("abc2");
System.out.println(link); // [sss, abc1, abc2]
// 獲取元素
System.out.println(link.getFirst()); // sss
System.out.println(link.getLast()); // abc2
// 刪除元素
System.out.println(link.removeFirst()); // sss
System.out.println(link.removeLast()); // abc2
while (!link.isEmpty()) { //判斷集合是否爲空
System.out.println(link.pop()); //彈出集合中的棧頂元素
}
System.out.println(link); // abc1
link.clear();
System.out.println(link); // []
// 清空集合中的元素 在獲取集合中的元素會拋出NoSuchElementException
}
}
結果:
[sss, abc1, abc2]
sss
abc2
sss
abc2
abc1
[]
[]
Vector集合
- 底層:數組
- 同步:單線程,速度慢。ArrayList逐漸取代了它
方法
添加
將指定的組件添加到此向量的末尾,將其大小增加1
void addElenent(E obj)
遍歷
測試此枚舉是否含有更多元素
boolean hasMoreElements()
若有下一個可提供元素,則返回true
E nextElement()
JDK1.2後,可以使用List接口遍歷的方法了