ArrayList底层是由数组实现的,通过内部封装,变成一个动态数组,自动扩容为原内存的1.5倍。
ArrayList添加的元素是有序,可重复,有索引,是顺序存储的线性表数据结构 ,因此数据的查询效率高。
package testWork;
public class MyArrayList<E> {
//默认数组长度
private static final int default_capacity=10;
private int size=0;
public E[] elements;
public MyArrayList(){
this(default_capacity);
}
public MyArrayList(int capacity) {
elements= (E[])(new Object[capacity]);
}
public void add(E element){
add(size,element);
}
public void add(int index,E element){
if(index<0){
throw new IndexOutOfBoundsException("数组越界");
}
capacityCheck();
for (int i = size; i >index; i--) {
elements[i]=elements[i-1];
}
elements[index]=element;
size++;
}
/**
* 内存扩容
*
*/
public void capacityCheck(){
if(size<elements.length){
return;
}
double newCapacity= size*1.5;
E[] newElements=(E[])(new Object[(int)newCapacity]);
for (int i = 0; i < size; i++) {
newElements[i]=elements[i];
}
elements=newElements;
}
/**
* 移除下标为index的数据,并返回该数据
* @param index
* @return
*/
public E remove(int index){
if(index<0||index>=size){
throw new IndexOutOfBoundsException("数组越界");
}
E removeDate=elements[index];
for (int i = index; i <size-1 ; i++) {
elements[i]=elements[i+1];
}
elements[--size]=null;
return removeDate;
}
/**
* 修改下标为index的数据为element
* @param index
* @param element
* @return
*/
public E set(int index,E element){
E updateDate=elements[index];
elements[index]=element;
return updateDate;
}
public E get(int index){
if(index<0||index>=size){
throw new IndexOutOfBoundsException("数组越界");
}
return elements[index];
}
public int size(){
return elements.length;
}
public void clear(){
for (int i = 0; i < size; i++) {
elements[i]=null;
}
size=0;
}
@Override
public String toString() {
StringBuffer stringBuffer=new StringBuffer("size=").append(size).append("[");
for (int i = 0; i < size; i++) {
if (i==size-1){
stringBuffer.append(elements[i]);
}else {
stringBuffer.append(elements[i]).append(";");
}
}
stringBuffer.append("]");
return stringBuffer.toString();
}
}
package testWork;
public class testWork {
public static void main(String[] args) {
MyArrayList<String> list = new MyArrayList<String>();
for (int i = 0; i <18 ; i++) {
list.add(i+"");
}
System.out.println(list.toString());
list.add(2,"左");
System.out.println(list.toString());
String remove = list.remove(2);
System.out.println(list.toString());
System.out.println(remove);
list.clear();
System.out.println(list.toString());
}
}