婚庆公司网站建设方案,先做它个天猫网站,WordPress响应式幻灯片,网站开发虚拟主机是什么list接口中ArrayList、LinkedList都不是线程安全#xff0c;Vector是线程安全
1、数据结构不同
ArrayList是Array(动态数组)的数据结构#xff0c;LinkedList是Link(链表)双向链表的数据结构。
2、空间灵活性
ArrayList最好指定初始容量 LinkedList是比ArrayList灵活的Vector是线程安全
1、数据结构不同
ArrayList是Array(动态数组)的数据结构LinkedList是Link(链表)双向链表的数据结构。
2、空间灵活性
ArrayList最好指定初始容量 LinkedList是比ArrayList灵活的是根本不需要指定初始容量的
3、效率不同
当随机访问Listget和set操作时ArrayList比LinkedList的效率更高因为LinkedList是线性的数据存储方式所以需要移动指针从前往后依次查找。ArrayList对于数据查询非常快但是插入与删除元素比较慢当对数据进行增加和删除的操作(add和remove操作)时LinkedList速度非常快。
4、主要控件开销不同
ArrayList主要控件开销在于需要在List列表预留一定空间
而LinkList主要控件开销在于需要存储节点信息以及节点指针。
其他
ArrayList是实现了基于动态数组的数据结构LinkedList基于链表的数据结构。
对于随机访问get和setArrayList觉得优于LinkedList因为LinkedList要移动指针。
对于新增和删除操作add和removeLinedList比较占优势因为ArrayList要移动数据。
ArrayList内部使用数组的形式实现了存储实现了RandomAccess接口利用数组的下面进行元素的访问因此对元素的随机访问速度非常快。
因为是数组所以ArrayList在初始化的时候有初始大小10插入新元素的时候会判断是否需要扩容扩容的步长是0.5倍原容量扩容方式是利用数组的复制因此有一定的开销 另外ArrayList在进行元素插入的时候需要移动插入位置之后的所有元素位置越靠前需要位移的元素越多开销越大相反插入位置越靠后的话开销就越小了如果在最后面进行插入那就不需要进行位移。 LinkedList内部使用双向链表的结构实现存储每一个节点有两个指针域一个指向下一个节点一个指向上一个节点。LinkedList有一个内部类作为存放元素的单元Node里面有三个属性用来存放元素本身以及前后2个单元的引用另外LinkedList内部还有一个header属性用来标识起始位置LinkedList的第一个单元和最后一个单元都会指向header因此形成了一个双向的链表结构,如下注这个是旧版本的
private transient EntryE header new EntryE(null, null, null);
public LinkedList() {header.next header.previous header;
}public E getFirst() {if (size0)throw new NoSuchElementException();return header.next.element;
}public E getLast() {if (size0)throw new NoSuchElementException();return header.previous.element;
}public E removeFirst() {return remove(header.next);
}
LinkedList是采用双向链表实现的。所以它也具有链表的特点每一个元素结点的地址不连续通过引用找到当前节点的上一个节点和下一个节点即插入和删除效率较高只需要常数时间而get和set则较为低效。
LinkedList的方法和使用和ArrayList大致相同由于LinkedList是链表实现的所以额外提供了在头部和尾部添加/删除元素的方法也没有ArrayList扩容的问题了。另外ArrayList和LinkedList都可以实现栈、队列等数据结构但LinkedList本身实现了队列的接口所以更推荐用LinkedList来实现队列和栈。
下面简单看一下linkedlist add 方法的源码,方便理解注这个是新版本java已经没有header
public cTass LinkedListE extendsimpTements...{transient int size 0; // 链表长度transient NodeE first; // 指向链表第一个节点transient NodeE last; // 指向链表最后一个节点...public boolean add(E e) { // 添加元素linkLast(e); // 向链表末尾添加元素ereturn true; }...
}void linkLast(E e) { // 向链表未尾添加元素 fina1 NodeE 1 last; // 暂时保存最后一个元素的指针fina1 NodeE newNode new Node(1, e, nu11);last newNode; // newNode 作为最后一个节点if (1 nu11) // 当前链表为空first newNode; // 第一个添加的节点即为 firstelse // 链表不空1.next newNode; // 当前链表的最后一个节点next 指向newNodesize;modCount;
}// LinkedList 底层是一个双向链表
private static class NodeE { // LinkedList 的节点静态内部类 NodeE item;NodeE next; // 后继NodeE prev; // 前驱Node(NodeE prevE element NodeE next) {this.item element;this.next next;this.prev prev;}
}使用场景
1如果应用程序对数据有较多的随机访问ArrayList对象要优于LinkedList对象
( 2 ) 如果应用程序有更多的插入或者删除操作较少的随机访问LinkedList对象要优于ArrayList对象
3不过ArrayList的插入删除操作也不一定比LinkedList慢如果在List靠近末尾的地方插入那么ArrayList只需要移动较少的数据而LinkedList则需要一直查找到列表尾部反而耗费较多时间这时ArrayList就比LinkedList要快。 2.链表
2.1 链表的概念及结构
链表是一种物理存储结构上非连续存储结构数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。实际存储图
理解逻辑图 实际中链表的结构非常多样以下情况组合起来就有8种链表结构 虽然有这么多的链表的结构但是我们重点掌握两种:
无头单向非循环链表就是我们常说的单链表结构简单一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构如 哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。无头双向链表在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。 参考
LinkedList源码解析JDK8_我是一棵卷心菜的博客-CSDN博客
总结数据结构-1_51CTO博客_总结数据结构
LinkedList与链表_linkedlist循环链表_如风暖阳的博客-CSDN博客