一、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. 转!!Java学习之自动装箱和自动拆箱源码分析

    自动装箱(boxing)和自动拆箱(unboxing)   首先了解下Java的四类八种基本数据类型   基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|fal ...

  2. hiho_99_骑士问题

    题目大意 给定国际象棋8x8棋盘上三个起始点,三个骑士分别从三个起始点开始移动(骑士只能走日字,且骑士从任意一点出发可以走遍整个棋盘).现要求三个骑士汇聚到棋盘上某个点,且使得骑士到达该点所移动的次数 ...

  3. Unity3D WebCamTexture 调用外部摄像头

    http://www.itnose.net/detail/6259004.html 一:Unity 中使用WebCamTexture 调用摄像头实现拍照和摄像. using UnityEngine; ...

  4. openmpi出现Segmentation Fault而终止运算

    欢迎关注我的社交账号: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://gith ...

  5. 5.4.2 使用配置启动firefox

    1.使用firefox的本地配置加载浏览器 使用本地配置加载浏览器,代码如下. 这样运行后,可以看到firebug等插件都已启动. 练习:假设做性能测试时,需要获取某个状况下的页面网络运行参数.要求完 ...

  6. python 练习 22

    Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false. Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行语句…… el ...

  7. robotframework笔记13

    变量 介绍 变量是不可或缺的功能机器人框架,他们可以 在大多数地方用于测试数据. 通常,他们使用 参数测试用例表中的关键字和关键字表,但是 也都设置允许变量的值. 一个正常的字 的名字 不能 指定一个 ...

  8. 使用Visual Studio 2013进行单元测试--初级篇

    1.打开VS2013 --> 新建一个项目.这里我们默认创建一个控制台项目.取名为UnitTestDemo 2.在解决方案里面新增一个单元测试项目.取名为UnitTestDemoTest 创建完 ...

  9. (19)odoo中的javascript

    -----------更新日期15:17 2016-02-16 星期二-----------* 用到的js库   我们可以打开 addons/web/views/webclient_template. ...

  10. (转)codeblock(常用快键)

    一款开源的C/C++ IDE(集成开发环境),基于wxWidgets GUI体系,跨平台支持. 编辑器 快捷键 功能 Ctrl+Z 恢复上一次操作 Ctrl+Shift+Z 重复上一次操作 F11 切 ...