package cn.test;
//手工实现Arraylist,参照ArrayList的方法类
public class SsqArrayList<E> {
private int size;//包含元素的数量
private Object[] elementData;//目标数组
private static final int DEFAULT_CAPACITY=10;
public SsqArrayList(){
elementData = new Object[DEFAULT_CAPACITY];//当定义时未指定数组范围,取默认值为10
}
public SsqArrayList(int capacity){//不可为负数,为负数时抛出异常
elementData = new Object[capacity];
}
public void add(E element){
//越界时对数组进行扩容
if(size==elementData.length){
Object[] newArray = new Object[elementData.length+
(elementData.length>>1)];//位运算符“>>”与加法运算优先级一致,故须用括号
//为防止占用过多空间,扩容时扩展至原容量的3/2
if(size<=1){//数组长度为1或0时的特殊情况
newArray = new Object[size+1];
}
System.arraycopy(elementData,0,newArray,0,size);
elementData=newArray;
}
elementData[size++]=element;
}
@Override
public String toString() {//toString方法的重载
if(elementData==null)
return null;
if(size-1==-1)
return "[]";
StringBuilder x = new StringBuilder();
x.append('[');
for(int i=0;i<size;i++)
{
x.append(elementData[i]+",");
}
x.setCharAt(x.length()-1,']');
return x.toString();
}
public void set(int index,Object element){//改变指定元素
//判断下标是否合法[0,length)
if(index<0||index>=elementData.length)
//不合法
throw new RuntimeException("下标不合法");
elementData[index]=element;
}
public E get(int index){//按下标取元素
return (E)elementData[index];//elementData是Object型,应强制转为E型
}
public void remove(int index){//按下标删除(假设下标合法)
if(size-index-1>0)//当数组中仅有一个元素或要删除的元素位于队尾时,不需要进行序列的前移
System.arraycopy(elementData,index+1,elementData,index,size-index-1);
elementData[--size]=null;
}
public void remove(Object element){//按元素删除
for(int i=0;i<size;i++){
if(element.equals(elementData[i]))
remove(i);
}
}
public static void main(String[] args) {
SsqArrayList s = new SsqArrayList();
System.out.println(s);
}
}
ArrayList的手工实现
最新推荐文章于 2022-09-10 10:53:06 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)