一、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. OpenGL的gluPerspective透视投影变换函数详解[转]

    函数原型void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) 首先得设置gluPersp ...

  2. Android客户端向服务器端发送数据的流程(1)

    原理: android客户端通过使用org.apache.http.impl.client.DefaultHttpClient类来发送数据; 方法介绍: HttpClient是android中提供的一 ...

  3. poj------(3468)A Simple Problem with Integers(区间更新)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 60745   ...

  4. 79. 212. Word Search *HARD* -- 字符矩阵中查找单词

    79. Word Search Given a 2D board and a word, find if the word exists in the grid. The word can be co ...

  5. 164. Maximum Gap *HARD* -- 无序数组找出排序后连续元素的最大间隔

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  6. 开发完iOS应用,接下去你该做的事

    iOS专项总结 关于 analyze Clang 静态分析器 Slender Faux Pas Warning Leaks Time Profiler 加载时间 iOS App启动过程 帧率等 如何优 ...

  7. backbonejs中的模型篇(二)

    一:模型标识符 每个模型都有一个用作唯一标识符的ID属性,以便在不同模型间进行区分.通过id属性我们可以直接访问模型对象当中用于标识符存放的属性,默认属性名为id,但也可以通过设置idAttribut ...

  8. 镜像渐变-radio-gradient

    2013年11月15日13:08:37   <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"&g ...

  9. mark 一下

    Android资源管理框架(Asset Manager)简要介绍和学习计划 http://www.cnblogs.com/hjtdlx/p/4332060.html

  10. API 进程、线程函数

    CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 ConnectNamedPipe 指 ...