ArrayList 底层以一个transient 线性数组来存储数据,它提供了无参构造方法,和有参构造方法,用户可以通过有参构造方法来初始化长度。如果不传参数,则默认调用无参构造器,数组默认长度为10。

关于数组长度的问题,ArrayList专门提供了一个方法来管理,以避免数组越界。如下:

方法参数为将要达到的长度(newLen),将它与数组实际使用的长度进行比较(factLen),如果newLen>factLen那么将要拓展数组长度。拓展的量为(factLen*3)/2+1(实际上这种情况下,数组的使用长度和开辟长度是相等的),为什么是这种算法?实际上它是在原来的基础上增加50%+1,之所以要加1是因为,执行这个方法的时候通常是需要往数组里面添加数据,数组需要为当前数据保留一个位置,从而保证数组预留位置为原来的1.5倍.

这个方法在何时执行呢,搜索发现,在四个方法执行,分别是add(E),add(index,E),addAll(c),add(index,c),也就只要需要往数组里面添加数据,都需要对数组索引及长度进行判断,以避免数组越界。

而且可以发现,当数组长度重新拓展以后,会把当前数组的数组复制到新长度的数组。这将是非常影响效率的操作。

ArrayList的get()和add()方法都比较简单,首先都需要进行数组越界的考量判断,然后通过索引得到相应的值,值得注意的一点是,add(index ,e)这个方法,做了两个判断,索引小于0和大于当前实际使用值,都是不合法的。比如,初始化后数组长度为10,里面存了5条数据,当前最大使用的索引为4,此时调用add(5,obj),这是会抛出数组越界。这是为ArrarList为了保证分配连续的内存空间。

ArrayList的remove方法,如果传的是一个索引值,首先判断索引是否越界,然后执行删除,并返回删除值。如果传的是一个对象,那么首先会判断对象是否为空,如果为空,遍历数组,找到则执行类似于remove(index)的方法,区别在于没有返回值,如此可见,ArrayList是允许空值的;如果不为空,同上。

既然它可以为空,那么可不可以覆盖掉它,根据前面所说,索引小于0和大于当前实际使用值,都是不合法的,会不会抛异常呢?测试了下,发现不会,新的值占用了原先的位置,但数组实际所使用的长度不变,证明与其说是覆盖,不如说是把原值挤走了。为NULL的值优先级不高。而且,在GC工作的时候可能被回收。如图:

需要注意的是,ArrayList在删除某条数据所做的处理,仅仅只是将该处索引的值设为NULL。这时整个数组的实际使用长度是没有做出改变的,如果刚好逼进临界点,在下次增加时会拓展长度。

只有在clear()方法的时候,才会对此做出处理。

说说两个重要的属性,transient ,modCount,ArrayLIst里保存数据的数组修饰符为transient,表示它不作为序列化的一部分,在进行读写操作的时候需要调用方法。readObject,writeObject,而modCount负责记录ArrayList里操作或者叫做数组改变的次数,在进行读写操作的时候,用modCount进行标记,如果值改变,表明此时另外的线程在对集合进行修改,此时抛出异常ConcurrentModificationException()。

结属说说用得较少的两个方法:

有一个set(index,e)方法,它会用新值覆盖旧值,并返回被覆盖掉的值。

还有一个listIndexOf()方法,这个方法返回相应元素在数组里面最后出现的索引,没有返回-1。遍历,从最后一位开始。

或许你不知道:ArrayList的更多相关文章

  1. 或许你不知道(2):LinkedList

    一,基本的存储结构及数据存取 LinkedList与ArrayList同属List的范畴,ArrayList实现了RandomAccess接口,通过索引随机访问效率较高,而LinkedList提供了直 ...

  2. Java中List接口重要实现类一ArrayList

    1.java.util.ArrayList 集合数据存储的结构是数组结构.元素查找快,而增删就比较慢 所以如果要查询数据,遍历数据,ArrayList是最常用的集合 2.ArrayList是不同步的, ...

  3. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

  4. Retrofit2.0源码解析

    欢迎访问我的个人博客 ,原文链接:http://wensibo.net/2017/09/05/retrofit/ ,未经允许不得转载! 今天是九月的第四天了,学校也正式开学,趁着大学最后一年的这大好时 ...

  5. 如何深入理解Java泛型

    一.泛型的作用与定义 1.1泛型的作用 使用泛型能写出更加灵活通用的代码泛型的设计主要参照了C++的模板,旨在能让人写出更加通用化,更加灵活的代码.模板/泛型代码,就好像做雕塑时的模板,有了模板,需要 ...

  6. 一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考

    事情是如何发生的 最近干了件事情,发现了 underscore 源码的一个 bug.这件事本身并没有什么可说的,但是过程值得我们深思,记录如下,各位看官仁者见仁智者见智. 平时有浏览园区首页文章的习惯 ...

  7. Java程序员们最常犯的10个错误

    将数组转化为一个列表时,程序员们经常这样做: List<String> list = Arrays.asList(arr); Arrays.asList()会返回一个ArrayList对象 ...

  8. [转]Java程序员们最常犯的10个错误

    1.将数组转化为列表 将数组转化为一个列表时,程序员们经常这样做: List<String> list = Arrays.asList(arr); Arrays.asList()会返回一个 ...

  9. 《FreeSWITCH: VoIP实战》:SIP 模块 - mod_sofia

    SIP 模块是 FreeSWITCH 的主要模块,所以,值得拿出专门一章来讲解. 在前几章时里,你肯定见过几次 sofia 这个词,只是或许还不知道是什么意思.是这样的,Sofia-SIP 是由诺基亚 ...

随机推荐

  1. myeclipse关闭properties文件自动转义

    1.如图,源代码是这样: 2.保存后重新打开变成这样: 3.解决方法如下:

  2. Js 访问Aspnet后台页面变量

    一.普通WebForm页面 <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server ...

  3. linux安装桌面环境(GNOME)VNC连接Linux

    1.安装Gnome桌面 这里是使用的脚本安装.代码如下:  加附件 #!/bin/sh #This script is FREE and written by www.vpsyou.com   # i ...

  4. What is the difference between differed processing mode and interactive mode?

     Every time you access and navigate through the fields on a page in PeopleSoft there are events such ...

  5. 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的

    异常原因: 1.写了一个死循环,这个可能性最大. 2.进行大数据量的运算,导致假死状况. 解决办法:Debug -> Exceptions -> Managed Debug Assista ...

  6. 【转】准确理解CSS clear:left/right的含义及实际用途

    零.说点什么 好久没更新了.并不是在折腾什么大作,而是广度学习与实践中,加上婚礼等诸多大事,所以产出较少. 今天这篇也只是小作,博客是自己很好的学习工具,只要我学习不止,博客也会不断更新的. 我们平时 ...

  7. php 数组排序代码

    php对数组排序代码.   <?phpclass='pingjiaF' frameborder='0' src='http://www.jbxue.com' scrolling='no'> ...

  8. c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...

  9. MySQL5.7重置root密码

    版本更新 缘故,好多网上的教程都不适用了,甚至连官网的文档也不是能够顺利操作的. 如果 MySQL 正在运行,首先杀之: killall -TERM mysqld. 运行mysqld_safe --s ...

  10. uglifyjs压缩JS

    一.故事总有其背景 年末将至,很多闲适的时间,于是刷刷微博,接触各种纷杂的信息——美其名曰“学习”.运气不错,遇到了一个新名词,uglifyjs. 据说是用来压缩JS文件的,据说还能优化JS,据说是基 ...