ArrayList集合

Posted 小鹿可可乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList集合相关的知识,希望对你有一定的参考价值。

1.Collection接口

JDK 版本:1.7

1.1 接口方法


2.ArrayList

2.1 特点

1.数据是插入有序的
2、数据是可以重复的
3、可以存储null
4、底层数据结构是数组
5、可以动态扩容的,默认容量是10
6、扩容是按照原大小的1.5倍进行扩容

2.2 方法使用

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ArrayListDemo {
    public static void main(String[] args){
        //创建ArrayList实例研究Collection方法
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        ArrayList<Integer> arrayList1 = new ArrayList<Integer>();
        arrayList1.add(1);
        arrayList1.add(2);
        arrayList1.add(3);
        arrayList1.add(1);

        //添加单个元素 boolean add(E e)
        arrayList.add(2);
        System.out.println("元素个数:"+arrayList.size());

        //批量添加元素 boolean addAll(Collection<? extends E> c)
        arrayList.addAll(arrayList1);
        System.out.println("元素:"+arrayList);

        arrayList1.add(5);

        //获取集合中元素个数 int size()
        arrayList.size();

        //获取元素 通过指定下标获取元素 E get(int index)
        arrayList.get(0);
        System.out.println("0号位置元素:"+arrayList.get(0));

        //删除集合中所有元素 void clear()
        //arrayList.clear();
        //System.out.println("全部删除后:"+arrayList);

        //查询集合中是否包含指定的元素 boolean contains(Object o) true:包含
        boolean b = arrayList.contains(6);

        //查询集合中是否存在指定的子集和对象
        boolean b1 = arrayList1.containsAll(arrayList);
        System.out.println(b1);

        //判断当前集合是否为空 boolean isEmpty() true:为空
        arrayList.isEmpty();

        //删除指定元素(找到第一个符合的元素删除)
        arrayList.remove(Integer.valueOf(1));

        //保留当前集合及参数集合相同的部分,删除当前集合的其他元素 boolean retainAll(Collection<?> c)
        boolean b2 = arrayList.retainAll(arrayList1);

        //遍历集合获取迭代器实例 Iterator<E> iterator()
        Iterator<Integer> iterator =arrayList1.iterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next()+" ");
        }

        //List接口是Collection子接口,继承其所有方法,list也有自己特有方法

        System.out.println();
        //查询指定元素在集合中的位置 int indexOf(Object o)
        int i = arrayList1.indexOf(3);
        System.out.println(i);

        //修改指定位置的元素 E set(int index,E element)
        arrayList1.set(2,666);

        System.out.println();
        //获取集合的子集(前闭后开特点) List<E> subList(int fromIndex,int toIndex)
        List<Integer> list = arrayList1.subList(1,4);

    }


}

2.3 继承关系

ArrayList继承自AbstractList,AbstractList类是抽象类实现自List接口,对接口中通用的方法做了实现,子类可以不用实现,子类如果有特殊需求可以重写对应方法
ArrayList实现接口List、RandomAccess、Cloneable、Serializable
List接口是ArrayList、Linkedlist的接口,定义了集合中大部分方法
RandomAccess接口表明当前类可以随机访问
Cloneable接口表明当前类是可以被克隆
Serializable接口表明当前类是可以支持序列化和反序列化

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

2.4 构造函数

//通过初始容量参数来实例化ArrayList
public ArrayList(int initialCapacity) {
        super();
        //参数校验
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
        //创建指定大小的数组实例
        this.elementData = new Object[initialCapacity];
    }

//无参构造函数
    public ArrayList() {
        super();
        //给定空的数组
        this.elementData = EMPTY_ELEMENTDATA;
    }


   //通过集合实例来实例化ArrayList
    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            //完成数据拷贝
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

2.6 属性信息

通过elementData属性了解:ArrayList底层数据存储在数组中

//存储元素位置
private transient Object[] elementData;
//存储元素个数
private int size;
//父类提供的属性 记录集合数据变更版本值(新增、修改、删除) ,和业务无关
private int modcount  修改版本号

2.7 默认值或默认属性

//默认的数组初始容量
private static final int DEFAULT_CAPACITY = 10;
//空数组实例
private static final Object[] EMPTY_ELEMENTDATA = {};

2.8 扩容机制

//扩容大小  
int newCapacity = oldCapacity + (oldCapacity >> 1);

arraylist集合扩容时按照1.5倍进行扩容

2.9 add(T v)

public void add(int index, E element) 添加数据;在指定位置添加数据,需要保证index合法,并将index之后的数据后移以为,然后插入新值
add过程:
1、如果存储数组为空,获取默认的大小值是10
2、如果需要大小超过数组大小、考虑扩容,按照原数组大小的1.5倍扩容
3、通过创建新数组,将元素组大小拷贝到新数组中
4、将新增元素插入最后的size位置并对size进行加1操作

3.问题:ArrayList和数组区别?

  • ArrayList底层封装数组,提供了丰富API操作
  • 存储数据:ArrayList存储的是自定义对象,基本包装类型 数组可以存放自定义类型,包装类型、基类类型(int)
  • ArrayList是可以自动扩容的 ,数组不能自动扩容

今天也要好好学习呀~

以上是关于ArrayList集合的主要内容,如果未能解决你的问题,请参考以下文章

Java集合ArrayList源代码详细解析

获取 Intent 片段上的 Serializable ArrayList

1-自己动手编写ArrayList集合

代码片段 - Golang 实现集合操作

laravel特殊功能代码片段集合

定义一个ArrayList集合对象