ArrayDeque:LinkedList

ArrayDeque:LinkedList,第1张

ArrayDeque和LinkedList都实现了Deque双端队,从两端取值/添加/删除

ArrayDeque ,内部有3个成员,object数组,index 头,index尾

Object[] elements保存元素

int head,标记object数组的index 零

int tail标记object数组的index last=length-1

依靠两个下标索引Object数组实现队尾/对头的添加删除等

LinkedList, 内部有成员双向链表Link voidLink,通过链表实现在对头队尾的添加删除等动作

程序在执行listadd(2,"B");的时候就报错,因为还没有存在下标为1的值,而你直接插入下标为2的值。

LinkedList是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。这样就带来以下有缺点:

*** 作其中对象的速度快 只需要改变连接,新的节点可以在内存中的任何地方

不能随即访问,虽然存在get()方法,所以这个方法是通过遍历接点来定位的速度慢。

说白了,就是数据结构中的顺序存储和链式存储

(转)

你仔细去看看各个集合的特点吧。都有自己的执行方式的。

|--List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引,

|-- ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步

|-- LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)

|-- Vector:底层是数组数据结构 线程同步(数组长度是可变的百分之百延长)(无论查询还是增删都很慢,被ArrayList替代了)

List a1 = new ArrayList();

a1add("java01");

a1add("java02");

a1add("java03");

a1add("java04");

获取java03就是a1get(2);因为下标是从0开始。

arraylist和linkedlist的区别:

一、查找元素方法不同:

1、arraylist可以直接通过数组下标找到元素。

2、linkedlist要通过移动指针遍历每个元素,直到找到需要的元素为止。arraylist查找元素的速度比linkedlist快。

二、空间消耗。

1、arraylist的空间浪费主要体现在在list结尾预留了一定的容量空间。

2、而linkedlist的空间浪费则体现在它的每一个元素都要消耗一定的空间。

三、原理不同。

1、arraylist是基于动态数组实现的非线程安全集合。

2、linkedlist是基于链表实现的非线程安全集合。

四、删除元素。

1、arraylist在新增和删除元素时,可能扩容和复制数组。

2、而linkedlist实例化对象只需要修改指针即可。

import myjavaNode;

import myjavaSinglyLinkedList;

import myjavaSeqStack;

public class ReverseLinkedList<E> extends SinglyLinkedList<E> {

public ReverseLinkedList(){

super();

}

public void reverse(ReverseLinkedList<E> list){

SeqStack<E> stack = new SeqStack<E>();

Node<E> p = thishead ;

while(p != null){

stackpush(pdata);

p = pnext;

}

listclear();

while(!stackisEmpty()){

listadd(stackpop());

}

}

public static void main (String[] args) {

ReverseLinkedList<Integer> list = new ReverseLinkedList<Integer>();

for(int i = 1;i < 6;i++){

listadd(0,new Integer(i));

}

Systemoutprintln("单列表 "+listtoString());

listreverse(list);

Systemoutprintln("逆转后 "+listtoString());

}

}

1、ArrayList:动态数组。

用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处。

2、LinkedList:双向列表。

列表中的每个节点都包含了对前一个和后一个元素的引用。

List 接口的大小可变数组的实现,位于API文档的javautilArrayList<E>。实现了所有可选列表 *** 作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来 *** 作内部用来存储列表的数组的大小。

size、isEmpty、get、set、iterator 和 listIterator *** 作都以固定时间运行。add *** 作以分摊的固定时间 运行,也就是说,添加 n 个元素需要 O(n) 时间。其他所有 *** 作都以线性时间运行(大体上讲)。

与用于 LinkedList 实现的常数因子相比,此实现的常数因子较低。

每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。

扩展资料

常用方法:

1、boolean add(E e):将指定的元素添加到此列表的尾部。

2、void add(int index, E element):将指定的元素插入此列表中的指定位置。

3、boolean addAll(Collection< extends E> c):按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。

4、boolean addAll(int index, Collection< extends E> c):从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。

5、void clear():移除此列表中的所有元素。

6、Object clone():返回此 ArrayList 实例的浅表副本。

参考资料来源:百度百科-arraylist

ArrayList其实是包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当向ArrayList中添加对象是,数组的大小也相应的改变。这样就带来以下有缺点:

快速随即访问 你可以随即访问每个元素而不用考虑性能问题,通过调用get(i)方法来访问下标为i的数组元素。

向其中添加对象速度慢 当你创建数组是并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情。

*** 作其中对象的速度慢 当你要想数组中任意两个元素中间添加对象时,数组需要移动所有后面的对象。

LinkedList

LinkedList是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。这样就带来以下有缺点:

*** 作其中对象的速度快 只需要改变连接,新的节点可以在内存中的任何地方

不能随即访问 虽然存在get()方法,但是这个方法是通过遍历接点来定位的所以速度慢。

说白了,就是数据结构中的顺序存储和链式存储

以上就是关于ArrayDeque:LinkedList全部的内容,包括:ArrayDeque:LinkedList、java基础,list问题、java 如何得到list中指定行数的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9478953.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存