JAVA学习笔记----集合类之LinkedList

时间:2022-05-29 16:58:56

PS:目前仅供博主日常学习笔记而已

定义

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable
LinkedList 是由双向链表(Doubly-linked list)构成的,实现了List和Deque接口

LinkedList所有操作都没有实现同步

如果多个线程同时访问一个LinkedList,而其中至少一个线程从结构上修改了该LinkedList,则它必须保持外部同步..这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:

List list = Collections.synchronizedList(new LinkedList(...));

同时LinkedList的迭代器iterators属于快速失败,即在迭代器创建之后,如果从结构上进行修改,除非通过迭代器本身的 remove 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。

举个例子说明一下吧

LinkedList<String> str=new LinkedList<String>();
str.addFirst("huang");
str.add("hello");
str.add("world");
//System.out.println(str.get(0));
Iterator it=str.iterator();
str.add("xin");//这句会抛出ConcurrentModificationException异常
while(it.hasNext())
{
String s=(String)it.next();
if(s.equals("hello"))
it.remove();
}
str.add("hello");//这句不会抛出异常,我个人觉得这跟GC有关,还没深入探究

由所有此类的“collection 视图方法”所返回的迭代器都是快速失败 的:在迭代器创建之后,如果从结构上进行修改,除非通过迭代器本身的 remove 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间发生任意不确定行为的风险。

注意,迭代器的快速失败行为不能得到保证,一般来说,存在非同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的做法是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。

成员变量

transient int size = 0;//实际大小

transient Node<E> first;//头结点

transient Node<E> last;//尾结点

成员函数

//当c长度为0,返回false
//操作本质是通过c.toArray(),将c转换成数组,然后插入到链表的末尾
addAll(Collection<? extends E> c)

/*关于查找的成员函数,通过Object.equals方法进行比较的,故此对自定义的类必须重写equals方法*/
int indexOf(Object o)和int lastIndexOf(Object o)