JAVA JDK中List接口下面有两个实现类,分别是ArrayList和LinkedList。其中,ArrayList实现了随机访问的接口,LinkedList实现了Quene的接口。ArrayList是基于数据实现的list,而LinkedList是基于链表实现的list。所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性。
问题一:关于数组的动态扩容以及增删改查
我是仿照JDK源码,实现了一下两个功能:
1、实现一个支持动态扩容的数组
2、实现一个大小固定的有序数组,支持动态增删改操作
package codingTest;
public class expandArrayList {
private Object[] elementData;//数组
private int size;
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
//1、数组扩容和数据的拷贝
private void ensureCapacity() {
if(size == elementData.length) {
Object[] newArray = new Object[(size+1)*2];
// System.arraycopy(elementData, 0, newArray, 0, elementData.length);//老数组copy到新数组这个位置
for(int i = 0; i < elementData.length; i++) {
newArray[i] = elementData[i];
}
elementData = newArray;
}
}
//2、实现一个大小固定的有序数组,支持动态增删改操作
//准备一个空构造器
public expandArrayList() {
this(10);//默认数组的长度是10
}
//准备一个带参构造器
public expandArrayList(int initalCapacity) {
if(initalCapacity < 0) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
elementData = new Object[initalCapacity];
}
//获取指定位置的元素
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
//改动指定的对象
public Object set(int index, Object obj) {
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return oldValue;
}
//删除指定的位置上的数
public void remove(int index) {
rangeCheck(index);
int numMoved = size - index - 1;
if(numMoved > 0) {
System.arraycopy(elementData, index+1, elementData, index, numMoved);
}
elementData[--size] = null;
}
//删除指定的对象
public void remove(Object obj) {
for(int i = 0; i < size; i++) {
if(get(i).equals(obj)) {//底层调用的是equals方法,而非==
remove(i);
}
}
}
//在数组末尾增加元素
public void add(Object obj) {
ensureCapacity();
elementData[size] = obj;
size++;
}
//插入指定的对象
public void insert(int index