为什么需要集合?
答:集合是一个容器,用来存储数据,只能存储引用数据类型;
数组增删操作效率低,数组的长度不能改变,所以数组具有局限性
Collection、Set、List接口的特征是什么?
答:Colletion接口存储元素不唯一、无序的对象
Set接口存储元素唯一、无序的对象
List接口存储元素不唯一、有序的对象
ArrayList集合的特点是什么?
答:ArrayList底层数据结构是数组,删除,添加元素的效率低,按照索引查找元素效率高。ArrayList是List的实现类。
ArrayList_JDK源码分析_1
ArrayList的常用的构造方法有哪些?源码含义是什么?
public ArrayList() {//无参构造,无参构造创建了一个长度为0的object数组
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
Private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList(int initialCapacity) {//有参构造,有参构造是创建了一个初始长度的object数组。
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
}
}
-
- ArrayList扩容易原理是什么?
答:根据添加的元素个数,计算出minCapacity,如果是第一次添加,elementDate为空,执行Math.max(DEFAULT_CAPACITY, minCapacity)得出最小容量,如果最小容量-elementDate的元素个数大于0,则新建一个容量为最小容量的数组。
不是第一次添加,则判断是否minCapacity - elementData.length > 0,不是的话,则不用扩容,如果是大于0则执行grow方法扩容。
- ArrayList_JDK源码分析_2
- ArrayList中的add方法的执行过程是什么?
public void add(int index, E element) { rangeCheckForAdd(index);//检查索引值是否合理 ensureCapacityInternal(size + 1); // 计算容量是否够用 System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; } |
原理是数组拷贝,通过arraycopy进行数组拷贝,从源数组的index位置开始拷贝,拷贝到目标数组的index+1的位置,拷贝size-index个元素(size是源数组的size),再将待添加的元素赋值给目标数组的index位置,最后size++.
-
- ArrayList中set和get的方法的作用及执行过程?
答:get方法作用:获取指定索引位置上的元素值
public E get(int index) { rangeCheck(index); return elementData(index); } @SuppressWarnings("unchecked") E elementData(int index) { return (E) elementData[index]; } |
Set方法作用:在指定索引的位置设置值
public E set(int index, E element) { rangeCheck(index); E oldValue = elementData(index); elementData[index] = element; //将新元素设置到指定位置上 return oldValue; }
@SuppressWarnings("unchecked") E elementData(int index) { return (E) elementData[index]; }
|
LinkedList
底层数据结构是链表
和ArrayList相比,删除添加数据效率高,但根据索引查询的效率低。