深入理解ArrayList

简要介绍

  • ArrayList是基于动态数组实现的,其容量能自动增长。
  • ArrayList继承了AbstractList,实现了List,提供了相关的添加、删除、修改、遍历等功能。
  • ArrayList实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速随机访问功能。
  • ArrayList实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
  • ArrayList实现java.io.Serializable接口,支持序列化,能通过序列化去传输。
  • ArrayList中的操作不是线程安全的!一般在单线程中使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList;也可以考虑collections.synchronizedList(List
    l)函数返回一个线程安全的ArrayList类。

源码

ArrayList使用

public static void main(String[] srgs){
        ArrayList<Integer> arr = new ArrayList<Integer>();
        System.out.println("Before add arr size=: "+arr.size());
        arr.add(1);
        arr.add(2);
        arr.add(3);
        arr.add(4);
        arr.add(5);
        System.out.println("After add arr size=: "+arr.size());

        System.out.println("通过for循环遍历");
        for(int i = 0; i<arr.size(); ++i){
            System.out.println(arr.get(i));
        }

        System.out.println("通过迭代器遍历");
        Iterator<Integer> iter = arr.iterator();
        while(iter.hasNext()){
            System.out.println(iter.next());
        }

        System.out.println("通过foreach遍历");
        for(Integer i:arr){
            System.out.println(i);
        }

        arr.remove(2);
        System.out.println("after arr.remove(2): "+arr);

        arr.remove((Object)4);
        System.out.println("after arr.remove((Object)3): "+arr);

        arr.add(2, 3);
        System.out.println("after arr.add(2, 3): "+arr);

        arr.clear();
        System.out.println("after clear: "+arr);

        System.out.println("is empty: "+arr.isEmpty());
   }
/************************   打印如下:********************
Before add arr size=: 0
After add arr size=: 5
通过for循环遍历
1
2
3
4
5
通过迭代器遍历
1
2
3
4
5
通过foreach遍历
1
2
3
4
5
after arr.remove(2): [1, 2, 4, 5]
after arr.remove((Object)3): [1, 2, 5]
after arr.add(2, 3): [1, 2, 3, 5]
after clear: []
is empty: true
*************************************************/

重点总结

1.toArray()的使用
有时候,当我们调用ArrayList中的 toArray(),可能遇到过抛出java.lang.ClassCastException异常的情况,这是由于toArray() 返回的是 Object[] 数组,将 Object[]转换为其它类型(如,将Object[]转换为的Integer[])则会抛出java.lang.ClassCastException异常,因为Java不支持向下转型。
所以一般更常用的是使用另外一种方法进行使用:

T[] toArray(T[] a)

调用toArray(T[] a)返回T[]可通以下方式进行实现:

// toArray用法
// 第一种方式(最常用)
Integer[] integer = arrayList.toArray(new Integer[0]);

// 第二种方式(容易理解)
Integer[] integer1 = new Integer[arrayList.size()];
arrayList.toArray(integer1);

// 抛出异常,java不支持向下转型
//Integer[] integer2 = new Integer[arrayList.size()];
//integer2 = arrayList.toArray();

2.ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低。

3.注意其三个不同的构造方法。无参构造方法构造的ArrayList的容量默认为10;带有Collection参数的构造方法,将Collection转化为数组赋给ArrayList的实现数组elementData。

    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值