zoukankan      html  css  js  c++  java
  • ArrayList详解,底层是数组,实现Serializable接口

    一、对于ArrayList需要掌握的七点内容

    ArrayList的创建:即构造器
    往ArrayList中添加对象:即add(E)方法
    获取ArrayList中的单个对象:即get(int index)方法
    删除ArrayList中的对象:即remove(E)方法
    遍历ArrayList中的对象:即iterator,在实际中更常用的是增强型的for循环去做遍历
    判断对象是否存在于ArrayList中:contain(E)
    ArrayList中对象的排序:主要取决于所采取的排序算法(以后讲)
    二、源码分析

    2.1、ArrayList的创建(常见的两种方式)

    List<String> strList = new ArrayList<String>();
    List<String> strList2 = new ArrayList<String>(2);
    ArrayList源代码:

    基本属性:

    //对象数组:ArrayList的底层数据结构
    private transient Object[] elementData;
    //elementData中已存放的元素的个数,注意:不是elementData的容量
    private int size;
    注意:

    transient关键字的作用:在采用Java默认的序列化机制的时候,被该关键字修饰的属性不会被序列化。
    ArrayList类实现了java.io.Serializable接口,即采用了Java默认的序列化机制
    上面的elementData属性采用了transient来修饰,表明其不使用Java默认的序列化机制来实例化,但是该属性是ArrayList的底层数据结构,在网络传输中一定需要将其序列化,之后使用的时候还需要反序列化,那不采用Java默认的序列化机制,那采用什么呢?直接翻到源码的最下边有两个方法,发现ArrayList自己实现了序列化和反序列化的方法
    View Code
    构造器:


    /**
    * 创建一个容量为initialCapacity的空的(size==0)对象数组
    */
    public ArrayList(int initialCapacity) {
    super();//即父类protected AbstractList() {}
    if (initialCapacity < 0)
    throw new IllegalArgumentException("Illegal Capacity:" + initialCapacity);
    this.elementData = new Object[initialCapacity];
    }

    /**
    * 默认初始化一个容量为10的对象数组
    */
    public ArrayList() {
    this(10);//即上边的public ArrayList(int initialCapacity){}构造器
    }

    在我们执行new ArrayList<String>()时,会调用上边的无参构造器,创造一个容量为10的对象数组。

    在我们执行new ArrayList<String>(2)时,会调用上边的public ArrayList(int initialCapacity),创造一个容量为2的对象数组。

    注意:

    上边有参构造器的super()方法是ArrayList父类AbstractList的构造方法,这个构造方法如下,是一个空构造方法:
    protected AbstractList() {
    }
    在实际使用中,如果我们能对所需的ArrayList的大小进行判断,有两个好处:
    节省内存空间(eg.我们只需要放置两个元素到数组,new ArrayList<String>(2))
    避免数组扩容(下边会讲)引起的效率下降(eg.我们只需要放置大约37个元素到数组,new ArrayList<String>(40))

    2.2、往ArrayList中添加对象(常见的两个方法add(E)和addAll(Collection<? extends E> c))

  • 相关阅读:
    UEditor 编辑模板
    Task ProgressBar模拟现实完成后显示TextBox
    Java Lambda map返回部分属性
    Socket编程
    字节流和字符流
    File类
    volatile的作用和原理
    Java四种引用类型
    ThreadLocal
    孤儿进程和僵尸进程
  • 原文地址:https://www.cnblogs.com/mark5/p/11188167.html
Copyright © 2011-2022 走看看