文章目錄
- List接口及其實作類
-
- 1. List接口介紹
- 2. List接口中常用方法
- 3. List的實作類
-
- 3.1 ArrayList集合☆
- 3.2 LinkedList集合
-
-
- LinkedList常用方法
- ArrayList和LinkedList的異同
-
- 3.2 Vector集合
-
-
- ArrayList和Vector的差別
-
- ☆
List接口及其實作類
1. List接口介紹
接口繼承自
java.util.List
接口,是單列集合的一個重要分支,習慣性地會将實作了
Collection
接口的對象稱為
List
集合。
List
- 在
集合與set集合不同
List
,所有的元素是以一種線性方式進行存儲的,在程式中可以
允許出現重複的元素
。另外,
通過索引來通路集合中的指定元素
即元素的存入順序和取出順序一緻。
List集合還有一個特點就是元素有序,
- JDK API中List接口的實作類常用的有:
、
ArrayList
和
LinkedList
。
Vector
2. 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)
public class ListDemo {
public static void main(String[] args) {
// 建立List集合對象
List<String> list = new ArrayList<String>();
// 往 尾部添加 指定元素
list.add("圖圖");
list.add("小美");
list.add("不高興");
System.out.println(list);
// add(int index,String s) 往指定位置添加
list.add(1,"沒頭腦");
System.out.println(list);
// 删除指定位置元素 傳回被删除元素
System.out.println("删除索引位置為2的元素");
System.out.println(list.remove(2));
System.out.println(list);
// 在指定位置 進行 元素替代(改)
// 修改指定位置元素
list.set(0, "三毛");
System.out.println(list);
// 跟size() 方法一起用來周遊
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
//還可以使用增強for
for (String string : list) {
System.out.println(string);
}
}
}
我們學習Colletion體系的時候, 發現List集合下有很多集合
,它們的存儲結構不同,這樣就導緻了這些集合它們有各自的特點,供我們在不同的環境下使用,那麼常見的資料結構有哪些呢?
3. List的實作類
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn10dFpnTykEVOBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwkTMwQDNyIjMxETMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
3.1 ArrayList集合☆
集合資料存儲的結構是
java.util.ArrayList
,由于日常開發中使用最多的功能為查詢資料、周遊資料,是以
數組結構。元素增删慢,查找快
是最常用的集合。
ArrayList
- 但是
并不能完成任何需求,應結合着具體的應用場景和集合的特點進行使用。
ArrayList
ArrayList 的JDK1.8 之前與之後的實作差別?
直接建立一個初始容量為10的數組。
JDK1.7:ArrayList像餓漢式,
一開始建立一個長度為0的數組,當添加第一個元素時再建立一個始容量為10的數組。
JDK1.8:ArrayList像懶漢式,
/**
* @Date 2020/11/11 18:11
* @Version 10.21
* @Author DuanChaojie
*/
public class Main {
@Test
public void testListRemove() {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
updateList(list);
System.out.println(list);//[1, 2]
}
private static void updateList(List list) {
list.remove(2);
}
}
3.2 LinkedList集合
集合資料存儲的結構是
java.util.LinkedList
連結清單結構。查詢慢、但是友善元素添加、删除的集合。
- 對于 頻繁的插入或删除元素的操作,建議使用LinkedList類,效率較高。
- LinkedList: 雙向連結清單,内部沒有聲明數組,而是定義了Node類型的first和last,用于記錄首末元素。同時,
。Node除了儲存資料,還定義了兩個變量:
定義内部類Node,作為LinkedList中儲存資料的基本結構
記錄前一個元素的位置。
prev變量
記錄下一個元素的位置。
next變量
![]()
4. List接口及其實作類List接口及其實作類☆
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
LinkedList常用方法
實際開發中對一個集合元素的添加與删除經常涉及到首尾操作,而提供了大量首尾操作的方法。這些方法我們作為了解即可:
LinkedList
:将指定元素插入此清單的開頭。
public void addFirst(E e)
:将指定元素添加到此清單的結尾。
public void addLast(E e)
:傳回此清單的第一個元素。
public E getFirst()
:傳回此清單的最後一個元素。
public E getLast()
:移除并傳回此清單的第一個元素。
public E removeFirst()
:移除并傳回此清單的最後一個元素。
public E removeLast()
:從此清單所表示的堆棧處彈出一個元素。
public E pop()
:将元素推入此清單所表示的堆棧。
public void push(E e)
:如果清單不包含元素,則傳回true。
public boolean isEmpty()
是
LinkedList
的子類,
List
中的方法
List
都是可以使用,這裡就不做詳細介紹,我們隻需要了解
LinkedList
的特有方法即可。
LinkedList
在開發時,LinkedList集合也可以作為堆棧,隊列的結構使用。
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>();
//添加元素
link.addFirst("abc1");
link.addFirst("abc2");
link.addFirst("abc3");
System.out.println(link);
// 擷取元素
System.out.println(link.getFirst());
System.out.println(link.getLast());
// 删除元素
System.out.println(link.removeFirst());
System.out.println(link.removeLast());
while (!link.isEmpty()) { //判斷集合是否為空
System.out.println(link.pop()); //彈出集合中的棧頂元素
}
System.out.println(link);
}
}
ArrayList和LinkedList的異同
二者都線程不安全,相對線程安全的Vector,執行效率高。此外,ArrayList是實作了基于動态數組的資料結構,LinkedList基于連結清單的資料結構。對于随機通路get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。對于新增和删除操作add(特指插入)和remove,LinkedList比較占優勢,因為ArrayList要移動資料。
3.2 Vector集合
- Vector 是一個古老的集合,
JDK1.0就有了。大多數操作與ArrayList相同,差別之處在于Vector是線程安全的。
- 在各種List中,最好把ArrayList作為預設選擇,當插入、删除頻繁時,使用LinkedList。
- Vector總是比ArrayList慢,是以盡量避免使用。
- 新增方法:
void addElement(Object obj)
void insertElementAt(Object obj,int index)
void setElementAt(Object obj,int index)
void removeElement(Object obj)
void removeAllElements()
ArrayList和Vector的差別
Vector和ArrayList幾乎是完全相同的,唯一的差別在于Vector是同步類(synchronized),屬于強同步類。是以開銷就比ArrayList要大,通路要慢。 正常情況下,大多數的Java程式員使用ArrayList而不是Vector,因為同步完全可以由程式員自己來控制
。Vector每次擴容請求其大小的2倍空間,而ArrayList是1.5倍。Vector還有一個子類Stack。