private transient Object[] elementData;//ArrayList底层是一个长度可以动态增长的数组elementData是数组的引用
private int size;//集合中元素的个数,不是数组的容量,增加删除元素size的值都要发生变化
public ArrayList(){
this(10);
}
public ArrayList(int initialCapacity) {
elementData = new Object[initialCapacity];
}
对ArrayList的add功能进行手写
@Override
public void add(Object e) {
//如果数组已满需要先扩容
if (size == elementData.length) {
grow();
}
//添加元素到最后
elementData[size]=e;
//size++
size++;
}
/**
本身的数组扩容
**/
private void grow() {
//1.新创建一个更大容量的数组
//Object []newArr=new Object[elementData.length*2];
int oldCapacity = elementData.length;
int newCapacity=oldCapacity+(oldCapacity>>1);
Object []newArr=new Object[newCapacity];
//2.将原来数组的元素拷贝到新数组中,索引对应
for (int i = 0; i < elementData.length; i++) {
newArr[i] = elementData[i];
}
//3.成员变量elementData指向扩容后的新数组
elementData = newArr;
}
对add(index,e)
public void add(int i, Object e) {
//如果数组已满进行扩容
if (size == elementData.length) {
grow();
}
//后移元素(从后向前)
for (int j = size; j > i; j--) {
elementData[j] = elementData[j - 1];
}
//添加元素
elementData[i - 1] = e;
size++;
}
查找索引indexof(object e)
@Override
public int indexOf(Object e) {
int index = -1;
//是空的话直接比引用否则直接比内容
if (e == null) {
for (int i = 0; i < size; i++) {
if(e==elementData[i]){
index=i;
break;
}
}
}else{
for (int i = 0; i < size; i++) {
if(elementData[i].equals(e)){
index=i;
break;
}
}
}
return index;
}
重写toString
public String toString() {
StringBuilder builder = new StringBuilder("[");
for (int i = 0; i < size; i++) {
builder.append(elementData[i] + ",");
}
//删除有元素的最后一个逗号
if (size > 0) {
builder.deleteCharAt(builder.length() - 1);
}
builder.append("]");
return builder.toString();
}