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

推荐订阅源

T
The Blog of Author Tim Ferriss
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
L
LINUX DO - 热门话题
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Cisco Talos Blog
Cisco Talos Blog
AI
AI
L
LINUX DO - 最新话题
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The GitHub Blog
The GitHub Blog
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
S
Securelist
博客园_首页
IT之家
IT之家
Schneier on Security
Schneier on Security
博客园 - 叶小钗
罗磊的独立博客
WordPress大学
WordPress大学
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
W
WeLiveSecurity
The Register - Security
The Register - Security
D
DataBreaches.Net
S
Security @ Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
Recorded Future
Recorded Future
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tailwind CSS Blog
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
T
Tor Project blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - 小猫钓鱼吃鱼

把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);
    }
}