一、ArrayList和Linkedlist的区别

1.ArrayList是基于数组,LinkedList基于链表实现。

对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。

对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;

而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。

2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;

而在LinkedList的中间插入或删除一个元素的开销是固定的。

4.查找操作indexOf,lastIndexOf,contains等,两者差不多。

5.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

这里只是理论上分析,事实上也不一定,比如ArrayList在末尾插入和删除数据就不设计到数据移动,不过还是 有这么个建议:LinkedList不支持高效的随机元素访问,随机访问比较多的话一定要用ArrayList而不是LinkedList,如果需要频繁的插入和删除应该考虑用LinkedList来提高性能。

6.关于扩容

arraylis的初始容量是10,

当容量不够的时候

重新开辟一个 1.5倍+1的空间

将数据复制过来

 

详解:

1.ArrayList继承了abstractList类实现的RandomAccess接口,该接口提供了随机访问的功能,可以通过数组下标索引进行get访问 其时间复杂度为O(1);该接口在jdk api中的注释:

for typical instances of the class, this loop:

* <pre>

* for (int i=0, n=list.size(); i &lt; n; i++)

* list.get(i); * </pre> * runs faster than this loop:

* <pre>

* for (Iterator i=list.iterator(); i.hasNext(); )

* i.next();

* </pre>

说明遍历ArrayList的时候要用随机访问要快于迭代器。

2.ArrayList底层是以数组形式存在,就会产生几个问题,增加元素的时候会进行数组移动(在集合头部或中部添加),超过默认数组大小的时候会重新初始化新数组。这样就会带来很大的性能开销。所以如果已知集合大小,就要在初始化集合的时候分配好大小,而不是用默认集合的大小。

ArrayList添加元素的时候时间复杂度为O(n)。

3.在ArrayList中删除元素的时候,跟添加元素的时候情况一样。时间复杂度也为O(n)。

LinkedList底层以双向链表存在的

1.双向链表的特点是集合中的每个节点有一个指向下一个节点的指针和前一个节点的指针。prev为null的时候为head,next为null的时候为tail

2.LinkedList继承的是AbstractSequentialList类(继承了AbstractList类),该类主要提供了连续访问的封装,使用迭代器对集合的一些基本操作,所以继承该类的子类的get add操作都是通过迭代器实现的。

public E get(int index) {

try {

return listIterator(index).next();

} catch (NoSuchElementException exc) {

throw new IndexOutOfBoundsException("Index: "+index);

}     }

public void add(int index, E element) {

try {

listIterator(index).add(element);

} catch (NoSuchElementException exc) {

throw new IndexOutOfBoundsException("Index: "+index);

}

}

3.对一个LinkedList集合遍历的时候一定要用迭代器,get()的时间复杂度为O(n),要避免使用

for(int i=0,n=linkedList.size();i<n;i++){

  linkedList.get(i);

}

这种形式,因为每次的get操作都会用迭代器去遍历链表,该循环时间复杂度为O(n*n)。

4.对linkedList集合进行增加删除的时候所用时间都为常数时间(O(1)),例如在ac之间插入b,只需要将a的next指向b,b的prev指向a,b的next指向c,c的prev指向b。

增加元素的时候 比如在p.prev 和 p之间插入一个元素

Node<E> newNode = new Node<E>(p.prev,x,p);

p.prev.next = newNode;

p.prev = newNode;

删除元素的时候 比如删除节点p

p.prev.next = p.next;

p.next.prev = p.prev;

5.通过Iterator遍历集合的时候,如果通过list.remove()删除元素就会抛出一个ConcurrentModificationException异常。如果想删除要用迭代器自带的删除方法进行删除。

java基础之 集合的更多相关文章

  1. java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  2. 第6节:Java基础 - 三大集合(上)

    第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...

  3. Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)

    Java基础之 集合体系结构详细笔记(Collection.List.ArrayList.LinkedList.Vector) 集合是JavaSE的重要组成部分,其与数据结构的知识密切相联,集合体系就 ...

  4. 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!

    前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...

  5. java基础技术集合面试【笔记】

    java基础技术集合面试[笔记] Hashmap: 基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(除了不同步和允许使用 null 之外,Ha ...

  6. Java基础--说集合框架

    版权所有,转载注明出处. 1,Java中,集合是什么?为什么会出现? 根据数学的定义,集合是一个元素或多个元素的构成,即集合一个装有元素的容器. Java中已经有数组这一装有元素的容器,为什么还要新建 ...

  7. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  8. 《回炉重造 Java 基础》——集合(容器)

    整体框架 绿色代表接口/抽象类:蓝色代表类. 主要由两大接口组成,一个是「Collection」接口,另一个是「Map」接口. 前言 以前刚开始学习「集合」的时候,由于没有好好预习,也没有学好基础知识 ...

  9. java基础之集合长度可变的实现原理

    首先我们要明白java中的集合Collection,List,ArrayList之间的关系: ArrayList是具体的实现类,实现了List接口 List是接口,继承了Collection接口 Li ...

  10. JAVA基础整理-集合篇(一)

    集合作为JAVA的基础知识,本来感觉自己理解的很清楚了,但是在最近的一次面试中还是答得不尽如人意!再次做一下整理,以便加深理解以及随时查阅. 首先,java.util包中三个重要的接口及特点:List ...

随机推荐

  1. Android监听Button和ImageButton控件的点击事件

    一.onClick事件 Button和ImageButton都有一个onClick事件,通过自身的.setOnClickListener(OnClickListener)方法添加点击事件 所有的控件都 ...

  2. gradle资料

    <Gradle用户教程>中文版 · GitBookhttps://www.gitbook.com/book/yeetrack/-gradle-user-guide-chinese/deta ...

  3. grade web的构建约定 convention

    --2015.09.24 当使用gradle构建web应用时: src/main/javasrc/main/resourcessrc/main/webapp/resourcessrc/main/web ...

  4. 动画Animation

    动画分类:Animation 单一动画 AnimationSet 复合动画 AnimationSet是Animation的实现子类,Animation是一个抽象类,他的实现子类主要有如下几种: 主要有 ...

  5. 抛弃优启Grub4dos和PE大多数时间可以这样用

    在能够进入Windows的情况下,Grub4dos和PE大多数时间可以这样用 http://files.cnblogs.com/files/liuzhaoyzz/boot_moban.rar Grub ...

  6. Element can be click when out of view

    WebDriver can't action the element when out of view Webdriver can't action the element when the elem ...

  7. 抽象类中的抽象方法也是默认public的么(类似于interface)?

    测试下: public abstract class AbstractTest { abstract int printline(); } 在另一个package 设置 public class Ab ...

  8. 在腾讯云上创建您的SQL Cluster(2)

    版权声明:本文由李斯达原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/248 来源:腾云阁 https://www.qclo ...

  9. css读书笔记2:css工作原理

    css就是一种先选择html元素,然后设定选中元素css属性的机制.css选择符合要应用的样式构成一条css规则. 为文档添加样式的3种方法: 1.行内样式,直接写在特定标签的style属性中:2.嵌 ...

  10. 【CodeForces 651B】Beautiful Paintings 排序+贪心

    题目大意: 给定集合,对于任意一个的排列,记,求. 很明显每次搞出一个长度为的最长上升序列,然后把元素给删掉,答案增加. 直接暴力需要. 但是可以进行优化. 设有个,将个数从小到大排序,记为长度为的数 ...