ArrayList基础知识
底层实现
ArrayList是接口List的一个子类实现。ArrayList底层是用数组实现的存储,其特点是查询效率高、增删效率低、线程不安全。
数组长度是有限的,但ArrayList是可以存放任意数量的对象,长度不受限制。因为它采用了数组扩容的机制实现的,其实就是在对数组进行操作前,判断数组长度是否足够,不够就进行扩容。
内部方法
由于ArrayList是接口List的一个子类实现,所以ArrayList实现了List的所有抽象方法。
具体请参考:List接口基础知识
自定义ArrayList
/**
* 自定义实现一个ArrayList
* @author dxt
*
*/
public class MyArrayList<E> {
private Object[] elements;
private int size; // 数组元素当前个数
private static final int DEFALT_CAPACITY = 10;
public MyArrayList(){
super();
elements = new Object[DEFALT_CAPACITY];
}
public MyArrayList(int capacity){
if(capacity < 0){
throw new RuntimeException("容量不合法:"+capacity);
}else if(capacity < 0){
elements = new Object[DEFALT_CAPACITY];
}else{
elements = new Object[capacity];
}
}
/**
* 向数组内添加元素
* @param obj
*/
public void add(E obj){
if(size == elements.length){
//进行扩容
Object[] newArray = new Object[elements.length + (elements.length>>1)];
System.arraycopy(elements, 0, newArray, 0, size);
elements = newArray;
}
elements[size++] = obj;
}
/**
* 获取索引index处的元素
* @param index
* @return
*/
public E get(int index){
checkRange(index);
return (E)elements[index];
}
/**
* 设置索引index处的元素为element
* @param element
* @param index
*/
public void set(E element, int index){
//判断索引是否合法
checkRange(index);
elements[index] = element;
}
/**
* 移除索引index处的元素
* @param index
*/
public void remove(int index){
System.arraycopy(elements, index+1, elements, index, elements.length-index-1);
elements[--size] = null;
}
/**
* 移除与element相等的元素
* @param element
*/
public void remove(E element){
for(int i=0; i<size; i++){
if(element.equals(get(i))){
//将该元素移除
remove(i);
}
}
}
/**
* 返回容器元素个数
* @return
*/
public int size(){
return size;
}
/**
* 判断容器是否为空
* @return
*/
public boolean isEmpty(){
if(size == 0){
return true;
}
return false;
}
/**
* 检查索引是否合法
* @param index
*/
public void checkRange(int index){
if(index < 0 || index > size-1){
throw new RuntimeException("索引不合法" + index);
}
}
/**
* 重写toString()方法,方便打印容器内容
* @param args
*/
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i=0; i<size; i++){
sb.append(elements[i] + ",");
}
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
public static void main(String[] args){
MyArrayList<String> list = new MyArrayList<String>(10);
for(int i=0; i<20; i++){
list.add("aa"+i);
}
list.set("AA", 0);
list.get(19);
list.remove("AA");
System.out.println(list);
System.out.println(list.isEmpty());
}
}