继承实现关系
Arraylist就是一个可以动态扩容的容器,属于集合类的一种,要追根溯源的话它是间接实现了Collection接口,下面我画一下它的结构图
类定义
ArrayList类继承自抽象类AbstractList,同时实现了List和Collection接口,进入源码我们可以看到它的类定义
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
数据存储结构
transient Object[] elementData;
看到源码中我们可以知道,它的底层其实是一个对象数组,我们传进去的对象都会被存放到这个数组当中去
构造器初始化方式
1.指定数组大小
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);
}
}
这是它的构造器之一,传入一个int类型的数据,然后编译器就根据指定的大小创建相应大小的数组
ArrayList A=new ArrayList(10);
像这样既可以给它赋一个初值大小,当然后面根据加入元素的个数数组还会自动的扩容
2.无参构造器
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
如果我们在创建对象时什么也不写,会给数组分配一个默认大小的空间即10,数组内容为空
ArrayList A=new ArrayList();//其中的数组大小默认为10
3.传入ArrayList对象初始化
/**
* Constructs a list containing the elements of the specified
* collection, in the order they are returned by the collection's
* iterator.
*
* @param c the collection whose elements are to be placed into this list
* @throws NullPointerException if the specified collection is null
*/
public ArrayList(Collection<? extends E> c) {
Object[] a = c.toArray();
if ((size = a.length) != 0) {
if (c.getClass() == ArrayList.class) {
elementData = a;
} else {
elementData = Arrays.copyOf(a, size, Object[].class);
}
} else {
// replace with empty array.
elementData = EMPTY_ELEMENTDATA;
}
}
传入一个ArrayList对象,系统会将传入的对象中的数据拷贝到新创建的数组中去,相当于拷贝一份参数中的对象
ArrayList a1=new ArrayList();
ArrayList a2=new ArrayList(a1);
类似这样,当我们想要复制一份原对象时可以这样使用
类中的常用方法
1.添加元素
(1)public boolean add(E e)
对于这个方法,我们直接使用对象调用方法,括号中传入想要插入的元素即可
ArrayList a1=new ArrayList();
a1.add(1);//默认插入到数组末尾
这样直接传入元素的方式系统会默认插入到数组的末尾
(2)public void add(int index, E element)
对于这个方法,我们可以指定要插入到数组中的哪个位置,当然这个index不能超出数组目前的元素个数,比如目前数组中有5个元素,那么最大index为5,即插入到最后,我们插入位置及以后的元素都会向后顺延一位
ArrayList a1=new ArrayList();
a1.add(1);
a1.add(1,2);//插入到数组中下标为1的位置
像上面这样使用输出a1的结果是 1 2
2.删除元素
(1)public E remove(int index)
传入一个下标,删除指定下标处的元素
a1.remove(0);
比如这样就是删除a1中第一个元素
(2)public boolean remove(Object o)
传入要删除的对象,删除指定的对象
3.修改元素
public E set(int index, E element)
传入下标和新对象,将指定下标处的元素修改为传入的新对象
4.size()
返回对象中的元素数量
5.isEmpty()
判断对象元素是否为空,为空则返回true,否则返回false
6.indexOf(Object obj)
传入一个对象,返回数组中该对象第一次出现的位置,若找不到返回-1
7.lastIndexOf(Object obj)
传入一个对象,返回数组中该对象最后一次出现的位置,若找不到返回-1
好了以上是一些常用的方法,当然ArrayList还有一些非常使用的方法比如sort等,需要用到朋友去别处搜索把这里不在展开讲了。
总结
集合其实就是更方便的数组,我们在使用时不需要考虑它的大小,只需要调用类的接口实现就可以了,方便我们开发需要的功能,不必在细节上犯难,这是它的好处。
但是还是推荐有兴趣的小伙伴去看一下它的源码,它的底层代码设计的非常巧妙。
后面我会继续出一些集合类的结构梳理,如LinkedList、Vector还有Map的一些类,如果觉得本期内容写的还不错希望可以给我点个赞