文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java和C语言如何使用静态语言实现动态数组

2023-05-31 00:24

关注

这篇文章将为大家详细讲解有关Java和C语言如何使用静态语言实现动态数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

JAVA版

JAVA自带了一个集合类ArrayList,可以实现动态数组的功能,相比原生的数组,使用起来非常方便。在阅读Tomcat源码的时候,发现出于性能考虑使用了原生的数组,而没有直接使用原生的ArrayList,自己实现了一个动态数组,下面的这个实现就是直接从Tomcat的源码借鉴过来的。

实现思路

动态添加元素

初始化一个数组,大小固定。

获取源数组的大小,在方法区里面申请一个比原有数组大1位的数组。

关键的内容是,调用System.arraycopy(src, 0, dest, 0, src.length),从src的0位复制src.length位到dest的0位,这里用系统自带的方法比较方便,也可以自己写一个循环进行复制。

把要添加的元素放到新数组的最后一位。

返回元素,把新数组的指针复制到原数组变量,JAVA的数组是引用型的,执行 src=dest 后,两者实际上是指向同一个内存地址。

动态删除元素

初始化一个数组,大小固定。

在方法区申请一个比原生数组小一位的数组

从index位开始,把后面的元素同时往前移动一位,覆盖要删除的元素。

返回元素,把改变原数组的指向到新数组

package demo;import java.util.Arrays;public class DiyArrayListDemo {  public static void main(String[] args){    int[] arr = {5,8,10};    System.out.println(Arrays.toString(arr));//=>[5, 8, 10]    arr = DiyArrayList.add(arr, 15);    arr = DiyArrayList.add(arr, 20);    arr = DiyArrayList.add(arr, 25);    System.out.println(Arrays.toString(arr)); //=>[5, 8, 10, 15, 20, 25]    arr = DiyArrayList.remove(arr, 1);    System.out.println(Arrays.toString(arr)); //=>[5, 10, 15, 20, 25]  }}class DiyArrayList{  public static int[] add(int[] src,Integer newData){    //定义目标数组,长度是比原始数组多一位    int[] dest = new int[src.length+1];    //从src的0位开始,复制到dest的0位置,复制长度是src的长度    System.arraycopy(src, 0, dest, 0, src.length);    //填充最后一位的值    dest[src.length] = newData;    return dest;  }  public static int[] remove(int[] src,Integer index){    //定义目标数组,长度是比原始数组少一位    int[] desc = new int[src.length-1];    for(int i=0; i<src.length; i++){      //超过索引index的数据往前移动一位      if(i > index){        desc[i-1] = src[i];      }else{        desc[i] = src[i];      }    }    return desc;  }}

C语言版

C语言中实现动态数组相对比较复杂一点,因为C语言要对指针,内存进行操作。开始之前需要定义一个结构体arrayList和结构体变量ArrayList,里面包含两个数组,一个是int类型的指针,用来指向存储int型数组的内存,还有一个count,用来记录数组的长度,因为通过malloc(),realloc()进行动态内存分配(程序执行的时候分配),用sizeof()是无法获取到正确的内存长度的,所以必须要定义一个变量count去记录到底向系统申请了多少内存。为什么需要用malloc而不是像JAVA那样直接用new int[] 来创建一个数组呢?这就涉及了JAVA和C内存分配的一个区别,JAVA方法里面的数组是存放在堆中,而C函数里面的数组分配的内存是存放在栈中的,函数执行结束,数组的内存空间就会被释放,因此需要用malloc从栈申请空间。

实现思路

动态添加元素

通过realloc() 重新申请一个新的内存空间,空间比当前数组的大一个int长度,通过int*类型的指针指向该空间。

把数据放在数组的最后一位。

把记录的数组长度进行++操作。

动态删除元素

判断函数传入的index是否有效。

把大于index的数组数据往前移动一个索引。

重新申请空间,数组长度缩减一个int长度。

把记录的数组长度进行--操作。

demo.h

//定义一个结构体,data里面储存的是int类型指数组,count存储的是数组的长度typedef struct arrayList {  int* data;  int count;} ArrayList;void initArrayList(ArrayList* list);void arrayListAdd(ArrayList* list, int data);void arrayListRemove(ArrayList* list, int index);void printAll(ArrayList list);demo.c#include <stdio.h>#include <stdlib.h>#include "test.h"int main() {  ArrayList arrayList;  initArrayList(&arrayList);  arrayListAdd(&arrayList, 10);  arrayListAdd(&arrayList, 13);  arrayListAdd(&arrayList, 15);  arrayListRemove(&arrayList, 2);  printAll(arrayList);}void initArrayList(ArrayList* arrayList) {  arrayList->data = NULL;  arrayList->count = 0;}void arrayListAdd(ArrayList* list, int data) {  int count = list->count;  //重新申请空间,空间比现在的长度大1个int长度  int* newDataArr = (int*)realloc(list->data,sizeof(int) * (++count));  if (newDataArr != NULL) {    list->data = newDataArr;    list->data[count - 1] = data;    list->count++;  }  else {    puts("申请空间失败");  }}void arrayListRemove(ArrayList* list, int index) {  if (index > list->count) {    puts("超出数组索引");    exit(1);  }  //把大于index的数组数据往前移动一个索引  for (int i = 0; i < list->count; i++) {    if (i > index) {      list->data[i - 1] = list->data[i];    }  }  int count = list->count;  //重新申请空间,数组长度缩减一个int长度  int *newDataArr = realloc(list->data, sizeof(int) * (--count));  if (newDataArr != NULL) {    list->data = newDataArr;    list->count = count;  }  else {    puts("申请空间失败");  }}void printAll(ArrayList list) {  for (int i = 0; i < list.count; i++) {    printf("%d \r\n", list.data[i]);  }}

关于“Java和C语言如何使用静态语言实现动态数组”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯