LinkedList

List的徒子徒孙们

安稳与你 提交于 2020-03-22 23:44:39
3 月,跳不动了?>>> 1. 徒子徒孙报道 从 Collection家族成员 中可以知道List的徒子徒孙们有(绿色为实现,橙色为继承): AbstractList : SubList : RandomAccessSubList AbstractSequentialList : LinkedList ArrayList Vector : Stack ArrayList LinkedList Vector : Stack 问题:从这些关系里很明显发现AbstractList已经实现了List接口,而ArrayList和Vector是继承它的,为什么ArrayList和Vector还实现List接口? 2. AbstractCollection、AbstractList两个抽象类的功能 AbstractCollection:实现了移除指定元素返回boolean值的功能(依靠迭代器实现的,但此类并未实现迭代器的功能);判断集合包含元素功能;转化成数组的功能。 AbstractList:只实现了迭代器功能,继承AbstractCollection实现的功能。 总结:(1) 这两个抽象类都未实现元素的添加操作,但却定义了各种用到add的方法,算是搭了骨架,只要后面的徒子徒孙们实现add操作,remove操作即可融汇贯通。 (2) 集合的接口和抽象类都未见存储元素的容器

Java中Vector和ArrayList的区别

风流意气都作罢 提交于 2020-03-01 10:52:57
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下: ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。 Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。 LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。 查看Java源代码,发现当数组的大小不够的时候,需要重新建立数组,然后将元素拷贝到新的数组内,ArrayList和Vector的扩展数组的大小不同。 ArrayList中: 1 public

集合操作(一)ArrayList,LinkedList源码分析

一世执手 提交于 2020-01-07 17:33:16
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ArrayList: 构造函数: ArrayList提供了三种方式的构造器,可以构造一个默认初始容量为10的空列表、构造一个指定初始容量的空列表以及构造一个包含指定collection的元素的列表,这些元素按照该collection的迭代器返回它们的顺序排列的。 ArrayList底层是使用一个Object类型的数组来存放数据的。 transient Object[] elementData; // non-private to simplify nested class access size变量代表List实际存放元素的数量 private int size; 不指定ArrayList大小时,默认数组大小为10 private static final int DEFAULT_CAPACITY = 10; 接下来看几个常用的方法: add: 1. public boolean add(E e) { ensureCapacityInternal(size + 1); // 扩容检测 elementData[size++] = e; //新增元素加到末尾 return true; } 2. public void add(int index, E element) { rangeCheckForAdd

【算法系列 一】 Linked List

纵饮孤独 提交于 2019-12-07 13:08:03
1. 给定两个链表,分别表示两个非负整数。它们的数字逆序存储在链表中,且每个结点只存储一个数字,计算两个数的和,并且返回该链表( Leetcode 2 )。 Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int val = (l1.val + l2.val) % 10; int flag = (l1.val + l2.val) / 10; ListNode l3 = new ListNode(val); ListNode res = l3; while (l1.next != null && l2.next != null) { l1 = l1.next; l2 = l2.next; val = (l1.val + l2.val + flag) % 10; flag = (l1.val +

详解Java中ArrayList、Vector、LinkedList三者的异同点

徘徊边缘 提交于 2019-12-03 16:05:10
一、ArrayList ArrayList是一个可以处理变长数组的类型,这里不局限于“数”组,ArrayList是一个泛型类,可以存放任意类型的对象。顾名思义,ArrayList是一个数组列表,因此其内部是使用一个数组来存放对象的,因为Object是一切类型的父类,因而ArrayList内部是有一个Object类型的数组类存放对象。ArrayList类常用的方法有add()、clear()、get()、indexOf()、remove()、sort()、toArray()、toString()等等,同时ArrayList内部有一个私有类实现Iterator接口,因此可以使用iterator()方法得到ArrayList的迭代器,同时,还有一个私有类实现了ListIterator接口,因此ArrayList也可以调用listIterator()方法得到ListIterator迭代器。 由于ArrayList是依靠数组来存放对象的,只不过封装起来了而已,因此其一些查找方法的效率都是O(n),跟普通的数组效率差不多,只不过这个ArrayList是一个可变”数组“,并且可以存放一切指定的对象。 另外,由于ArrayList的所有方法都是默认在单一线程下进行的,因此ArrayList不具有线程安全性。若想在多线程下使用

LinkedList工作原理

我的未来我决定 提交于 2019-12-03 07:25:58
1.学习LinkedList的必要性 在 ArrayList工作原理 中,我们了解到ArrayList和LinkedList是List接口的两个重要实现。并且ArrayList是一个动态数组的实现。因此ArrayList在队列中插入和删除元素方面的性能有很大的缺陷(这是因为插入和删除元素时要确保ArrayList容量,消耗性能)。为了实现队列元素的快速插入和删除,我们来学习下LinkedList。 2.LinkedList简介 2.1 LinkedList定义 LinkedList是List接口的链表实现,是一个继承于AbstractSequentialList的双向链表。LinkedList类除了实现List接口外,还实现了Deque接口,为add、poll提供先进先出的队列操作,以及其他堆栈和双端队列操作。LinkedList和ArrayList一样都是非同步的。 2.2 LinkedList的数据结构如下: java.lang.Object ↳ java.util.AbstractCollection<E> ↳ java.util.AbstractList<E> ↳ java.util.AbstractSequentialList<E> ↳ java.util.LinkedList<E> public class LinkedList<E> extends

ArrayList vs. LinkedList vs. Vector

余生颓废 提交于 2019-11-30 03:48:39
1. List概览 List,就像它的名字暗示的一样,是一组排列有序的元素。当我们讨论List的时候,很容易将它和Set作比较。Set是一组唯一的而且排列无序的元素。 下图是集合类的层次结构图。你可以总体上知道我们今天讨论的主题。 2. ArrayList vs. LinkedList vs. Vector 从上图可知,它们都实现了List接口。它们的用法差不多,主要的区别在于它们对于不同操作的操作速度不同。 ArrayList是可以改变大小的数组。当有元素添加到ArrayList中去时,它的大小动态的增加。元素可以直接通过get()和set() 方法进行访问,因为ArrayList实际上是数组。LinkedList是个双向链表。它的add()和remove()方法比ArrayList快, 但是get()和set()方法却比ArrayList慢。Vector和ArrayList类似,但是Vector是同步的。 如果在线程安全的环境下, 使用ArrayList是更好的选择。 添加元素的时候,当超过初始容量的时候,Vector和ArrayList需要更多的空间:Vector需要将数组 的大小增加一倍,而ArrayList需要增加50%。 LinkedList还实现了Queue接口,这样就比ArrayList和Vector多出了一些方法如offer(), peek(), poll()等。

JDK容器学习之List: CopyOnWriteArrayList,ArrayList,LinkedList对比

£可爱£侵袭症+ 提交于 2019-11-27 04:12:14
列表 List, ArrayList, LinkedList, CopyOnWriteArrayList, Vector 简述 1. 列表划分为线程安全和线程非安全两类 线程安全: Vector , CopyOnWriteArrayList , Collections.synchronizedList() 线程非安全: ArrayList , LinkedList 2. 底层存储 数组: ArrayList Vecotr CopyOnWriteArrayList 双向链表: LinkedList 通过三个添加元素的过程图,来看数据结构 ArrayList,Vector : 底层存储为数组 LinkedList : 底层存储为双向链表 CopyArrayList :底层存储为数组 3. 使用场景和说明 ArrayList 底层为数组,适合随机访问 删除不会引起数组容量变小 动态插入可能涉及到数组长度重新分配 为避免频繁的数组扩容,可设置一个合适的初始容量 不适用于频繁的在数组中间进行插入删除的场景 LinkedList 底层为双向链表,适合频繁删除新增的场景 随机访问不友好,需要遍历 Vector 线程安全 所有的方法都加锁,导致性能较差 CopyOnWriteArrayList 线程安全 读方法不加锁;修改方法加锁,一次只能一个写线程访问 修改时,会拷贝一份内容出来