我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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如何自定义一个变长数组”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

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

Java 中如何定义可变长度数组?(java如何定义可变长度数组)

在Java编程中,数组是一种常用的数据结构,用于存储相同类型的元素。默认情况下,Java中的数组是固定长度的,一旦创建,其长度就不能改变。然而,在某些情况下,我们可能需要定义可变长度的数组,以便在程序运行时可以根据需要动态地调整数组的大小。本文将介绍在Java中如何定义可变长度数组,
Java 中如何定义可变长度数组?(java如何定义可变长度数组)
Java2024-12-22

Java自定义一个变长数组的思路与代码

有时我们希望将把数据保存在单个连续的数组中,以便快速、便捷地访问数据,但这需要调整数组大小或者对其扩展,下面这篇文章主要给大家介绍了关于Java自定义一个变长数组的思路与代码,需要的朋友可以参考下
2022-12-29

在 Java 中怎样去定义一个数组?(java中如何定义一个数组)

在Java编程中,数组是一种用于存储相同类型数据元素的集合。定义一个数组是Java编程的基础操作之一,它为我们处理和操作大量数据提供了便利。以下是在Java中定义数组的详细步骤:一、声明数组在Java中,要使用数组,首先需要声
在 Java 中怎样去定义一个数组?(java中如何定义一个数组)
Java2024-12-20

如何在 Java 中定义一个数组?(详细教程)(如何用java定义一个数组)

在Java编程中,数组是一种常用的数据结构,它可以存储相同类型的多个元素。本文将详细介绍如何使用Java定义一个数组,包括一维数组和多维数组的定义方法。一、一维数组的定义基本语法在Java中,定
如何在 Java 中定义一个数组?(详细教程)(如何用java定义一个数组)
Java2024-12-17

Java 如何一次性定义多个变量?(java怎么一次定义多个变量)

在Java编程中,一次性定义多个变量是一种常见的需求,它可以提高代码的效率和可读性。以下是几种在Java中一次性定义多个变量的方法:方法一:同时声明和初始化多个变量在Java中,可以使用逗号分隔符在一行代码中同时声明
Java 如何一次性定义多个变量?(java怎么一次定义多个变量)
Java2024-12-17

怎么在java中定义一个长度为0的数组

怎么在java中定义一个长度为0的数组?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Andro
2023-06-14

如何对 Java 数组的 sort 方法进行自定义?(如何自定义java数组的sort方法)

在Java编程中,数组是一种常用的数据结构,而sort方法是Java中用于对数组进行排序的内置函数。然而,在某些情况下,我们可能需要对sort方法进行自定义,以满足特定的排序需求。本文将详细介绍如何自定义Java数组的
如何对 Java 数组的 sort 方法进行自定义?(如何自定义java数组的sort方法)
Java2024-12-13

在 Java 中如何定义一个 List?(java如何定义一个list)

在Java编程中,List是一种常用的集合数据结构,用于存储一组有序的元素。它提供了丰富的操作方法,方便对元素进行添加、删除、查询等操作。以下是在Java中定义一个List的详细步骤:一、导入相关的类库在Java
在 Java 中如何定义一个 List?(java如何定义一个list)
Java2024-12-16

java数组如何定义

Java中定义数组的语法有两种:动态方式(指定数组的长度)格式: (推荐学习:java课程)数据类型[] 数组名字 = new 数组存储的数据类型[长度];[] : 表示数组。数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。new
java数组如何定义
2021-05-19

Python自定义一个数组类,支持数组之

class MyArray: '''保证输入的内容是整型、浮点型''' def ___isNumber(self, num): if not isinstance(num, (int,float)):
2023-01-31

matlab如何定义一个变量

这篇文章主要介绍“matlab如何定义一个变量”,在日常操作中,相信很多人在matlab如何定义一个变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”matlab如何定义一个变量”的疑惑有所帮助!接下来,请跟
2023-07-04

c++可变数组如何定义

在C++中,可变数组可以使用动态内存分配的方式进行定义和操作。以下是几种常见的定义可变数组的方式:使用指针和new操作符:int size = 10; // 可变数组的大小int* arr = new int[size]; // 使用n
c++可变数组如何定义
2023-10-28

python如何定义一个空的一维数组

在Python中,可以使用以下方式定义一个空的一维数组:使用空列表定义: array = []使用内置的array库定义:import arrayarray = array.array('typecode')其中,typecode表
2023-10-23

Java 中如何定义空数组?(java空数组怎么定义)

在Java编程中,定义空数组是一个常见的操作。空数组是指没有任何元素的数组,它在很多情况下都非常有用,例如初始化一个数组变量、传递一个空数组参数等。以下是在Java中定义空数组的两种常见方法:方法一:使用数组字面量在J
Java 中如何定义空数组?(java空数组怎么定义)
Java2024-12-14

Java如何以指定长度将一个值填充进数组

Java中使用特定长度填充数组。fill()方法可将指定值填充到指定长度的数组中。它将扩展或截断数组以匹配指定长度。此外,还可以使用循环或Java8+Streams进行填充。注意指定填充长度、类型安全和对于大型数组使用高效方法,例如Streams。
Java如何以指定长度将一个值填充进数组
2024-04-02

Java中如何自定义一个类加载器

这篇文章主要介绍了Java中如何自定义一个类加载器,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-21

如何在Java中自定义一个枚举类

本文章向大家介绍如何在Java中自定义一个枚举类的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录