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是可以自动扩容的 ,数组不能自动扩容
今天也要好好学习呀~