版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40301026/article/details/86499920
主要是参照JDK10的源码加了一些自己的理解,手动实现其底层代码逻辑。
只是实现了其主要函数逻辑。
package cn.liu.mycollection;
import java.util.Arrays;
/**
*
* 自定义实现一个ArrayList,体会底层原理。
*自己完善其他功能
* @author Dick
*
*/
public class MyArrayList<E> {
private Object[] elementDate;//核心数组
private int size;//数组具体长度
private static final int DEFALT_CAPACITY = 10;
//构造方法
public MyArrayList() {
elementDate = new Object[DEFALT_CAPACITY];//没有参数默认为10
}
//构造方法
public MyArrayList(int x) {
elementDate = new Object[DEFALT_CAPACITY];//有参数,默认为参数大小长度
}
//添加功能add
public void add(E obj) {
//判断是否需要扩容数组
if(size == elementDate.length) {
//扩容开始,新建一个大数组,把原数组值拷贝到新数组,再把原数组覆盖掉
//左移一位是加倍,右移一位是减一半,下面示例为右移
Object[] newarray = new Object[elementDate.length+(elementDate.length>>1)];
System.arraycopy(elementDate, 0, newarray, 0, elementDate.length);
elementDate = newarray;
}
elementDate[size++] = obj;
}
//添加功能add 将指定的元素插入到此列表的指定位置
public void add(int index ,E element) {
//判断index是不是正确
judge(index);
//判断是否需要扩容数组
if(size == elementDate.length) {
//扩容开始,新建一个大数组,把原数组值拷贝到新数组,再把原数组覆盖掉
//左移一位是加倍,右移一位是减一半,下面示例为右移
Object[] newarray = new Object[elementDate.length+(elementDate.length>>1)];
System.arraycopy(elementDate, 0, newarray, 0, elementDate.length);
elementDate = newarray;
}
System.arraycopy(elementDate, index, elementDate, index+1, size-index);
elementDate[index] = element;
size++;
}
//重写toString方法
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
//[a,b,c]
sb.append("[");
for(int i = 0;i<size;i++)
{
sb.append(elementDate[i]+",");
}
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
//get函数 返回指定位置的元素
public E get(int index) {
judge(index);
return (E)elementDate[index];
}
//set函数 替换指定位置的元素
public void set(E newelement,int index) {
judge(index);
elementDate[index] = newelement;
}
//子函数来检测索引是不是合法
public void judge(int index) {
if(index <0||index >= size)
{
//手动抛异常
throw new RuntimeException("索引不合法:"+index);
}
}
//remove函数
//思路:将该指定位置的元素后面的所有元素整体前一位,再删除最后一位。
public void remove(int index) {
judge(index);
//System.out.println(1);
if(index==size)
{
size--;
elementDate[size] = null;
}
else
{
System.arraycopy(elementDate, index+1, elementDate, index, size-index);
elementDate[size] = null;
size--;
}
}
public void remove(E element) {
boolean sign = false;
for(int i = 0 ; i<size ; i++)
{
if(element.equals(get(i)))
{
remove(i);
sign = true;
}
}
if(sign==false)
{
System.out.println("list容器内没有此元素");
}
}
//clear()函数
public void clear() {
for(int i=0;i<size;i++) {
elementDate[i]=null;
}
size=0;
}
//clone()函数
public Object clone() {
Object NewArray = new Object[size];
NewArray = Arrays.copyOf(elementDate, size);
return NewArray;
}
//contaions()函数
public boolean contains(E element) {
return indexOf(element)>=0;
}
//indexOf函数 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。
public int indexOf(E o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementDate[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementDate[i]))
return i;
}
return -1;
}
}