最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java版C語言版簡單使用靜態(tài)語言實現(xiàn)動態(tài)數組的方法

 更新時間:2017年10月20日 11:03:47   作者:defmain  
本文給大家分享java版和C語言版簡單使用靜態(tài)語言實現(xiàn)動態(tài)數組的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧

動態(tài)語言相對于靜態(tài)語言的一個優(yōu)勢,就是數組可以不需要預先確定大小,對于一些數組長度不確定的場景下是非常有用的。像PHP,只需要聲明一下數組 $arr = array() 然后就可以直接 $arr[] = 1,$arr[] = 2,$arr[] = 3...這樣一直加元素了,刪除一個元素就直接使用unset($arr[1]),元素的空間就被釋放了,而C和JAVA原生的數組就沒有這么方便,聲明的時候就必須先預先確定長度,由編譯器分配相應的內存空間。不過通過一些巧妙的做法,也是可以實現(xiàn)一樣的功能的,這也是本文的主要內容。

JAVA版

JAVA自帶了一個集合類ArrayList,可以實現(xiàn)動態(tài)數組的功能,相比原生的數組,使用起來非常方便。在閱讀Tomcat源碼的時候,發(fā)現(xiàn)出于性能考慮使用了原生的數組,而沒有直接使用原生的ArrayList,自己實現(xiàn)了一個動態(tài)數組,下面的這個實現(xiàn)就是直接從Tomcat的源碼借鑒過來的。

實現(xiàn)思路

動態(tài)添加元素

初始化一個數組,大小固定。

獲取源數組的大小,在方法區(qū)里面申請一個比原有數組大1位的數組。

關鍵的內容是,調用System.arraycopy(src, 0, dest, 0, src.length),從src的0位復制src.length位到dest的0位,這里用系統(tǒng)自帶的方法比較方便,也可以自己寫一個循環(huán)進行復制。

把要添加的元素放到新數組的最后一位。

返回元素,把新數組的指針復制到原數組變量,JAVA的數組是引用型的,執(zhí)行 src=dest 后,兩者實際上是指向同一個內存地址。

動態(tài)刪除元素

初始化一個數組,大小固定。

在方法區(qū)申請一個比原生數組小一位的數組

從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語言中實現(xiàn)動態(tài)數組相對比較復雜一點,因為C語言要對指針,內存進行操作。開始之前需要定義一個結構體arrayList和結構體變量ArrayList,里面包含兩個數組,一個是int類型的指針,用來指向存儲int型數組的內存,還有一個count,用來記錄數組的長度,因為通過malloc(),realloc()進行動態(tài)內存分配(程序執(zhí)行的時候分配),用sizeof()是無法獲取到正確的內存長度的,所以必須要定義一個變量count去記錄到底向系統(tǒng)申請了多少內存。為什么需要用malloc而不是像JAVA那樣直接用new int[] 來創(chuàng)建一個數組呢?這就涉及了JAVA和C內存分配的一個區(qū)別,JAVA方法里面的數組是存放在堆中,而C函數里面的數組分配的內存是存放在棧中的,函數執(zhí)行結束,數組的內存空間就會被釋放,因此需要用malloc從棧申請空間。

實現(xiàn)思路

動態(tài)添加元素

通過realloc() 重新申請一個新的內存空間,空間比當前數組的大一個int長度,通過int*類型的指針指向該空間。

把數據放在數組的最后一位。

把記錄的數組長度進行++操作。

動態(tài)刪除元素

判斷函數傳入的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);
}
/********************************
函數名:initArrayList()
功能:初始化ArrayList結構體
輸入:ArrayList類型結構體指針
輸出:無
*/
void initArrayList(ArrayList* arrayList) {
  arrayList->data = NULL;
  arrayList->count = 0;
}
/*******************************
函數名:arrayListAdd()
功能:添加數據到ArrayList類型結構體里面的數組
輸入:ArrayList類型結構體指針,int類型數據
輸出:無
*/
void arrayListAdd(ArrayList* list, int data) {
  int count = list->count;
  //重新申請空間,空間比現(xiàn)在的長度大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("申請空間失敗");
  }
}
/*******************************
函數名:arrayListRemove()
功能:根據index刪除ArrayList類型結構體里面的數組元素
輸入:ArrayList類型結構體指針,int類型索引
輸出:無
*/
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("申請空間失敗");
  }
}
/********************************
函數名:打印所有數組
輸入:ArrayList類型結構體
*/
void printAll(ArrayList list) {
  for (int i = 0; i < list.count; i++) {
    printf("%d \r\n", list.data[i]);
  }
}

總結

以上所述是小編給大家介紹的Java簡單使用靜態(tài)語言實現(xiàn)動態(tài)數組,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • java實現(xiàn)英文翻譯程序

    java實現(xiàn)英文翻譯程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)英文翻譯程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • IDEA中maven無法下載源碼的解決方法

    IDEA中maven無法下載源碼的解決方法

    這篇文章主要為大家詳細介紹了當IDEA中maven無法下載源碼時改如何解決,文中通過圖文為大家進行了詳細講解,需要的小伙伴可以參考一下
    2023-08-08
  • MybatisPlus使用@TableId主鍵id自增長無效的解決

    MybatisPlus使用@TableId主鍵id自增長無效的解決

    本文主要介紹了MybatisPlus使用@TableId主鍵id自增長無效的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • java按字節(jié)截取帶有漢字的字符串的解法(推薦)

    java按字節(jié)截取帶有漢字的字符串的解法(推薦)

    下面小編就為大家?guī)硪黄猨ava按字節(jié)截取帶有漢字的字符串的解法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • java爬取并下載酷狗TOP500歌曲的方法

    java爬取并下載酷狗TOP500歌曲的方法

    這篇文章主要介紹了java爬取并下載酷狗TOP500歌曲的方法,非常具有實用價值,需要的朋友可以參考下
    2019-01-01
  • 查看import的類是出自哪個jar包的方法

    查看import的類是出自哪個jar包的方法

    下面小編就為大家?guī)硪黄榭磇mport的類是出自哪個jar包的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Mybatis如何使用動態(tài)語句實現(xiàn)批量刪除(delete結合foreach)

    Mybatis如何使用動態(tài)語句實現(xiàn)批量刪除(delete結合foreach)

    這篇文章主要介紹了Mybatis如何使用動態(tài)語句實現(xiàn)批量刪除(delete結合foreach),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java  文件鎖的簡單實現(xiàn)

    java 文件鎖的簡單實現(xiàn)

    這篇文章主要介紹了java 文件鎖的簡單實現(xiàn)的相關資料,需要的朋友可以參考下
    2017-07-07
  • java中volatile關鍵字的作用詳解

    java中volatile關鍵字的作用詳解

    這篇文章主要介紹了java中volatile關鍵字的作用詳解,volatile可以保證,若一個線程改變了某塊內存的值,其他線程是可見的,以至于其他線程能及時更新這塊內存,需要的朋友可以參考下
    2023-09-09
  • java輸入空行結束問題

    java輸入空行結束問題

    這篇文章主要介紹了java輸入空行結束問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

景宁| 潍坊市| 新丰县| 于田县| 桃园市| 南郑县| 托克逊县| 屏东市| 东乡族自治县| 米林县| 伽师县| 石门县| 寻乌县| 凌海市| 栾城县| 青神县| 宿迁市| 民和| 雅安市| 聊城市| 天祝| 临海市| 孟村| 青岛市| 正蓝旗| 夹江县| 沧州市| 咸阳市| 尤溪县| 伊吾县| 赤峰市| 茌平县| 巫山县| 彩票| 汝城县| 浪卡子县| 江阴市| 阳西县| 仁布县| 读书| 武乡县|