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.5 属性信息

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

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

2.6 默认值或默认属性

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

2.7 扩容机制

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

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

2.8 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是可以自动扩容的 ,数组不能自动扩容

今天也要好好学习呀~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹿可可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值