ArrayList底層JDK源碼解讀
ArrayList底層是用數組實現的存儲。特點:查詢效率高。增刪效率低,線程不安全。不過一般情況還是使用ArrayList
package sxt.gaoqi.container;
/*
* 增加泛型
* 擴容
* get/set方法
* 索引越界RuntimeException
* 增加remove
*/
public class JsArrayList<E>
{
private Object[] elementData;
private int size;
private static final int DEFAULT_CAPACITY = 10;
public JsArrayList()
{
elementData = new Object[DEFAULT_CAPACITY];
}
public JsArrayList(int capacity)
{
if(capacity < 0)
{
throw new RuntimeException("容器的容量不能爲負數: " + capacity);
}
else if(capacity == 0)
{
elementData = new Object[DEFAULT_CAPACITY];
}
else
{
elementData = new Object[capacity];
}
}
public void add(E obj)
{
//什麼時候擴容?
if(size == elementData.length)
{
//怎麼擴容?
Object[] newArray = new Object[elementData.length + (elementData.length>>1)];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++] = obj;
}
public E get(int index)
{
checkRange(index);
return (E)elementData[index];
}
public void set(E element, int index)
{
checkRange(index);
elementData[index] = element;
}
public void checkRange(int index)
{
if(index < 0 || index > size - 1)
throw new RuntimeException("指針越界" + index);
}
public void remove(E element)
{
//element:將他和所有元素挨個比較,獲得第一個比較爲true的,返回
for(int i = 0; i < size; i++)
{
if(element.equals(get(i)))
{
remove(i);
}
}
}
public void remove(int index)
{
//a.b.c.d.e.f.g
//a.b.c.e.f.g
int moveLength = elementData.length - index - 1;
if(moveLength > 0)
{
System.arraycopy(elementData, index + 1, elementData, index, moveLength);
}
elementData[--size] = null;
}
public int size()
{
return size;
}
public boolean isEmpty()
{
return size == 0 ? true:false;
}
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i =0; i < size; i ++)
{
sb.append(elementData[i] + ",");
}
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
public static void main(String[] args)
{
JsArrayList<String> s1 = new JsArrayList<>();
for(int i = 0; i < 40; i++)
{
s1.add("aa" + i);
}
System.out.println(s1);
s1.set("森", 10); //測試set方法
System.out.println(s1);
System.out.println(s1.get(10)); //測試get方法
s1.remove(2); //測試remove方法
s1.remove("aa4");
System.out.println(s1);
}
}