Java自定义长度可变数组的操作

 更新时间:2021年02月04日 09:49:10   作者:miss_rong  
这篇文章主要介绍了Java自定义长度可变数组的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我们都知道数组是线性的、类型固定、内存地址连续、定长的,主要是数组一旦被定义,那么它的长度也就定下来了,只能添加有限的数据。而长度可变的数组是要将这个长度打破,实现数组数据无限增加

那么定义长度可变的数组就可以用两个数组来实现数组长度的变化。为了避免每次增加数据或删除数据时都要重新开辟空间,我先设定原数组为固定长,在当数组放满时,一次增加一定的长度,这样 节省了开辟空间的时间

因为数组里的数据类型是不确定的,所以用泛型比较好

public class MyList<E> {
 private int rongliang;//容量
 private int zengliang;//增量
 private int num;//数量
 
 //定义一个原数组
 //Object类包含所有的类型,所以定义数组是用Object类
 private Object[] src;
 
 //三个不同的构造方法
 public MyList(){
 this(10,10);
 }
 
 public MyList(int rongliang){
 this(rongliang,10);
 }
 
 public MyList(int rongliang,int zengliang){
 this.rongliang = rongliang;
 this.zengliang = zengliang;
 src = new Object[rongliang];
 }
}

在MyList中实现在数组中添加数据,要考虑到数组中的数据数量小于数组长度时,可以直接在数组为null处添加数据,但当数组的数量大于等于数组长度时,要先重新定义一个数组,长度是原数组加增量,然后再添加数据

public void add(E s){
 //判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容
 if(num>=src.length){
 //定义一个新的数组,长度是原有的长度加增量
 Object arr[] = new Object[src.length+zengliang];
 //拷贝数组数据
 System.arraycopy(arr, 0, arr, 0, src.length);
 src = arr;
 }
 //如果num不大于数组的长度,则不需扩容,直接加入
 //如果num大于等于数组长度,则需执行上面的if语句扩容,再加入数据
 //最后num++
 src[num++] = s;
 }

取出指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常

public E get(int index){
 //抛出异常
 if(index<0 || index>=num){
 throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
 }
 //强制转换成E类型
 return (E)src[index];
 }

修改指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常

public void modify(int index,E s){
 //抛出异常
 if(index<0 || index>=num){
 throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
 }
 src[index] = s;
 }

删除指定下标的数据,当数组中null值的长度大于等于增量时,要将数组的容量减小,防止浪费

public void delete(int index){
 //抛出异常
 if(index<0 || index>=num){
 throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
 }
 //将>index的数据依次向前移动一位
 System.arraycopy(src, index+1, src, index, num-index-1);
 num--;
 //减少容量的方法
 if(src.length-num>=zengliang){
   //定义一个新的数组,长度是原先数组的长度减去增量
     Object arr[] = new Object[src.length-zengliang];
   //拷贝数组
     System.arraycopy(src, 0, arr, 0, num);
   src = arr;
 }
 }

将指定下标处的数据改为指定的数据

public void insert(int index,E s){
 //抛出异常
 if(index<0 || index>=num){
 throw new IndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
 }
 //判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容
 if(num>=src.length){
   //定义一个新的数组,长度是原有的长度加增量
   Object arr[] = new Object[src.length+zengliang];
   //拷贝数组数据
   System.arraycopy(src, 0, arr, 0, src.length);
   src = arr;
 }
 //将>index的数据依次向后移动一个位置
 //arraycopy()是可以将数据自己拷贝给自己
 System.arraycopy(src, index, src, index+1, num-index);
 //插入数据
 src[index] = s;
 num++;
 }

最后在写个获取数组中数据的个数,而不是数组的长度

public int size(){
   return num;
 }

写个测试类,来测试这个长度可变的数组是否可行

public class test {
 
 public static void main(String[] args) {
 //创建一个MyList对象
 // 在创建对象时明确类型
 MyList<String> list = new MyList<String>();
 
 //添加数据
 list.add("a");
 list.add("b");
 list.add("c");
 list.add("d");
 list.add("e");
 list.add("f");
 list.add("g");
 list.add("h");
 list.add("i");
 list.add("j"); 
 
 //遍历数组
 for(int i=0;i<list.size();i++){
 String s = list.get(i);
 System.out.print(s+" ");
 }
 
 System.out.println("");
 int n = list.size();
   System.out.println("数据个数为:"+n);
 System.out.println("**********************************************");
 
 //修改指定位置的数据
 list.modify(1, "QQ");
 
 //遍历数组
 for(int i=0;i<list.size();i++){
 String s = list.get(i);
 System.out.print(s+" ");
 }
 
 System.out.println("");
 int m = list.size();
 System.out.println("数据个数为:"+m);
 System.out.println("**********************************************");
 
 //删除指定位置的数据
 list.delete(2);
 
 //遍历数组
 for(int i=0;i<list.size();i++){
 String s = list.get(i);
 System.out.print(s+" ");
 }
 
 System.out.println("");
   int k = list.size();
   System.out.println("数据个数为:"+k);
 System.out.println("**********************************************");
 
 //在指定位置插入指定的数据
 list.insert(3, "zr");
 list.insert(3, "qi");
 
 //遍历数组
 for(int i=0;i<list.size();i++){
 String s = list.get(i);
 System.out.print(s+" ");
 }
 
 System.out.println("");
 int h = list.size();
   System.out.println("数据个数为:"+h);
 System.out.println("**********************************************");
 }
 
}

最终数组的结果为:

a b c d e f g h i j 
数据个数为:10
**********************************************
a QQ c d e f g h i j 
数据个数为:10
**********************************************
a QQ d e f g h i j 
数据个数为:9
**********************************************
a QQ d qi zr e f g h i j 
数据个数为:11
**********************************************

补充:在Java中创建一个自定义长度的数组并输入每个元素

用到知识点:数组、方法、Scanner、for循环。

作业:

package Array;
import java.util.Scanner;
public class InputArray {
public static void main(String[] args) {
shuzu();//方法调用 
 }
 //方法定义
 public static void shuzu() {
 
 //将输入的数字作为数组的长度
 Scanner sz = new Scanner(System.in);
 System.out.println("请输入数组长度:");//提示可以操作
 int[] cd = new int[sz.nextInt()];//数组初始化完成
 System.out.println("当前数组长度定义为:"+cd.length);//再提示一下结果
 
 //用for循环为每一个元素赋值
 for (int i = 0; i < cd.length; i++) {
  int q = i+1;//这里q用作提示,避免提示出第0个元素。
  System.out.println("请输入第"+q+"个元素的值:");
  cd [i] = sz.nextInt();
  System.out.println("第"+q+"个元素定义为"+cd[i]+"。"); 
  }
  sz.close();
  
  //数组内各元素已经完成赋值,但是再用for循环遍历一次
 System.out.print("数组内元素全部完成赋值:");//继续提示一下
 for (int i2 = 0; i2 < cd.length; i2++) {  
  if(i2 == cd.length-1) {
  System.out.print(cd[i2]+"。");
  }else {
  System.out.print(cd[i2]+"、");
  }
 }
 return;//方法结束,rentun;
 }
 
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • resultMap标签中里的collection标签详解

    resultMap标签中里的collection标签详解

    这篇文章主要介绍了resultMap标签中里的collection标签,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Mybatis-Plus多表关联查询的使用案例解析

    Mybatis-Plus多表关联查询的使用案例解析

    这篇文章主要介绍了Mybatis-Plus多表关联查询的使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • java实现收藏功能

    java实现收藏功能

    这篇文章主要为大家详细介绍了java实现收藏功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • HttpServletResponse乱码问题_动力节点Java学院整理

    HttpServletResponse乱码问题_动力节点Java学院整理

    这篇文章主要介绍了HttpServletResponse乱码问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • SpringBoot如何使用p6spy监控数据库

    SpringBoot如何使用p6spy监控数据库

    这篇文章主要介绍了SpringBoot如何使用p6spy监控数据库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java中如何灵活获取excel中的数据

    Java中如何灵活获取excel中的数据

    这篇文章主要给大家介绍了关于Java中如何灵活获取excel中的数据,在日常工作中我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,需要的朋友可以参考下
    2023-07-07
  • SpringBoot2零基础到精通之配置文件与web开发

    SpringBoot2零基础到精通之配置文件与web开发

    SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,本篇让我们一起学习配置文件以及web相关的开发
    2022-03-03
  • Java线程优先级变量及功能

    Java线程优先级变量及功能

    这篇文章主要介绍了Java线程优先级变量及功能,关于优先级的问可能有两个或更多线程被分配了相同的优先级,那么它们的执行取决于操作系统,更多相关介绍,需要的小伙伴可以参考一下
    2022-06-06
  • Java多线程Thread , Future , Callable , FutureTask的使用

    Java多线程Thread , Future , Callable ,

    本文主要介绍了Java多线程Thread , Future , Callable , FutureTask的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Java实现贪吃蛇大作战小游戏(附源码)

    Java实现贪吃蛇大作战小游戏(附源码)

    今天给大家带来的是小项目是 基于Java+Swing+IO流实现 的贪吃蛇大作战小游戏。实现了界面可视化、基本的吃食物功能、死亡功能、移动功能、积分功能,并额外实现了主动加速和鼓励机制,需要的可以参考一下
    2022-07-07

最新评论