Java集合框架🎏🎏🎏🎏🎏🎏🎏🎏🎏
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等
今天我们详讲一下集合类 LinkedList(链表)
LinkedList 链表✨🎏🎊
1.1 链表的概述✨
概念:链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
1.2 链表的分类✨
链表可分为单向链表和双向链表
一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。
一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接
1.3 ArrayList 与 LinkedList ✨
LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。
ArrayList用于
频繁访问列表中的某一个元素。
只需要在列表末尾进行添加和删除元素操作
LinkedList常用于
你需要通过循环迭代来访问列表中的某些元素。
需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
1.4 LinkedList 实现类✨
LinkedList 继承了 AbstractSequentialList 类。
LinkedList 实现了 Queue 接口,可作为队列使用。
LinkedList 实现了 List 接口,可进行列表的相关操作。
LinkedList 实现了 Deque 接口,可作为队列使用。
LinkedList 实现了 Cloneable 接口,可实现克隆。
LinkedList 实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输。
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。
所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。
注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问,如下所示:
List list = Collections.synchronizedList(new LinkedList(…));此类的 iterator 和 listIterator 方法返回的迭代器是快速失败 的:在迭代器创建之后,如果从结构上对列表进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。
注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何硬性保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。
1.5 LinkedList的构造方法✨
LinkedList
public LinkedList()
构造一个空列表。
LinkedList
public LinkedList(Collection c)
构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列。
参数:
c - 要将其元素放入此列表的 collection
抛出:
NullPointerException - 如果指定的 collection 为 null
1.6 LinkedList的常用方法摘要✨
方法 | 说明 |
boolean add(E e) | 将指定元素添加到此列表的结尾。 |
void add(int index, E element) |
在此列表中指定的位置插入指定的元素。 |
boolean addAll(Collection<? extends E> c) |
添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序。 |
boolean addAll(int index, Collection<? extends E> c) |
将指定 collection 中的所有元素从指定位置开始插入此列表。 |
void addFirst(E e) |
将指定元素插入此列表的开头。 |
void addLast(E e) |
将指定元素添加到此列表的结尾。 |
void clear() |
从此列表中移除所有元素。 |
boolean contains(Object o) |
如果此列表包含指定元素,则返回 true。 |
Iterator< E> descendingIterator() |
返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。 |
E get(int index) |
返回此列表中指定位置处的元素。 |
E getFirst() |
返回此列表的第一个元素。 |
E getLast() |
返回此列表的最后一个元素。 |
int indexOf(Object o) |
返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。 |
int lastIndexOf(Object o) |
返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。 |
ListIterator listIterator(int index) |
返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。 |
E remove() |
获取并移除此列表的头(第一个元素)。 |
E remove(int index) |
移除此列表中指定位置处的元素。 |
boolean remove(Object o) |
从此列表中移除首次出现的指定元素(如果存在)。 |
E removeFirst() |
移除并返回此列表的第一个元素。 |
boolean removeFirstOccurrence(Object o) |
从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)。 |
E removeLast() |
移除并返回此列表的最后一个元素。 |
boolean removeLastOccurrence(Object o) |
从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。 |
E set(int index, E element) |
将此列表中指定位置的元素替换为指定的元素。 |
int size() |
返回此列表的元素数。 |
Object[] toArray() |
返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组。 |
toArray(T[] a) |
返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组;返回数组的运行时类型为指定数组的类型。 |
1.7 代码示例:✨
package com.ithmm_01; import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; public class LinkedListDemo { public static void main(String[] args) { LinkedList<String> list = new LinkedList<String>(); list.add("张三"); list.add("李四"); list.add("王五"); //void add(int index, E element) 在此列表中指定的位置插入指定的元素。 list.add(2,"王麻子"); //张三 李四 王麻子 王五 // void addFirst(E e) | 将指定元素插入此列表的开头。 // void addLast(E e) | 将指定元素添加到此列表的结尾。 list.addFirst("王麻子");//王麻子 张三 李四 王五 list.addLast("赵六");//张三 李四 王五 赵六 //void clear() |从此列表中移除所有元素。 list.clear(); //descendingIterator()返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。 Iterator<String> li = list.descendingIterator(); while(li.hasNext()) { String s = li.next(); System.out.print(s+" ");//王五 李四 张三 } // E get(int index) |返回此列表中指定位置处的元素。 System.out.println(list.get(2));//王五 // E remove(int index) |移除此列表中指定位置处的元素。 list.remove(0);//李四 王五 // E set(int index, E element) | 将此列表中指定位置的元素替换为指定的元素。 // int size() |返回此列表的元素数。 list.set(0,"王麻子");//王麻子 李四 王五 System.out.println(list.size());//3 // ListIterator<E> listIterator(int index) |返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。 //获取列表迭代器,遍历集合 ListIterator<String> li = list.listIterator(); while(li.hasNext()) { String s = li.next(); System.out.print(s+" "); } } }