Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap

ArrayList 是List<T> 下,java的自实现类之一,属于线程非安全的类型,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类,还可以考虑使用Vector这个类型。

  ArrayList的内部存储结构是一个可扩展的动态数组(其实并没有动态扩展,只是一个普通的数组,当数组被填充满时,再申请新的数组结构,然后把值拷过去,新的大小为1.5*n+1 )。

       private transient Object[] elementData;  

ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Cloneable接口,能被克隆。

   每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量,这点前边的括号内已经有提过。

  另外 ArrayList 还采用了 Fail-Fast机制: 通过记录modCount参数来实现。在面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。

下面介绍ArrayList 的构造函数,自带三种构造函数:

(1)可以构造一个默认初始容量为10的空列表  public ArrayList()

(2)构造一个指定初始容量的空列表   public ArrayList(int initialCapacity)

  (3)构造一个包含指定collection的元素的列表(在ArrayList中的顺序为Collection中迭代的顺序)public ArrayList(Collection<? extends E> c)

 

下面介绍常用的API

  1、增

       public E set(int index, E element)//在指定的位置用新节点替换掉原来的旧结点,同时返回旧结点

       public boolean add(E e)//给队列添加一个新的元素,这个元素将会被放置在队列的最末端

       public void add(int index, E element) //在指定位置插入一个元素,原有元素将会依次被推后一位,注意index不能大于队列的当前长度

       public boolean addAll(Collection<? extends E> c)//以collection迭代器的顺序,依次把collection中的元素放置在队列的末尾

       public boolean addAll(int index, Collection<? extends E> c)//以collection迭代器的顺序,依次
//把collection中的元素放置在队列的指定索引上,原有元素一次推后

另外还可以将原有队列转换为数组形式

public Object[] toArray() 

  2、删

public E remove(int index)//删除指定位置的元素

public boolean remove(Object o)//删除第一个等于 obj的元素(用equals方法判断)

此外还可以采用如下形式删除:

 protected void removeRange(int fromIndex, int toIndex)

这个方法有以下几点注意
1、方法时protected 类型的,2、将fromindex 到toindex这段的结点都移除掉,后续的结点跟进。3、队列的长度变为index ,也就是toindex位置之后的元素也都将被移除。

也可以使用这种方法来实现类似RangeMove的形式

         ArrayList<Integer> ints = new ArrayList<Integer>(Arrays.asList(0, 1, 2,3, 4, 5, 6));
ints.subList(2, 4).clear();

  3、改

(1)修改队列的最大容积

前文中有提到过,当数组的容积满了之后,我们会重新设定数组的容积,以满足继续添加的需要

数组扩容通过一个公开的方法ensureCapacity(int minCapacity)来实现,我们也可以手动调用这个方法来增加容积

当设定的最小容积小于 原有容积的1.5倍之后,我们会按照1.5倍的旧容积来替代,否则将以参数的大小来替代,生成新的数组。

由于设定容积后,会调用一次数组的拷贝方法,此处非常耗费性能,所以最好在尽可能早的时候(元素少时),预判出数组的大小,从而防止大量的新增元素后,不断的调用扩大容积和复制的方法。

public void ensureCapacity(int minCapacity)

(2)有时,ArrayList的大小刚刚好是,内部动态数组的一半多一点点,接近半数的数组元素被闲置。或者我们一开始设置的空间过大时,可以采用如下方法来修正 动态数组的大小

public void trimToSize()

  4、查

 public E get(int index)// 返回此列表中指定位置上的元素。

参考文献:http://zhangshixi.iteye.com/blog/674856

http://www.cnblogs.com/ITtangtang/p/3948555.html

Java 之 List<T> 接口的实现:ArrayList的更多相关文章

  1. Java 中的集合接口——List、Set、Map

    Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...

  2. Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  3. Java学习之List接口

    List接口 List接口的定义如下: public interface List<E>extends Collection<E> 可以发现List接口时Collection接 ...

  4. java中级——集合框架【1】-ArrayList

    集合框架----ArrayList 引子:我们先来看看传统数组的用法 写一个Hero对象类 package cn.jse.t1; public class Hero { public String n ...

  5. Java基础-Collection子接口之Set接口

    Java基础-Collection子接口之Set接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学习Collection接口时,记得Collection中可以存放重复元素,也可 ...

  6. Java基础-Collection子接口之List接口

    Java基础-Collection子接口之List接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们掌握了Collection接口的使用后,再来看看Collection接口中 ...

  7. 做Webservice时报错java.util.List是接口, 而 JAXB 无法处理接口。

    Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExc ...

  8. Java中的List接口特有的方法

    import java.util.ArrayList; import java.util.List; /* List接口中特有方法: 添加 add(int index, E element) addA ...

  9. Java调用Http/Https接口(5)--HttpAsyncClient调用Http/Https接口

    HttpAsyncClient是HttpClient的异步版本,提供异步调用的api.文中所使用到的软件版本:Java 1.8.0_191.HttpClient 4.1.4. 1.服务端 参见Java ...

  10. Java调用Http/Https接口(4)--HttpClient调用Http/Https接口

    HttpClient是Apache HttpComponents项目下的一个组件,是Commons-HttpClient的升级版,两者api调用写法也很类似.文中所使用到的软件版本:Java 1.8. ...

随机推荐

  1. 【Linux】df命令 ,查看磁盘容量。

    Oracle 导库时,失败,原因为磁盘满了, 记录下查看磁盘容量的指令 1.命令格式: df [选项] [文件] -a 全部文件系统列表 -h 方便阅读方式显示 -H 等于“-h”,但是计算式,1K= ...

  2. asp.net三层架构详解

    一.数据库 /*==============================================================*/ /* DBMS name:      Microsof ...

  3. spring task 配置

    Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下.    对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任 ...

  4. gitlab 创建SSH Keys 报500错

    gitlab 创建SSH Keys 报500错 看了一下日志 root@322323:/home/git/gitlab/log# cat production.log Errno::ENOMEM (C ...

  5. ZeroMQ接口函数之 :zmq_msg_more - 指出是不是还有更多的消息部分可以接收

    ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_msg_more zmq_msg_more(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...

  6. 问题(the question)

    I want to know: 1. 软件开发最主要的目的 是什么? 2. 软件开发是否同样需要模,和架构? 3.软件开发与其他程序的需求分析是否相似,有什么不同之处? 4.软件开发最常用的计算机语言 ...

  7. 20145205《Java程序设计》第四次实验:Android环境搭建

    实验内容 1.搭建Android环境 2.运行Android 3.修改代码,能输出学号 实验步骤 搭建Android环境 安装Android,核心是配置JDK.SDK 运行Android 总结感想: ...

  8. matlab函数大全

    Matlab 图像处理相关函数命令大全 一.通用函数: colorbar  显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ col ...

  9. PHP的变量

    1.可变变量 一个变量的变量名可以动态地设置和使用.一个普通的变量通过声明来设置,而一个可变变量获取了一个普通变量的值作为这个可变变量的变量名,如下所示: <?php $hi = "h ...

  10. 学术作为一种志业 马克斯·韦伯Max Weber。

    注:原内容来自优酷自频带:梁文道 一千零一夜 学术作为一种志业马克斯·韦伯Max Weber. 韦伯是社会学的三大创始人之一.另外两个,一个是法国的涂尔干,还有一个就是我们中国人都知道的马克思.在其& ...