Java动态数组的实现
众所周知,在Java中,数组的特点是
> 数组是用来存储一组有序的数据的容器> 数组中存储数据的地址是连续的> 数组中存储数据的类型是一致的> 数组一旦创建、长度不可改变
因此,数组也有缺点,比如说,数组一旦创建,长度不可改变。这样的话,就不怎么利于我们的使用。我们学习的数组都是静态数组,其实在很多的时候,静态数组根本不能满足我们编程的实际需要,比方说我们需要在程序运行过程中动态的向数组中添加数据,这时我们的静态数组大小是固定的,显然就不能添加数据,要动态添加数据必须要用到动态数组,动态数组中的各个元素类型也是一致的。
在我们的学习使用中,经常要对数组进行 增加、删除、改变元素、查找元素等等...一系列操作。所以普通的数组已经满足不了我们的需求,哪有什么办法可以解决这个问题?在这里,我们就要用到动态数组。
动态数组类的主体
public class IntArray {/*** 作用是用来存储 真正的数据的*/private int[] array = new int[10];/*** 存储 数组的真实 有效长度*/private int size;/*** 创建一个空的对象*/public IntArray() {}/*** 将数组转成动态数组** @param array*/public IntArray(int[] array) {this.array = array;this.size = array.length;}/*** 获取动态数组的有效长度** @return*/public int size() {return this.size;}
}
对动态数组添加方法
向动态数组的指定位置添加元素
/*** 向动态数组的指定位置添加元素** @param index* @param ele*/public void add(int index, int ele) {if (index > size || index < 0)throw new IndexOutOfBoundsException("数组超出了IntArray的范围,期待的值是0~" + (size - 1) + ",实际传入的是" + index);// 尝试扩容grow();// 从 index 位置 开始 ,所有后面的元素都要进行移动for (int i = size - 1; i >= index; i--) {array[i + 1] = array[i];}// 在 index位置插入元素array[index] = ele;// 有效长度 +1size++;}
删除指定位置的元素,并返回删除的元素
/*** 定义一个方法、用来删除指定位置的元素,并返回被删除的元素*/public int remove(int index) {// 检查索引checkIndex(index);// 删除指定位置的元素// 获取 index 位置的元素int ele = get(index);// 从删除元素的位置开始 移动后面所有的元素for (int i = index; i < size - 1; i++) {array[i] = array[i + 1];}// 将 有效长度 -1array[size - 1] = 0;size--;return ele;}
修改动态数组 指定位置的元素
/*** 修改动态数组 指定位置的元素** @param index* @param ele*/public void set(int index, int ele) {// 检查索引checkIndex(index);// 修改 index 的位置元素为 elearray[index] = ele;}
删除指定的第一个元素,移除失败、返回false
/*** 删除指定的第一个元素,移除失败、返回false** @param ele* @return*/public boolean removeElement(int ele) {// 获取 ele 元素出现的位置int index = indexOf(ele);if (index == -1) return false;// 删除 index 位置的元素remove(index);return true;}
删除指定个数的元素
count > 0 : 从前删除 count个 ele元素
count = 0 : 删除所有 ele元素
count <0 : 从后删除 count 个 ele 元素
/*** void removeElement(int ele , int count) : 删除指定个数的元素* count > 0 : 从前删除 count个 ele元素* count = 0 : 删除所有 ele元素* count <0 : 从后删除 count 个 ele 元素** @param ele* @param count*/public void removeElement(int ele, int count) {// 如果 count >=0 , 则 删除 指定个数的元素(从前到后)int n = 0;if (count >= 0) {for (int i = 0; i < size; i++) {if (ele == array[i]) {// 删除 第 i 个位置的元素remove(i--);if (++n == count) return;}}} else {for (int i = size - 1; i >= 0; i--) {if (ele == array[i]) {remove(i);if (--n == count) return;}}}}
获取 指定位置的元素
/*** 根据索引 获取 对应位置的元素** @param index* @return*/public int get(int index) {// 检查索引checkIndex(index);return array[index];}
动态数组的扩容
/*** 内部使用的扩容*/private void grow() {if (size >= array.length) {// 创建一个新数组int[] newarray = new int[array.length << 1];// 将 原数组中的有效内容拷贝到新数组中System.arraycopy(array, 0, newarray, 0, size);// 将 新数组 赋值给 当前类的 array 属性this.array = newarray;}}
toString方法的重写
public String toString() {if (array == null)return "null";int iMax = size - 1;if (iMax == -1)return "[]";StringBuilder b = new StringBuilder();b.append('[');for (int i = 0; ; i++) {b.append(array[i]);if (i == iMax)return b.append(']').toString();b.append(", ");}}
加入上述方法,动态数组的基本功能就可以实现。后期大家在使用的时候,还可以添加自己,需要的方法。
Java动态数组的实现相关推荐
- Java动态数组的用法详解
Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList.下面介绍一下ArrayL ...
- java 动态数组_Java动态数组的用法详解
Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList.下面介绍一下ArrayL ...
- java动态数组的实现的_基于Java的动态数组分析与实现
动态数组 概念 基于Java提供的静态数组封装自己的动态数组,动态数组涉及的组成部分如下图所示. 组成部分解读data:静态数组,通过泛型支持多种类型的元素:private E[] data;. si ...
- java动态数组的实现的_Java实现数据结构之【动态数组】
数组是学习编程语言时较先接触到的一种数据结构,本章基于Java的静态数组实现动态数组,并进行简单的复杂度分析 数组相信各位都知道,那什么是动态数组呢?我们定义一个数组后,一般长度会直接定义好,如果数组 ...
- 使用Java动态数组的实现
使用Java中的数组 int[] arr=new int[10]; for(int i=0;i<arr.length;i++)arr[i]=i; int[] scores =new int[]{ ...
- 自定义实现Java动态数组
写在前面 通常,我们会用高级程序语言中的数组来描述线性表的顺序存储结构,而这种顺序表的特点时逻辑顺序与物理顺序相同,即数组中元素的内存地址是连续的. 那么很显然,这样的数组(静态数组)在空间被占满后再 ...
- Java动态数组和泛式
1.认识动态数组和泛式 之前我们所使用的数组最大的问题在于其可操作性弱,当我们定义完一个数组并存入相应元素后,很难对其中的元素做出增减操作,且数组的长度也不可变,当我们要存入超出数组长度的元素时,就需 ...
- java动态数组的实现_动手编写—动态数组(Java实现)
目录 数组基础回顾 自定义动态数组 动态数组的设计 抽象父类接口设计 抽象父类设计 动态数组之DynamicArray 补充数组缩容 全局的关系图 声明 数组基础回顾 1.数组是一种常见的数据结构,用 ...
- Java动态数组和静态数组详解
前言必读 读者手册(必读)_云边的快乐猫的博客-CSDN博客 数组: 概念:数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致,不能出现混合类型 1.什么数据类型就只能储存什么数据元素,比 ...
- java 动态数组的应用
import java.util.*; import java.util.GregorianCalendar; /** * 测试数组列表的功能 * @author Administrator * */ ...
最新文章
- 丁磊:噢买尬,买它,华少别抢话
- 字节输入流读取字节数据
- NAS服务器局域网内IPad、手机、电视盒子等联网播放
- 排序算法 - 6种 - 超炫的动画演示 - Python实现
- Linux常用的分区方案及目录结构
- Seata多微服务互相调用_全局分布式事物使用案例_Account-Module 账户微服务说明---微服务升级_SpringCloud Alibaba工作笔记0064
- 2020已过大半,量子计算机发展如何了?
- 第六届蓝桥杯试题c/c++B组5
- 关于tomcat 开启gc日志后每隔1小时full gc的问题
- MATLAB 学习资料整理
- python文件处理——JSON格式文件
- nginx HTML网页乱码
- 从键盘上输入10个数,求其平均值。
- 国自然标书,600多份成功申请基金的标书 可下载
- 南京IT行业企业比较
- CSS 1px边框问题两个解决方案
- JVM垃圾回收说为学日益,为道日损
- 倒闭潮不断,众筹的生机在何处?
- linux sftp ftp 速率,linux上ftp和sftp简要操做命令
- ThinkPHP5文档学习——配置
热门文章
- Educoder计算机数据表示实验(HUST)第2关:汉字机内码获取实验
- “github中文版”来了,这个神器一键帮你汉化
- iar arm 6.4 破解
- 开源微服务框架 汇总
- ESAPI(一)索引的操作以及数据插入
- 联想r720安装固态_联想LenovoR720游戏笔记本如何安装固态硬盘
- Profibus通讯接口连接不上怎么办
- Java对象转Map的解决办法
- STM8L051F3串口接收中断超时判断数据结束
- 显卡刷bios改型号_显卡BIOS刷新方法(详细)