zoukankan      html  css  js  c++  java
  • ArrayList数组列表

    ArrayList数组列表

    Collection接口和List接口的区别

    • List接口扩充了Collection接口,添加了索引相关的方法。
    • code example

      Object get(int index)
      Object set(int index,Object element)
      int indexOf(Object elem)
      void add(int index,Object element)
      Object remove(int index)
    • List接口中的大多数方法是基于索引的。

    ArrayList类

    1、可以看成一维数组的改良版,支持随机访问,ArrayList对象的大小自动调整。 2、ArrayList对象中每个元素的相对位置都是利用索引表示,索引范围0~n-1 3、给定一个索引,访问这个索引位置上的元素时间是常数级别。 4、删除元素,最坏情况是O(n-index),所以删除靠后面的元素花费的时间越少。 5、插入元素,最坏情况是O(n-index),所以插入末尾操作花费时间越少。

    源码方法分析(具体可以看java documnet)

     

    public ArrayList Object(int initialCapacity);
    指定初始化容量的大小

     

     

    public boolean add(Object o);
    在末尾插入元素

     

     

    public int size();
    返回容器的有效元素个数

     

    ......

    ArrayList对象的可串行化

    ObjectOutputStream

    ArrayList对象的可克隆性

    实现了Clonable接口 方法:

     

    public Object clone();

     

    复制的是ArrayList对象中元素的引用,并不是对象,所以称为“浅复制”。

     

    public class ArrayListDemo {
        
        public static void main(String[] args) {
            ArrayList<Integer> list=new ArrayList<Integer>(3);
            list.add(1);
            list.add(2);
            System.out.println("list size="+list.size());
            ArrayList<Integer> temp=(ArrayList<Integer>) list.clone();
            System.out.println("temp size="+temp.size());
            //www.90168.org不改变克隆对象
            list.add(3);
            System.out.println("list result size="+list.size());
            System.out.println("temp result size="+temp.size());
        }
    
    }
    
    /*
    *list size=2
    *temp size=2
    *list result size=3
    *temp result size=2
    */

     

    ArrayList的扩充,分摊时间

    1、数组一般扩充50% 2、add()方法将newCapacity设置成(oldCapacity*3)/2+1并没有实际的意义,只是为了时间和空间的平衡。

    Fail-First迭代器

    1、继承了AbstractList的modCount字段 add()、remove()modCount加1 一旦next()方法激活,就不能修改ArrayList。

     

    public class ArrayListDemo2 {
        
        public static void main(String[] args) {
            ArrayList<Integer> list=new ArrayList<Integer>();
            list.add(2);
            list.add(3);
            
            Iterator it=list.iterator();
            while(it.hasNext()){
                int ele=(int) it.next();
                //进行修改,会抛异常
                list.add(1, 4);
                System.out.println(ele);
            }
        }
    
    }

     

    与Vector类的区别

    1、Vector类也是基于数组实现 2、Vector类的方法大都是同步的。

  • 相关阅读:
    test deploy
    SpringBoot+Spring Session+Redis实现Session共享及踩坑记录
    登录接口取cookie
    pycharm设置自动调节字体大小
    ClickHouse高可用集群
    clickhouse 常用命令(三)
    clickHouse常用命令(一)
    ClickHouse表引擎
    clickhouse基本数据类型
    手写滚动条设计----直接粘贴
  • 原文地址:https://www.cnblogs.com/tianshifu/p/6165775.html
Copyright © 2011-2022 走看看