动态数组的实现

2023-11-06

public class MyArrayList<E> {

    private int size=0;
    private E[] elements;
    private static final int DEFAULT_CAPACITY=10;
    private static final int ELEMENT_NOTFOUND=-1;

    public MyArrayList(int capacity) {
        capacity =(capacity<DEFAULT_CAPACITY)? DEFAULT_CAPACITY:capacity;
        elements=(E[]) new Object[capacity];
    }

    public MyArrayList() {
        //elements=new int[DEFAULT_CAPACITY];
        this(DEFAULT_CAPACITY); //在无参数构造方法中调用有参的构造方法
    }

    /**
     * 清楚所有的元素
     * size 为0 无法访问之前存储的元素
     * 动态覆盖之前的元素 size从0开始
     */
    public void clear(){
        //确保堆内存中不能循环利用的对象被销毁(重点)
        for (int i=0;i<size;i++){
            elements[i]=null;
        }
        size=0;
    }

    public int size(){
        return size;
    }

    public boolean isEmpty(){
        return size==0;
    }

    public boolean contains(E element){
        return indexOf(element)!=ELEMENT_NOTFOUND;
    }

    public void add(E element){
        add(size,element);
    }

    public void add(int index,E element){
        rangeCheckforAdd(index);
        ensureCapacity(size+1);//作用是确保容量值可以达到size+1
        //注意扩容,最右侧的元素向右位移动,不能被覆盖
        for (int i=size-1;i>=index;i--){
            elements[i+1] = elements[i];
        }
        elements[index]=element;
        size++;
    }

    public E get(int index){
        if (index<0||index>=size){
            throw new IndexOutOfBoundsException("Index:"+index+" size "+size);
        }
        return elements[index];
}

    /**
     *
     * @param index
     * @param element
     * @return 返回原来存放的元素
     */
    public E set(int index,E element){
        if (index<0||index>=size){
            throw new IndexOutOfBoundsException("Index:"+index+" size "+size);
        }
        E old = elements[index];
        elements[index] = element;
        return old;
    }

    /**
     *
     * @param index
     * @return 返回被删除的元素
     */
    public E remove(int index){
        rangeCheck(index); //范围是0~size-1
        // 有bug,最后一个元素的删除是通过size减一去去除
        E old=elements[index];
        for (int i=index;i<size-1;i++){
            elements[index]=elements[index+1];
        }
        //上面的i取index-1;也就是删除最后一个元素,不进入for
//        size--;//去掉最后一个元素了
//        elements[size]=null;
        //上面两句可以合成成一句
        elements[--size]=null; //使用累减后的值进行运算
        return old;
    }

    /**
     * @param element
     * @return 返回元素对应的下标位置
     * 实现时需要注意空指针异常
     */
    public int indexOf(E element){
        if (element==null){
            for (int i=0;i<size;i++){
                if (elements[i]==null){
                    return i;
                }
            }
        }
        //这里要重写equals
        for (int i=0;i<size;i++){
            if (element.equals(elements[i])){
                return i;
            }
        }
        return ELEMENT_NOTFOUND;
    }
    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("size: ").append(size).append(" [");
        for (int i = 0; i < size; i++) {
            stringBuilder.append(elements[i]);
            if (i != size - 1) {
                stringBuilder.append(",");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }
    //封装错误信息
    private void outOfBounds(int index){
        throw new IndexOutOfBoundsException("Index:"+index+" size "+size);
    }
    //封装indexCheck
    private void rangeCheck(int index){
        if (index<0 || index>=size){
            outOfBounds(index);
        }
    }
    private void rangeCheckforAdd(int index){
        if (index<0||index>size){
            outOfBounds(index);
        }
    }

    private void ensureCapacity(int capacity){
        int oldCapacity = elements.length;
        if (oldCapacity>=capacity){
            return;
        }
        int newCapacity=oldCapacity+(oldCapacity>>1); //右移操作一定要加括号
        System.out.println(newCapacity);
        E[] newElements=(E[])new Object[newCapacity];
        for (int i=0;i<size;i++){
            newElements[i]=elements[i];
        }
        elements=newElements;
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态数组的实现 的相关文章

随机推荐

  • 原生js实现对select下拉列表的内容过滤

    原生js实现对select下拉列表的内容过滤 场景描述 笔者在工作的过程中 经常碰到这样的业务场景 客户要求一个下拉列表框旁边要有一个输入过滤的功能 如下图所示 由于在一个项目中出现了好多这样的需求 笔者就写了个采用原生js实现的对下拉的过
  • 决策树(Decision Tree)

    Author xiaoran Email PursuitFlow 163 com xiaoranone 126 com Datawhale 简介和算法 决策树是机器学习最常用的算法之一 它将算法组织成一颗树的形式 其实这就是将平时所说的if
  • Kompose使用

    参考网址 https kubernetes io docs tools kompose user guide Kompose是一个转换工具 可以将docker compose编排docker compose yaml文件转换为kuberne
  • osgEarth的Rex引擎原理分析(一二九)地图下载器实现原理

    目标 七十二 中问题148 java版本 String iPath http online2 map bdimg com tile qt tile x 4 y 4 z 5 styles pl udt 20171031 scaler 1 p
  • 免费的crm系统部署在自己的服务器,CRM软件的三种部署方式

    企业部署CRM软件有三种不同选择 他们在成本 风险和利益上各有不同 本文将逐一介绍这三类CRM部署方式 本地部署 软件托管和服务器代管 软件即服务 一 CRM本地部署方式 这是将软件客户端 服务器部署在客户本地服务器的一种方式 这种方式为客
  • 神经网络学习小记录63——Keras 图像处理中注意力机制的代码详解与应用

    神经网络学习小记录63 Keras 图像处理中注意力机制的解析与代码详解 学习前言 什么是注意力机制 代码下载 注意力机制的实现方式 1 SENet的实现 2 CBAM的实现 3 ECA的实现 注意力机制的应用 学习前言 注意力机制是一个非
  • 關於 React 中的 Hooks - 完全上手指南

    關於 React 中的 Hooks 完全上手指南 前言 正文 什麼是 Hooks useState 自定義 Hooks useEffect useRef useLayoutEffect useCallback useMemo useRedu
  • C语言进阶——4.宏定义

    C语言进阶 4 宏定义 1 宏定义是什么 宏是用来表示一段代码的标识符 宏也是标识符 也要满足标识符的规则 但通常习惯使用大写字母和下划线命名 2 宏定义怎么用 宏定义通常有三种用法 当作常量使用 当作函数使用 编译预处理 2 1 宏定义常
  • 关于idea出现java: 无效的目标发行版: 8、9、11问题的解决方式

    1 首先Project settings 将环境设置为1 8 2 如果有多个module都要设置一下 3 都设置好了之后点击apply应用 点击ok关闭设置页面 然后点击File gt settings 进入设置页面 找到 Java Com
  • 腾讯策略协作型 AI「绝悟」升级至王者荣耀电竞职业水平

    感谢阅读腾讯AI Lab微信号第80篇文章 本文将介绍腾讯策略协作型 AI 绝悟 最新进展 达到王者荣耀电竞职业水平 长线策略及团队协作能力全面提升 腾讯 AI Lab 与王者荣耀共同探索的前沿研究项目 策略协作型 AI 绝悟 今天在吉隆坡
  • 经典排序算法:快速排序(Quick Sort)

    快速排序算法 快速排序算法被称为20世纪十大算法之一 是最重要的算法之一 是一定要掌握和熟练的 快速排序的基本思想是 分治法 1 先从数列中取出一个数作为基准数 2 分区过程 将比这个数大的数全放到它的右边 小于或等于它的数全放到它的左边
  • jdbc:mysql://127.0.0.1:3306/test_: No suitable driver found for jdbc:mysql://127.0.0.1:3306/bank

    今天遇到个很奇怪的问题 项目登录上去之后 去修改某张表的一条记录 突然报错 No suitable driver found for jdbc mysql 127 0 0 1 3306 bank 项目可以登录 那就不是数据库配置文件的问题
  • 状态压缩技巧:动态规划的降维打击

    刷题认准labuladong 东哥带你手把手撕力扣 点击下方卡片即可搜索 我们号之前写过十几篇动态规划文章 可以说动态规划技巧对于算法效率的提升非常可观 一般来说都能把指数级和阶乘级时间复杂度的算法优化成 O N 2 堪称算法界的二向箔 把
  • 史上最全的maven pom.xml文件教程详解

    原文地址 http www zuidaima com share 1781583829978112 htm
  • 部署Prometheus

    1 解压prometheus压缩包 root node5 tar xf prometheus 2 38 0 linux amd64 tar gz C usr local 2 对压缩后的文件做软连接 root node5 ln sv usr
  • 人工智能技术的应用越来越广,极大促进了无人机产业的发展

    备受关注的第二十三届中国国际高新技术成果交易会 简称 高交会 于12月27日在深圳开幕 本届高交会分别在深圳会展中心 福田 和深圳国际会展中心 宝安 同期举办 吸引了众多优秀展商一展风采 本届高交会采用了 线上 线下 联动的方式 线下展览总
  • Shell脚本基础介绍

    shell基础简介 编写脚本通常使用某种基于解释器的编程语言 而shell脚本不过就是一些文件 我们能将一系列需要执行的命令写入其中 然后通过shell来执行这些脚本 进入Linux系统 Ubuntu 打开终端Terminal 表示普通用户
  • 【深度学习】- NLP系列文章之 1.文本表示以及mlp来处理分类问题

    系列文章目录 1 文本分类与词嵌入表示 mlp来处理分类问题 2 RNN LSTM GRU三种方式处理文本分类问题 3 评论情绪分类 还是得开个坑 最近搞论文 使用lstm做的ssd的cache prefetching 意味着我不能再划水了
  • JS实现一键回到顶部的功能(兼容所有浏览器,超级详细)

    我们在浏览网页的时候 大部分都有一个一键回到顶部的按钮 无论是pc端还是移动端 这个功能都很常见 我在一次面试的时候 也要求手写这个功能 首先我们新建一个空页面 把body的高度设置为3000px 这样做的目的是让浏览器出现滚动条 不然我们
  • 动态数组的实现

    public class MyArrayList