广告
返回顶部
首页 > 资讯 > 精选 >Java如何自定义一个变长数组
  • 755
分享到

Java如何自定义一个变长数组

2023-07-04 21:07:33 755人浏览 安东尼
摘要

这篇文章主要介绍“Java如何自定义一个变长数组”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java如何自定义一个变长数组”文章能帮助大家解决问题。思路分析主要功能点:新建时可以指定容量大小,不指

这篇文章主要介绍“Java如何自定义一个变长数组”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java如何自定义一个变长数组”文章能帮助大家解决问题。

思路分析

主要功能点:

  1. 新建时可以指定容量大小,不指定时使用默认容量大小。

  2. 向数组中追加新元素,当超过容量时应该自动扩容。

  3. 向数组中指定位置添加新元素,需要考虑指定的下标是否越界,同样也需要考虑扩容操作。

  4. 删除末尾的元素,需要考虑缩小容量。

  5. 删除指定位置元素,需要考虑指定的下标是否越界,同样也需要考虑缩小容量。

  6. 修改特定位置的元素,需要考虑指定的下标是否越界。

  7. 以时间复杂度为O ( 1 ) O(1)O(1)获取任意位置的元素,需要考虑指定的下标是否越界。

主要注意点:

  1. 扩容: 这里扩容2倍(ArrayList 是扩容 1.5 倍),扩容时新建一个2倍容量的新数组,然后将旧数组中的元素按顺序拷贝到新数组。

  2. 缩容: 当数组中的元素个数 <= 0.25 * 容量时,自动缩小容量为原来的一半,新建一个容量是原来容量一半的数组,然后将旧数组中的元素按顺序拷贝到新数组。(ArrayList缩小为和当前元素个数一样大)。

  3. 指定位置添加: 需要先将指定位置及后面所有的元素都向后移动一位,将指定位置空出来然后再插入。

  4. 指定位置删除: 先将制定位置删除,然后将后面的所有元素都向前移动一位。

  5. 容量大小: 需要指定容量的最大值,避免OOM的发生。最小值可以指定也可以不指定。

实现代码

public class ResizeableArray<E> {    private static final int MIN_CAPACITY = 10;    private static final int MAX_CAPACITY = Integer.MAX_VALUE - 8;    // 当前实际数据大小    private int size = 0;    // 实际存放元素的数组,容量为 elements.length    private Object[] elements;    public ResizeableArray(){        this(MIN_CAPACITY);    }    public ResizeableArray(int initCapacity){        if(initCapacity < MIN_CAPACITY){            initCapacity = MIN_CAPACITY;        }else if(initCapacity > MAX_CAPACITY){            initCapacity = MAX_CAPACITY;        }        this.elements = new Object[initCapacity];    }    // 数组的特性,根据下标获取元素    public E get(int index){        this.checkIndex(index);        return (E)elements[index];    }    // 添加一个元素到最后    public void add(E element){        if(size == elements.length){            // 需要扩容            this.expandCapacity();        }        elements[size++] = element;    }    // 添加一个元素到指定位置    public void add(int index, E element){        if(index == size){            this.add(element);            return;        }        this.checkIndex(index);        if(size == elements.length){            // 需要扩容            this.expandCapacity();        }        // 需要先将index和之后的所有元素向后移动一位        for(int i = size - 1; i >= index; i--){            elements[i + 1] = elements[i];        }        elements[index] = element;        size++;    }    // 设置下标为index的元素    private void set(int index, E element){        this.checkIndex(index);        elements[index] = element;    }        private void delete(int index){        this.checkIndex(index);        elements[index] = null;        // 如果删除的不是最后一个元素,需要将后续元素往前移动一位        if(index < size - 1){            for(int i = index + 1; i < size; i++){                elements[i - 1] = elements[i];            }        }        size--;        if(size <= 0.25 * elements.length){            this.reduceCapacity();        }    }    private void deleteLast(){        this.delete(size - 1);    }    private void checkIndex(int index){        if(index < 0 || index >= size){            throw new IndexOutOfBoundsException(String.fORMat("Out of bounds at: %s, size is: %d", index, size));        }    }    private void expandCapacity(){        if(MAX_CAPACITY == elements.length){            // 容量达到最大限制,无法扩容。            throw new RuntimeException("The capacity has reached its maximum limit and cannot be expanded.");        }        int newCapacity = Math.min(elements.length << 1, MAX_CAPACITY);        Object[] newElements = new Object[newCapacity];        System.arraycopy(elements, 0, newElements, 0, size);        elements = newElements;    }    private void reduceCapacity(){        if(elements.length == MIN_CAPACITY){            return;        }        int newCapacity = Math.max(elements.length >> 1, MIN_CAPACITY);        Object[] newElements = new Object[newCapacity];        System.arraycopy(elements, 0, newElements, 0, size);        elements = newElements;    }    public static void main(String[] args){        ResizeableArray<Integer> resizeableArray = new ResizeableArray<>();        System.out.printf("初始化后,size为: %d \n", resizeableArray.size);        System.out.printf("初始化后,capacity为: %d \n", resizeableArray.elements.length);        System.out.println();        for(int i = 0; i < 20; i++){            resizeableArray.add(i);        }        System.out.printf("添加20个元素后,size为: %d \n", resizeableArray.size);        System.out.printf("添加20个元素后,capacity为: %d \n", resizeableArray.elements.length);        System.out.printf("添加20个元素后,第5个元素是: %d \n", resizeableArray.get(4));        System.out.println();        resizeableArray.delete(4);        System.out.printf("删除第五个元素后,size为: %d \n", resizeableArray.size);        System.out.printf("删除第五个元素后,capacity为: %d \n", resizeableArray.elements.length);        System.out.printf("删除第五个元素后,第5个元素是: %d\n", resizeableArray.get(4));        System.out.println();        resizeableArray.add(4, 100);        System.out.printf("在第五个位置插入元素后,size为: %d \n", resizeableArray.size);        System.out.printf("在第五个位置插入元素后,capacity为: %d \n", resizeableArray.elements.length);        System.out.printf("在第五个位置插入元素后,第5个元素是: %d\n", resizeableArray.get(4));        System.out.println();        for(int i = 0; i < 15; i++){            resizeableArray.deleteLast();        }        System.out.printf("删除后面15个元素后,size为: %d \n", resizeableArray.size);        System.out.printf("删除后面15个元素后,capacity为: %d \n", resizeableArray.elements.length);        System.out.printf("删除后面15个元素后,第5个元素是: %d\n", resizeableArray.get(4));        System.out.println();        resizeableArray.set(4, 200);        System.out.printf("修改第五个元素后,当前size为: %d \n", resizeableArray.size);        System.out.printf("修改第五个元素后,capacity为: %d \n", resizeableArray.elements.length);        System.out.printf("修改第五个元素后,第5个元素是: %d\n", resizeableArray.get(4));    }}

测试结果

由执行结果可知:

  • 初始化后默认容量为10

  • 添加元素超过10个后会自动扩容。

  • 删除一个元素后,size会减1,后面元素会自动向前移动一位。

  • 插入一个新元素后,size会加1,后续元素后移一位。

  • 删除到只有0.25 * 容量个元素后,会自动缩小容量。

Java如何自定义一个变长数组

关于“Java如何自定义一个变长数组”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Java如何自定义一个变长数组

本文链接: https://www.lsjlt.com/news/347674.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java如何自定义一个变长数组
    这篇文章主要介绍“Java如何自定义一个变长数组”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java如何自定义一个变长数组”文章能帮助大家解决问题。思路分析主要功能点:新建时可以指定容量大小,不指...
    99+
    2023-07-04
  • Java自定义一个变长数组的思路与代码
    目录前言思路分析实现代码测试结果总结前言 首先需要声明的是,Java本身是提供了变长数组的,即ArrayList。那么自定义一个变长数组有啥用?其实没啥用或者说用处不大,主要就是为了...
    99+
    2022-12-29
    java 变长数组 java定义一个长度可变的数组 如何定义变长数组
  • 怎么在java中定义一个长度为0的数组
    怎么在java中定义一个长度为0的数组?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Andro...
    99+
    2023-06-14
  • Python自定义一个数组类,支持数组之
    class MyArray: '''保证输入的内容是整型、浮点型''' def ___isNumber(self, num): if not isinstance(num, (int,float)): ...
    99+
    2023-01-31
    数组 自定义 Python
  • JavaScript如何定义一个变量
    这篇文章主要介绍了JavaScript如何定义一个变量,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。定义一个变量// 声明一个变量...
    99+
    2022-10-19
  • matlab如何定义一个变量
    这篇文章主要介绍“matlab如何定义一个变量”,在日常操作中,相信很多人在matlab如何定义一个变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”matlab如何定义一个变量”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-04
  • php如何定义一个常量数组
    在php中定义常量数组的方法有以下几种使用eval()函数定义常量数组define('BEST_PHPER',"return array('name'=>'张三','address'=>'china');");$BEST_PHPER=eva...
    99+
    2022-10-10
  • python如何定义一个空的一维数组
    在Python中,可以使用以下方式定义一个空的一维数组: 使用空列表定义: array = [] 使用内置的array库定...
    99+
    2023-10-23
    python
  • Java中如何自定义一个类加载器
    目录如何自定义加载器?示例:读取某文件的下的某class文件类加载器的使用及自定义类加载器如何自定义加载器? 1.创建一个自定义加载器类 继承 ClassLoader 类 2.重写 ...
    99+
    2022-11-21
    Java自定义类加载器 自定义类加载器 Java类加载器
  • 使用Java如何自定义一个迭代器
    使用Java如何自定义一个迭代器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体如下:编写自己的Iterator,实现Iterator接口,这里多说一句,实现Iterab...
    99+
    2023-05-31
    java 自定义 迭代器
  • 如何在Java中自定义一个枚举类
    本文章向大家介绍如何在Java中自定义一个枚举类的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序...
    99+
    2023-06-06
  • c语言中如何定义一个数组
    在C语言中,可以通过以下方式来定义一个数组:1. 声明并初始化一个数组:```cint arr[] = {1, 2, 3, 4, 5...
    99+
    2023-08-09
    c语言
  • java怎么定义一个数组冒泡排序
    Java中可以使用以下代码定义一个数组冒泡排序的方法: public class BubbleSort { public s...
    99+
    2023-10-26
    java
  • 怎么在java项目中定义一个数组
    这篇文章给大家介绍怎么在java项目中定义一个数组,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5...
    99+
    2023-06-14
  • c++可变数组如何定义
    在C++中,可变数组可以使用动态内存分配的方式进行定义和操作。以下是几种常见的定义可变数组的方式: 使用指针和new操作符: i...
    99+
    2023-10-28
    c++
  • java如何给定一个整型数组
    这篇文章给大家分享的是有关java如何给定一个整型数组的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。给定一个整型数组将所有的偶数放在前半部分, 将所有的奇数放在数组后半部分public static&n...
    99+
    2023-06-27
  • java数组如何定义
    Java中定义数组的语法有两种:动态方式(指定数组的长度)格式: (推荐学习:java课程)数据类型[] 数组名字 = new 数组存储的数据类型[长度];[] : 表示数组。数组名字:为定义的数组起个变量名,满足标识符规范,可以使用...
    99+
    2021-05-19
    java入门 java
  • python如何定义一个变量的类型
    在Python中,变量的类型是动态的,即变量的类型可以根据赋值的内容自动确定。Python中不需要显式地指定变量的类型,可以直接使用...
    99+
    2023-10-28
    python
  • php如何定义数组字符串长度
    PHP作为一种动态语言,提供了很多便利的方法用于定义数组和处理字符串。在实际开发过程中,经常需要对数组和字符串的长度进行处理。本篇文章主要介绍PHP如何定义数组和字符串的长度。一、定义数组长度在PHP中定义数组时,可以直接使用array()...
    99+
    2023-05-19
  • 一篇文章教你如何用Java自定义一个参数校验器
    目录注解 校验器异常处理测试总结 自定义一个唯一字段校验器 注解 @Target({ElementType.FIELD}) @Retention(RetentionPoli...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作