手工实现ArrayList功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }
    
}

​

猜你喜欢

转载自blog.csdn.net/qq_40301026/article/details/86499920