惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
阮一峰的网络日志
阮一峰的网络日志
T
The Blog of Author Tim Ferriss
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
宝玉的分享
宝玉的分享
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
博客园 - 司徒正美
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - Franky
B
Blog
V
V2EX
J
Java Code Geeks
D
Docker
博客园 - 叶小钗
The Cloudflare Blog
量子位
博客园_首页
MongoDB | Blog
MongoDB | Blog

博客园 - 小猫钓鱼吃鱼

把Claude Code玩明白:VS Code零成本接入DeepSeek大模型 硅基流动-免费代金券 告别从零造轮子!我的 Electron+Vue3 脚手架,让你 10 秒启动桌面应用开发 Electron劝退指南?不,这是我的‘真香’致富经 一个面向产品化的 Electron + Vue 3 桌面应用脚手架 动态代理 自己实现HashMap 自己实现Linkedlist,实现其常用的增、删、查的方法 前后端分离 微服务项目 通用后台管理系统 easypoi一行代码搞定excel导入导出 如何跳出页面的Frame框架 如何从GitHub上下载部分自己需要的文件 Mysql Explain 详解 解决 spring boot Failed to decode downloaded font Java中List集合的三种遍历方式(全网最详) SpringBoot设置首页(默认页)跳转功能的实现方案 idea中搭建ssm框架,详细步骤 微信公众号分享知识 idea创建maven项目速度慢?别急,这有三种方案 ceph是什么 redis 注册开机自启动服务(注意:要到你安装redis的根目录下执行下面的cmd命令) 怎么让mac和win/pc互传文件共享文件传输文件 Starting MySQL... ERROR! The server quit without updating PID file 问题解决
自己实现Arraylsit,实现其常用的几种增、删、该、查的方法
小猫钓鱼吃鱼 · 2021-06-05 · via 博客园 - 小猫钓鱼吃鱼
/**
 * 自己实现arraylist
 * 添加 add(E e) add(int index,E e)
 * 获取 get(int index)
 * 删除 remove(int index)  remove(object o)
 * 替换 set(int index)
 * 长度 getSize()
 * @author cuiyc
 * @version 1.0
 * @date 2021/6/5 09:15
 */
public class ArrayListDemo2<E> {
    /**
     * list的长度
     */
    private int size;

    private Object[] elemendData;
    /**
     * list的默认的长度为10
     */
    private static final int DEFAULT_CAPACITY=10;

    /**
     * 默认容量的object类型的数组
     */
    private static final Object[] DEFAULT_CAPACITY_ELEMENTDATA={};

    /**
     * 空参构造函数
     */
    public ArrayListDemo2(){
        this.elemendData=DEFAULT_CAPACITY_ELEMENTDATA;
    }

    /**
     * 带初始长度的构造函数
     * @param capacity
     */
    public ArrayListDemo2(int capacity){
        this.elemendData=new Object[capacity];
    }

    /**
     * 添加元素
     * @param e 要添加的元素
     * @return 处理结果
     */
    public Boolean add(E e){
        //1 需要确保数组的容量
        ensureListCapacity(size+1);
        //2 添加元素到list中
        elemendData[size++]=e;
        return true;
    }

    /**
     * 在list的某个位置上添加元素
     * @param index list的数组的位置
     * @param e 要添加的元素
     */
    public void add(int index,E e){
        //1 确保数组的容量
        ensureListCapacity(size+1);
        //2 数据的拷贝
        System.arraycopy(elemendData,index,elemendData,index+1,size-index);
        //3 数组元素的添加
        elemendData[index]=e;
        //4 数组size的+1
        size++;
    }

    /**
     * 获取某个位置上的元素
     * @param index list上的数组的位置
     * @return 获取到的元素
     */
    private E getValue(int index){
        return (E) elemendData[index];
    }

    /**
     * 移除list中某个位置的元素
     * @param index list的某个位置
     */
    private E remove(int index){
         List<String> list=new ArrayList<>();
        E oldValue= getValue(index);
        int numMoved=size-index-1;
        if(numMoved>0){
            System.arraycopy(elemendData,index+1,elemendData,index,numMoved);
        }
        elemendData[--size]=null;
        return oldValue;
    }

    /**
     * 移除list中的某个元素,传入的参数是object,数组中存的值
     * @param o
     */
    private Boolean remove(Object o){
        if(o==null){
            //如果o是空,怎么处理
            for (int i = 0; i < size; i++) {
                if(getValue(i)==null){
                    fastRemove(i);
                    return true;
                }
            }
        }else {
            //如果o不是空,怎么处理
            for (int i = 0; i < size; i++) {
                if(o.equals(getValue(i))){
                    fastRemove(i);
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 在某个位置赋值新的值
     * @param index list的数组的位置
     * @param e 新的值
     */
    public void setNewValue(int index,E e){
        elemendData[index]=e;
    }

    private int getSize(){
        return elemendData.length;
    }

    /**
     * 快速删除元素
     * @param index
     */
    public void fastRemove(int index){
        int numMoved=size-index-1;
        if(numMoved>0){
            System.arraycopy(elemendData,index+1,elemendData,index,numMoved);
        }
        elemendData[--size]=null;
    }


    /**
     * 确保list的数组的容量可以容纳新增的元素
     * @param miniCapacity 添加新的元素后,list的数组的长度
     */
    public void ensureListCapacity(int miniCapacity){
        //1 先对数组的长度进行逻辑上的一些判断 得到目前需要定义的一个list数组的长度
        int nowCapacity=caculateCapacity(elemendData,miniCapacity);
        //2 如果新添加元素后,数组的长度大于目前数组定义的一个长度,则需要扩容
        if(nowCapacity-elemendData.length>0){
            grow(nowCapacity);
        }
    }

    /**
     * 计算目前的list的数组的定义的长度。1 如果是第一次初始化list,则有可能是默认的10,也有可能是初始化的时候有定义数组长度。
     *                              2 如果不是第一次初始化list,则直接返回的是目前数组的实际长度+1的值。
     * @param elemendData
     * @param miniCapacity
     * @return
     */
    public int caculateCapacity(Object[] elemendData,int miniCapacity){
        if(elemendData==DEFAULT_CAPACITY_ELEMENTDATA){
            return Math.max(DEFAULT_CAPACITY,miniCapacity);
        }
        return miniCapacity;
    }

    /**
     * 扩容的机制
     * @param nowCapacity 目前数组的实际的最大的长度
     */
    public void grow(int nowCapacity){
        //目前list的数组的定义的一个容量大小
        int oldGuiDing_Capacity=elemendData.length;
        //扩容为1.5倍后的容量大小
        int newGuiDing_Capacity=oldGuiDing_Capacity+(oldGuiDing_Capacity>>1);

        //比较,扩容后的容量大小是否是比实际数组的最大长度还小,如果还小,则将实际的数组的最大长度赋值给需要扩容的容量
        if(newGuiDing_Capacity-nowCapacity<0){
            newGuiDing_Capacity=nowCapacity;
        }

        //数据拷贝,产生一个新的数组,将旧的数组的数据拷贝到新的数组中去
        Arrays.copyOf(elemendData,newGuiDing_Capacity);
    }
}