手写简单的ArrayList源码
先把ArrayList的源码跟着韩顺平老师的讲解看了一遍,要想真正吃透还得是自己写一个,于是模仿了一下,感叹源码真的太巧妙。
import java.util.Arrays;
public class MyArrayList<E> {
private Object[] DefaultElementData = {};//默认元素数组,空数组
private int DefaultCapacity = 10;//默认的容量大小,首次扩容时使用
private int size = 0;//真实的元素数组大小
private Object[] elementData;//真实的元素数组
public MyArrayList() {//构造器
this.elementData = DefaultElementData;//初始化元素数组
}
public boolean add(E e) {
ensureCapacity(size + 1);//确保数组的容量够
elementData[size++] = e;//元素插入
return true;
}
public void ensureCapacity(int minCapacity) {
if (elementData == DefaultElementData) {
minCapacity = DefaultCapacity;//首次扩容,扩容到数组长度为10
}
if (minCapacity - elementData.length > 0) {
grow(minCapacity);//数组长度到达容量临界值时进行扩容
}
}
public void grow(int minCapacity) {
int oldCapacity = size;
int newCapacity = (int) (oldCapacity * 1.5);
//下面代码只在首次扩容时会执行,minCapacity为10,而newCapacity为0,后面的扩容都不会被执行
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append('[');
for (int i = 0; i < size; i++) {
if(i == size - 1){
sb.append(elementData[i] + "]");
}
else{
sb.append(elementData[i]+",");
}
}
return sb.toString();
}
}
class Test {
public static void main(String[] args) {
MyArrayList<Object> objectMyArrayList = new MyArrayList<>();
for (int i = 0; i < 20; i++) {
objectMyArrayList.add(i +"");
}
System.out.println(objectMyArrayList);
}
}
写一遍之后,豁然开朗,于是按照正常人的思维重新写一个。
import java.util.Arrays;
public class MyArrayList01<E> {
private int size;
private Object[] elementData;
private Object[] defaultElementData = {};
private int defaultCapacity = 10;
private int Capacity;
public MyArrayList01() {
elementData = defaultElementData;
}
public boolean add(E e) {
if(size == Capacity){
resize();
}
elementData[size++] = e;
return true;
}
public void resize(){
if(size == 0){
Capacity = defaultCapacity;
}else{
Capacity = Capacity * 2;
}
elementData = Arrays.copyOf(elementData,Capacity);
}
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append('[');
for (int i = 0; i < size; i++) {
if(i == size - 1){
sb.append(elementData[i] + "]");
}
else{
sb.append(elementData[i]+",");
}
}
return sb.toString();
}
}
class Test01{
public static void main(String[] args) {
MyArrayList01<Object> objectMyArrayList01 = new MyArrayList01<>();
for (int i = 0; i < 20; i++) {
objectMyArrayList01.add(i);
}
System.out.println(objectMyArrayList01);
}
}