一、设计一个简单的ArrayList[需要包含构造函数(有参和无参),add(obj),扩容 机制,remove方法]
import java.io.Serializable;
public class MyArrayList implements Serializable {
//第一次扩容的容量
public static final int DEFAULT_CAPACITY=10;
//用于初始化空的list
public static final Object[] EMPTY_ELEMENT_DTAA={};
//实际存储的元素,transient:避免序列化的
transient Object[] elementData;
//实际存储list集合的大小
public int size=0;
//使用这个字段,来判断当前集合类是否被并发修改,即迭代器并发修改的fail-fast机制
private static int modCount=0;
//新版得jdk不会给创建一个对象
public MyArrayList(){
this.elementData=EMPTY_ELEMENT_DTAA;
}
public MyArrayList(int initialCapcity){
if(initialCapcity>0){
this.elementData=new Object[initialCapcity];
}else if(initialCapcity==0){
this.elementData=EMPTY_ELEMENT_DTAA;
}else{
throw new IllegalArgumentException("参数异常");
}
}
public boolean add(Object e){
//判断容量
ensureCapacityInternal(size+1);
//使用下标赋值
elementData[size++]=e;
return true;
}
private void ensureCapacityInternal(int minCapacity){
//用于并发判断
modCount++;
if(elementData==EMPTY_ELEMENT_DTAA){
minCapacity=Math.max(DEFAULT_CAPACITY,minCapacity);
}
//是否需要扩容,需要的最少容量大于现在的数组的容量,需要扩容
if(minCapacity-elementData.length>0){
int oldCapacity=elementData.length;
int newCapacity=oldCapacity+(oldCapacity>>1);
//如果新容量<最小容量,则将最新的容量赋值给新的容量
if(newCapacity-minCapacity<0){
newCapacity=minCapacity;
}
//创建新数组
Object[] objects=new Object[newCapacity];
System.arraycopy(elementData,0,objects,0,elementData.length);
//修改引用
elementData=objects;
}
}
//通过下标获取元素
public Object get(int index){
rangeCheck(index);
return elementData[index];
}
private void rangeCheck( int index){
if(index>size||size<0){
throw new IndexOutOfBoundsException("数组越界");
}
}
/**
* 判断对象所在的位置
*/
public int indexOf(Object o){
if(o==null){
for(int i=0;i<size;i++){
if(elementData[i]==null){
return i;
}
}
}else{
for(int i=0;i<size;i++){
if(o.equals(elementData[i])){
return i;
}
}
}
return -1;
}
//更新
public Object set(int index,Object obj){
rangeCheck(index);
Object oldValue=elementData[index];
elementData[index]=obj;
return oldValue;
}
//根据索引删除元素
public Object remove(int index){
rangeCheck(index);
//用于并发判断
modCount++;
Object oldValue=elementData[index];
//计算要删除的位置后面有几个元素
int numMoved=size-index-1;
if(numMoved>0){
System.arraycopy(elementData,index+1,elementData,index,numMoved);
}
//将多出的位置为空,没有引用对象,垃圾收集器就可以回收,如果不置空,将会保存一个引用,可能会造成内存泄漏。
elementData[--size]=null;
return oldValue;
}
//获取数组实际大小
public int size(){
return this.size;
}
}
测试下:
public class Main {
public static void main(String[] args) {
MyArrayList myArrayList=new MyArrayList();
for(int i=0;i<10;i++){
myArrayList.add("i"+i);
System.out.println(myArrayList.get(i));
}
System.out.println("----------------------------------");
Object remove = myArrayList.remove(0);
System.out.println(remove);
}
}
明天关于Map的一些列的分享,敬请关注。