博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 之 List<T> 接口的实现:ArrayList
阅读量:5121 次
发布时间:2019-06-13

本文共 2560 字,大约阅读时间需要 8 分钟。

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
c)//以collection迭代器的顺序,依次把collection中的元素放置在队列的末尾 public boolean addAll(int index, Collection
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
ints = new ArrayList
(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)// 返回此列表中指定位置上的元素。

参考文献:

 

转载于:https://www.cnblogs.com/jilodream/p/4240441.html

你可能感兴趣的文章
数据库3
查看>>
存储分类
查看>>
下一代操作系统与软件
查看>>
【iOS越狱开发】如何将应用打包成.ipa文件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Yii2 Lesson - 03 Forms in Yii
查看>>
Python IO模型
查看>>
Ugly Windows
查看>>
DataGridView的行的字体颜色变化
查看>>
Java再学习——关于ConcurrentHashMap
查看>>
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Day19内容回顾
查看>>
第七次作业
查看>>
SpringBoot项目打包
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
《QQ欢乐斗地主》山寨版
查看>>
文件流的使用以及序列化和反序列化的方法使用
查看>>
Android-多线程AsyncTask
查看>>