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中指定行数的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)