作为一个程序员,通常,我们的程序需要根据程序运行时才知道创建多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组只能放同一类型的数据,而且其长度是固定的,那怎么办呢?集合便应运而生了!
而对于集合的相关内容,我通过思维导图整理了一下,分成两个部分,Map和Collection两个部分,来看一下
Map
Collection
因为篇幅原因,只展示Collection的List,这也是在日常开发中应用最多的,或者说在面试过程中被问到最多的一个知识点,因为它可以扩充出来很多其他的知识点
一、ArrayList的底层实现
- ArrayList实现与List、RandomAccess接口,是顺序接口,即元素存放的数据与放进去的顺序相同,允许放入null元素,也支持随机访问
- 底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同
- ArrayList相当于动态数据,其中最重要的两个属性分别是:elementData数组以及siz
二、ArrayList可以实现同步吗
为了追求效率,ArrayList没有实现同步(synchronizd),如果需要逗哥线程并发访问,用户可以手动同步,也可以使用Vector代替。如可以先采用Collections.synchronizedList()方法对其进行包装
三、ArrayList的add()方法
在调用add()方法的时候首先进行扩容校验,将插入的值放在尾部,并将size+1.
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
四、ArrayList的add(index,e)方法
如果调用add(index,e)在指定位置添加的话也是首先扩容校验,接着对数据进行复制,目的是把index位置空出来放本次插入的数据,并将后面的数据向后移动一个位置。
public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! //复制,向后移动 System.arraycopy(elementData, index, elementData, index + 1,