• [Java] List / ArrayList


    在阅读 List / ArrayList 源代码过程中,做了下面的笔记。 LinkedList 的笔记较多,放到了另一篇博文 LinkedList / Queue- 源代码学习笔记

    List

    List 是一个接口,继承自 Collection 接口。接口是对功能的定义,没有具体实现。List 接口有以下几个特点

    1. 可以存在重复的元素。这点和 Set 是不一样的,Set 接口不允许重复的元素出现。

    2. 有四个根据下标访问的方法 : get(int), set(int, E), add(int, E), remove(int).

    3. 提供特殊的 Iterator —— ListIterator 。ListIterator 迭代器允许在遍历元素过程中插入元素、替换元素,以及双向遍历。ListIterator 特性用得少,一般使用 Iterator 足够。

    4. toArray() 方法返回的是 List 元素的副本,对副本进行操作,不会影响原来的 List 。

    ArrayList

    1. ArrayList 是 List 接口的一个实现,是一个基于可变大小的 Array 的 List 实现。

    2. Array 是大小固定的数据结构, ArrayList 通过申请新的 Array 空间并将就的数据复制到新的 Array 上,来实现内置的 Array 大小可变。

    3. 由于基于 Array,所以仅通过下标访问并不改变结构的 get(int), set(int, E) 可以在常量时间下完成。add 方法平均情况下是常量时间复杂度,即添加 n 个元素需要时间为 O(n) 。add(int) 是在末尾追加,除了需要扩大内置 Array 外,添加效率很快;add(int, E) 在中间插入,每次都需要对插入点后面的所有元素往后移移位,效率慢一些。

    4. iterator 采用 fail-fast 设计思路。在 iterator 由 iterator() 或 listIterator() 返回后,如果绕过 iterator 的 remove 和 add ,对 List 进行结构性变动,iterator 就会抛出 ConcurrentModificationException 异常。fail-fast 一般体现在并发情况下,在单线程情况下也可以重现,如下面方法被执行时,会抛出 ConcurrentModificationException 指向第 14 行代码。

     1     public static void main(){
     2         List<String> list = new ArrayList<>();
     3         
     4         list.add("aa");
     5         list.add("bb");
     6     
     7         Iterator<String> iter = list.iterator();
     8         if (iter.hasNext()){
     9             System.out.println(iter.next());
    10         }
    11         
    12         list.add("dd");
    13         if (iter.hasNext()){
    14             System.out.println(iter.next());
    15         }
    16     }

    5. 声明实现了 RandomAccess 接口。RandomAccess 是一个标记接口,也就是没有任何成员方法、成员变量的声明,仅仅表示拥有随机访问的属性。随机访问有利于一些算法的性能优化。在泛型算法实现中,先通过 instanceof 来判断 List 是否有随机访问的属性,然后选择更合适的算法实现。

    Jdk 版本: jdk1.8.0_31.jdk

  • 相关阅读:
    IIS的FTP出错: 451 No mapping for the unicode character exists in the target multibyte code page
    silverlight中AES加密RijndaelManaged的使用
    ManualResetEvent详解
    Silverlight如何与JS相互调用
    SQL Server 2008备份策略设计
    mysql 服务无法启动
    Silverlight Resource
    TCP 烟囱卸载
    .net程序 混淆、强签名、加密
    开源客户关系管理系统SplendidCRM下的二次开发
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/5652062.html
Copyright © 2020-2023  润新知