JAVA复习---------------------手写ArrayList(全面方法)

做任何事都应该持有认真的态度。

因为是复习,再加上一直想写一些轮子,后期的代码会一起上传到我的github上,可能会很久,因为还有很多其它的知识没有学习,不过我会一直保持更新的.

http://www.github.com/YangGuangSuccess

解释:其中大家一些没有见过的异常是我自义的,所以不必纠结于此,YList接口只是定义了规范,并没有其它实际作用,希望大家有所收获

YArrayList:

package com.yg.collection.list.yarraylist;
/*
 *
 *@ClassName ArrayList
 *@Description TODO      顺序线性表的具体实现
 *@Author NEVER FORGET ONE
 *@Date 2019/5/6 13:31
 *
 */

import com.yg.collection.list.YList;


import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Arrays;

public class YArrayList<T> implements YList<T> ,
                Serializable ,Cloneable{
    //序列化ID
    private static final long serialVersionUID = -5320233311646864148L;

    //YArrayList 最大容量
    private static final int MAX_CAPACITY= Integer.MAX_VALUE-8;


    //为了避免浪费序列化浪费空间,所以以 transient 修饰
    private transient Object[] elementData;


    //元素数量
    private transient int size;



    /******************-------------------------*************************/


    //空构造函数,默认初始化长度为 1
    public YArrayList(){
        this(1);
    }



    //以用户指定的长度初始化
    public YArrayList(int initCapacity){
        if(initCapacity <= 0){
            throw new YIllegalNumberException("初始化容量错误");
        }else{
            this.elementData = new Object[initCapacity];
        }
    }




    //支持数组初始化
    public YArrayList(T[] initArray) {
        checkIsNull(initArray);

        if(initArray.length == 0){
            throw new YIllegalValueException("不合理数值");
        }

        for(int i = 0 ; i != initArray.length; ++i){
            if(initArray[i] != null){
                ++size;
            }
        }
        this.elementData = initArray;
    }



    //支持以另一个 YList 构造
    public YArrayList(YList<T> yList){

        checkIsNull(yList);

        this.size = yList.size();

        this.elementData = YList.toArray(yList);
    }



    /*****************************-------***********************************/

    //添加元素,添加元素之前,判断数组空间是否足够
    //如果不够,则扩容2倍 , 右移 / 2 , 左移 * 2
    @Override
    public boolean add(T element) {

        checkIsNull(element);

        if(size == elementData.length){

            elementData=ensureCapacity(size << 1);

        }

        elementData[size++] = element;

        return true;
    }





    //指定的下标插入元素
    @Override
    public boolean add(int index, T element) {

        checkIsNull(element);

        if(checkIndex(index)){

            //在容量正好等于size的情况下插入
            if(size == elementData.length){
                elementData = ensureCapacity(size + 1);
                return insert(index,element);
            }
            //在容量大于size的情况下插入
            else{
               return insert(index,element);
            }
        }

        throw new YIndexOutOfBoundException("不合理位置");
    }





    //将存储相同类型元素的集合添加到本集合
    @Override
    public boolean add(YList<T> yList) {
        
        checkIsNull(yList);
        
        int otherSize = yList.size();

        if (otherSize == 0) {
            throw new YIllegalOperationException("不支持添加空集");
        }
        if (size == 0) {
            elementData = Arrays.copyOf(YList.toArray(yList), otherSize);
            size += otherSize;
            return true;
        }

        int newCapacity = elementData.length - size >= otherSize ?
                elementData.length : size + otherSize;

        //如果 elementData空间足够充足,那么无需扩容
        if (newCapacity == elementData.length) {
            System.arraycopy(YList.toArray(yList), 0, elementData, size - 1, otherSize);
            size += otherSize;
            return true;

            //如果空间不足,则扩容至   /***合适容量***/
        } else {

            Object[] temp = new Object[newCapacity];
            System.arraycopy(elementData, 0, temp, 0, size);
            System.arraycopy(YList.toArray(yList), 0, temp, size, otherSize);

            elementData = temp;
            size += otherSize;
            return true;
        }
    }






    //移除在集合中第一次出现的元素
    // 移除成功返回 true
    // 如果移除失败或者没有指定元素,则返回 false
    @Override
    public boolean remove(T element) {

        if(size == 0){
            throw new YIllegalOperationException("非法操作");
        }

        checkIsNull(element);

        return removeElement(element);
    }





    //移除指定位置的元素,如果集合为空,调用此方法返回 将抛出异常
    public T remove(int index){

        if(size == 0){
            throw new YIllegalOperationException("非法操作");
        }

        if(checkIndex(index)){
            Object temp = elementData[index];
            if(size == 1){

                elementData = new Object[--size];
                return (T)temp;
            }
            removeElementByIndex(index);
            return (T)temp;
        }

        throw new YIndexOutOfBoundException("不合理位置");
    }




    //获取元素
    @Override
    public T get(int index) {

        if(checkIndex(index)){

            return (T)elementData[index];

        }

        throw new YIndexOutOfBoundException("不合理位置");
    }





    //替换指定元素,返回被替代的元素
    @Override
    public T set(int index, T element) {

        checkIsNull(element);

        if(checkIndex(index)){

            Object temp = elementData[index];

            elementData[index] = element;

            return (T)temp;
        }

        throw new YIndexOutOfBoundException("不合理位置");
    }



    //返回元素数量
    @Override
    public int size() {
        return size;
    }



    //清空
    @Override
    public boolean clear() {
        return clearElementData();
    }




    //是否包含某个元素
    @Override
    public boolean isContain(T element) {

        checkIsNull(element);

        for(int i = 0 ; i != size; ++i){
            if(elementData[i].equals(element)){
                return true;
            }
        }
        return false;
    }



    //返回元素在集合中第一次出现的下标,如果没有,则返回 -1
    public int indexOf(T element){

        checkIsNull(element);

        for(int i = 0 ; i != size ; ++i){
            if(elementData[i].equals(element)){
                  return i;
            }
        }
        return  -1;
    }




    //返回元素在集合中最后一次出现的下标,如果没有,则返回 -1
    public int lastIndexOf(T element){

        checkIsNull(element);

        for(int i = size - 1 ; i >= 0 ; --i){
            if(elementData[i].equals(element)){
                return i;
            }
        }
        return  -1;
    }



    //是否为空
    @Override
    public boolean isEmpty() {
        return size == 0;
    }





    //反序列化
    private void readObject(ObjectInputStream objectInputStream)
    throws IOException , ClassNotFoundException{
        objectInputStream.defaultReadObject();

        //读取元素数量

        size = objectInputStream.readInt();

        if(size < 0){
            throw new YIllegalNumberException("反序列化容量错误");
        }
        if(size == 0){
            elementData = new Object[0];
        }

        //读取 elementData
        Object[] temp = new Object[size];
        for(int i = 0 ; i != size; ++i){
            temp[i] = objectInputStream.readObject();
        }
        elementData = temp;
    }





    //序列化
    private void writeObject(ObjectOutputStream objectOutputStream)
    throws IOException{
            objectOutputStream.defaultWriteObject();

            //先序列化元素数量,这样方便反序列化的时候构造 elementData
            objectOutputStream.writeInt(size);

            //写入 elementData
            for(int i = 0 ; i != size ; ++i){
                objectOutputStream.writeObject(elementData[i]);
            }

    }





    /**
     *  返回指定集合的数组视图
     */
    public static <T>T[] toArray(YArrayList<T> arrayList){

        checkIsNull(arrayList);

        Class clazz = arrayList.getClass();
        try{

            Field field = clazz.getDeclaredField("elementData");

            T[] temp = (T[]) field.get(arrayList);

            return temp;

        }catch(NoSuchFieldException noSuchFieldException){
            noSuchFieldException.printStackTrace();
        }catch(IllegalAccessException illegalAccessException){
            illegalAccessException.printStackTrace();
        }
        return null;
    }





    //重写 equals 方法
    @Override
    public boolean equals(Object object) {
        if(this == object){
            return true;
        }
        if(!(object instanceof YList)){
            return false;
        }
        //比较 elementData 的元素是否相等
        if(object != null){
            YArrayList yArrayList = (YArrayList)object;
            if(size != yArrayList.size()){
                return false;
            }
            Object[] temp = YArrayList.toArray(yArrayList);
            for(int i = 0 ; i != size ; ++i){
                if(!elementData[i].equals(temp[i])){
                    return false;
                }
            }
            return true;
        }
        return false;
    }




    //重写 HashCode
    public int hashcode() {
        int hash = 17;
        hash = 31 * hash +  elementData.hashCode() ;
        hash = 31 * hash + (int)size^(size >>> 32);
        return hash > 0 ? hash : -hash;
    }




    //覆写 clone 方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        YArrayList<?> yArrayList = (YArrayList<?>) super.clone();
        yArrayList.elementData  = Arrays.copyOf(elementData,size);
        return yArrayList;
    }



    //覆写 toString
    @Override
    public String toString(){
        if(size == 0){
            return "[]";
        }

            StringBuilder result = new StringBuilder("[");
            for(int i = 0 ; i != size ;++i){
                result.append(elementData[i]);
                if(i != size - 1){
                    result.append(", ");
                    continue;
                }
                return result.append("]").toString();
            }
            return null;
    }



/*********************************内部函数******************************************/

    //数组扩容
    private Object[] ensureCapacity(int newCapacity){
        if(newCapacity >= MAX_CAPACITY){
            throw new YVMOutMemoryOfException("内存不足");
        }
        Object[] temp = new Object[newCapacity];
        System.arraycopy(elementData,0,temp,0,size);
        return temp;
    }





    //插入元素的位置:  1: 头位置   2 : 中间位置   3 : 末尾
    private boolean insert(int index,T element){
                //头位置插入
        if(index == 0){
            System.arraycopy(elementData,0,elementData,1,size);

            elementData[index] = element;

                //末尾插入
        }else if(index == size - 1){

            elementData[size] = elementData[index];
            elementData[index] = element;

        }else{

            int i = size;
            for(; i >= index;){
                elementData[i] = elementData[--i];
            }
            elementData[index] = element;

        }
        ++size;
        return true;
    }






    //移除元素位置 : 1: 头位置   2 : 中间位置    3: 末尾
    //移除条件 : size == 1 , size > 1
    private boolean removeElement(T element){

        if(size == 1){
            if(elementData[0].equals(element)){
                elementData[size--] = null;
                return true;
            }
            return false;
        }

        for(int i = 0 ; i != size ; ++i){
            if(elementData[i].equals(element)){
                return removeElementByIndex(i);
            }
        }
        return false;
    }





    //删除指定位置的元素
    private boolean removeElementByIndex(int index){

        //头位置移除
        if(index == 0){
            elementData = Arrays.copyOfRange(elementData,index+1,size);
            --size;

            return true;

            //末尾移除
        }else if(index == size - 1){
            elementData = Arrays.copyOfRange(elementData,0,--size);

            return true;

            //中间移除
        }else{
            elementData[index] = null;
            int removeIndex = index;
            for(; removeIndex < size-1;){
                elementData[removeIndex] = elementData[++removeIndex];
            }
            elementData = Arrays.copyOfRange(elementData,0,--size);

            return true;
        }
    }





    //检查非空 Object
    private static void checkIsNull(Object obj){
        if(obj == null){
            throw new YIllegalValueException("不合理数值");
        }
    }




    //检查 index 是否合理
    private boolean checkIndex(int index){
       return index >= 0 && index < size;
    }




    //清空 elementData
    private boolean clearElementData(){
        for(; size > 0 ;){
            elementData[--size] = null;
        }
        return true;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值