数组访问快的原因:

数组在内存中的空间是连续的,因而可以直接通过数组的首地址 计算出 需要访问的位置,直接拿到元素或对象引用

链表 增删快原因:

这是相较于数组而言的,对于数组而言,元素的新增 删除 可能会伴随后面的元素向前移动的问题,而数组上的位置移动,是需要一个个复制过去。而链表的新增删除,在不考虑元素定位的情况下,只需要修改最多三个节点(包含元素本身)的引用指向而已。

链表随机访问慢的原因:

相较于数组的定位,链表就需要根据需要访问的位置 从前或从后 数元素,直到数到对应的索引为止,也就是数组的是计算而链表的是遍历,所以链表访问慢

数组 浪费内存空间解释:

1.数组需要预先初始化一段连续的内存空间等待使用,而一般情况下数组都不会恰好放满,即有一段内存空间是未使用的,

2.数组的扩容,实际是先申请更大的内存空间,再将现有的元素复制过去,原来的这个就不用了,变成了需要gc的垃圾

数组和链表的遍历

数组和链表的遍历理论上一样快,但实际上数组快

因为CPU处理时,CPU缓存会把一片连续的内存空间读入,如果是数组那就有部分或全部数据都读取到cpu缓存中,供cpu使用,而对于链表, 因为节点都是在堆中分散存在,所以cpu只能读取内存,所以数组的遍历会快

ArrayList

新增时检查扩容流程

1.传入新增后目标长度,

判断当前数组 如果是初始化状态(长度0),则返回默认大小10 和新增后目标长度 较大的那个

否则 返回新增后目标长度

2.上步 返回的长度 和 数组实际长度 比对,不够 则扩容

3.扩容 为 当前容量1.5倍(所以第二部会尽量 做到在没初始化 时 初始化 一个 大一点的,不然 如果从0个 开始 加 容量变化为0->1>2>3>4>6)

int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)    newCapacity = minCapacity;

根据1.5倍得到容量后,会再检查,如果还小于目标容量,则 取目标容量。所以能从0>1>2

SubList

sublist具备list的所有功能,但 谨慎使用,因为操纵sublist时,实际还是操作的list,

List list = new ArrayList(0);list.add("a");// 使用构造器创建一个包含list的列表list1List list1 = new ArrayList(list);// 使用subList生成与list相同的列表list2List list2 = list.subList(0, list.size());list2.add("b");System.out.println(list.equals(list1));   //falseSystem.out.println(list.equals(list2));   //true

因为 list和list1比较的时候,list已经变了,因为list2的add操作,实际就是操作的list。

Arraylist的 sublist函数

public List subList(int fromIndex, int toIndex) {    subListRangeCheck(fromIndex, toIndex, size);    return new SubList(this, 0, fromIndex, toIndex);}

sublist的add函数

public void add(int index, E e) {    rangeCheckForAdd(index);    checkForComodification();    parent.add(parentOffset + index, e);    this.modCount = parent.modCount;    this.size++;}

所以sublist的add就是调用parent.add,而parent实际就是 生成他的Arraylist

LinkedList

基于链表

Node节点定义

    private static class Node {        E item;        Node next;        Node prev;        Node(Node prev, E element, Node next) {            this.item = element;            this.next = next;            this.prev = prev;        }    }

在定位节点时,会根据定位的位置 和 链表大小比对,不过半 则 从头查,过半 从尾部查。

以下为定位位置节点的实现:

   Node node(int index) {        if (index < (size >> 1)) {            Node x = first;            for (int i = 0; i < index; i++)                x = x.next;            return x;        } else {            Node x = last;            for (int i = size - 1; i > index; i--)                x = x.prev;            return x;        }    }

Vector

Vector和ArrayList一样也是基于数组实现的,自动扩容,部分方法 加了同步锁synchronized。

有意思的点 是其中有种构造方法 可以传入 每次扩容 的大小,默认这个值为0(此时扩容为两倍,当然也有对于扩容后容量和期望容量的比对,防止容量不足的请, 和arraylist一样)

以下为构造函数和扩容函数


    public Vector(int initialCapacity, int capacityIncrement) {        super();        if (initialCapacity < 0)            throw new IllegalArgumentException("Illegal Capacity: "+                                               initialCapacity);        this.elementData = new Object[initialCapacity];        this.capacityIncrement = capacityIncrement;    }    private void grow(int minCapacity) {        // overflow-conscious code        int oldCapacity = elementData.length;      //如果设置了capacityIncrement,则每次新增capacityIncrement      //否则以2倍扩容        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?                                         capacityIncrement : oldCapacity);        if (newCapacity - minCapacity < 0)            newCapacity = minCapacity;        if (newCapacity - MAX_ARRAY_SIZE > 0)            newCapacity = hugeCapacity(minCapacity);        elementData = Arrays.copyOf(elementData, newCapacity);    }

新增数组_数组链表和List部分理解总结相关推荐

  1. 扩容是元素还是数组_数组是如何随机访问元素?数组下标为什么从0开始,而不是1?...

    作者:鹏磊 来源:搜云库技术团队 数组如何实现随机访问元素 什么是数组? 数组(Array)是一种线性表数据结构,它用一组连续的内存空间,来存储相同类型的数据. 什么是线性表(Linear List) ...

  2. arrays中copyof复制两个数组_数组,及二维数组

    1.1 命令行参数(C) 在程序运行过程中,可以向应用程序传递一些参数,这些参数称为命名行参数. public 命令行参数以字符串的形式传入args数组中.可以一次传递0-多个参数,以空格分割. 如果 ...

  3. c字符串分割成数组_数组与字符串

    定义数组时,应该注意以下几点: (1) 数组使用的是方括号[ ],不要误写成小括号( ). (2) 常量表达式的值必须是一个正整数值,不能含有变量,但是可以是符号常数或常量表达式. (3) 数组定义后 ...

  4. pycharm定义空的二维数组_数组与面向对象

    数组与面向对象 数组 一维数组 数组:[ ] 存储相同类型的多个数据 变量:单个数据 数组:多个数据 数组的特点: 引用数据类型 数据是个容器,长度一旦确定不可改变 一个数组中存放的多个数据的类型要求 ...

  5. c#json对象转数组_数组和对象的区别

    数组和对象两者都可以用来表示数据的集合,曾一度搞不清楚"数组"(array)和"对象"(object)的根本区别在哪里. 有一个数组a=[1,2,3,4],还有 ...

  6. java list 转数组_数组转List,一定要小心这个坑!

     关注"Java技术迷"升职加薪不脱发! 在日常开发过程中,数组转List的使用频率非常之高.大家可以回想一下,通常你都是怎么转的呢? 用代码说话,下面来看一段代码: public ...

  7. 转为字符数组_数组的20种常用的方法?

    1.shift 删除数组中的第一个元素 2.pop 删除数组中的最后一个元素 3.unshift 增加元素在数组的前面 4.push 增加元素在数组的后面 5.map 循环,并且返回新的数组 6.fo ...

  8. public 返回一数组_数组:滑动窗口拯救了你

    别不信,真的拯救了你 题目209.长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度.如果不存在符合条件的子数 ...

  9. java环形数组_数组实现环形队列Java

    用数组实现环形队列的特点是高效. 能快速判断队列是否 满/空: 能快速存取数据. 因为简单高效,所以甚至在硬件中都实现了环形队列. 环形队列广泛应用于网络数据的收发,和不同应用间数据交换(内核和应用程 ...

最新文章

  1. loadrunner——win7+LR11配置
  2. spring获取webapplicationcontext,applicationcontext几种方法详解(转载)
  3. js学习总结----轮播图之渐隐渐现版
  4. 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)
  5. 一文说说这十多年来计算机玩摄影的历史
  6. Thinkphp5.0 阿里云OSS扩展类上传示例(轮子)
  7. Python day7之mysql
  8. Android学习笔记---android平台中利用,SAX解析xml
  9. 从零开始学习MXnet(四)计算图和粗细粒度以及自动求导
  10. 【气体扩散】基于改进的遗传算法求解高斯烟羽模型模拟气体扩散含Matlab代码
  11. 整整1600套Axure原型图设计源文件UI UX交互设计案例
  12. XCode5设置字体
  13. 应用进展_解释的标准事件:第2部分–应用和进展
  14. 获取163邮箱的邮件 并下载附件
  15. Widows 和Linux 查看端口和杀掉进程的方法
  16. 电子计算机按钮说明,电子计算器常用按键功能说明
  17. vassonic PHP,轻量级、高性能的 VasSonic 框架,听说开源了?
  18. C语言验证哥德巴赫猜想
  19. MPB:中科院城环所杨军组-​​基于DNA宏条形码的水体微型真核生物群落测序建库方法...
  20. KiTTY及cnKiTTY配置文件kitty.ini的简单中文注释

热门文章

  1. Qt发布可能遇到的问题
  2. mysql 报错1042_mysql安装中 starting sever报错1042怎么破啊??求助大佬
  3. 设计模式学习笔记0——概念
  4. Java Web-网页基础-HTML-URL
  5. 分布式光伏补贴_2018年国家光伏并网补贴标准、政策
  6. datax 不识别字段过滤_静电式空气过滤器有什么特点 静电式空气过滤器特点介绍【详解】...
  7. 13日直播预告丨Oracle多套库整合到多租户平台案例分享
  8. 案例解读:Oracle目录由于TFA触发bug导致jdb文件未自动清理引起空间不足
  9. 案例详解:Linux文件系统异常导致数据库文件无法访问
  10. 一文搞懂如何使用Node.js进行TCP网络通信