浅谈一维数组(基础分析向)

什么是数组???

数组只是相同类型的,用一个标识符名称封装到一起的一个对象序列基本类型数据序列

一维数组的初始化

数组的初始化方式总共有三种分别为:
以int类型数组为例:

1. int[] arr1 = {1,2,3,4,5,6};
2. int[] arr2 = new int[] {1,2,3,4,5,6};
3. int[] arr3 = new int[5];

第一种保留了C++语言创建方法,但在Java中数组实际上是以第二种方式去创建。
第三种数组的创建只开辟了能容纳5个整型量的空间,并没有对每个“盒子”赋值,但Java里会在底层上自动赋予初始值0;所以第三种实际上是创建了5个值为0的整型序列。也就是 arr3 = {0,0,0,0,0}。

那么我们能否既定义大小,并且又初始化呢???

在这里插入图片描述
所以说,在定义的时候需要制定所需元素的个数或者制定元素初始值,让程序自动推出数组元素个数,不能定义数组大小的同时初始化
鱼和熊掌不可兼得。

一维数组的遍历

从现在开始我们将牵扯到数组最恶心的地方,也就是边界问题。
首先我们先创建一个数组。

  int[] arr = new int[]{1, 2, 3, 4, 5};

第一种遍历方式:利用我们最经常使用的控制语句for循环去实现

  for(int i = 0 ; i < arr.length ; i++){
  
      System.out.print(arr[i]+ “ ”);

  }

arr.length 中的 . length 是Java 中的Arrays类提供的一个方法,能统计当前数组的长度。

运行结果:
在这里插入图片描述
第二种方式:利用foreach语句

 for(int value : arr)
        System.out.print(value + “ ”);
    }

运行结果同上

第三种方式:直接利用Arrays类中的toString方法

    System.out.println(Arrays.toString(arr));

结果如下
在这里插入图片描述

一维数组的拷贝

拷贝有四种方法
我们假设把一维数组 arr 的值拷贝给一维数组 brr

首先我们先创建 brr 只赋予它与 arr 同样的空间。

    int[] brr = new int[arr.length];

第一种方法:与遍历相似,也是利用我们的for循环

    for(int i = 0 ; i < arr.length ; i++){
        brr[i] = arr[i];
    }

最后让我们打印 arr 和 brr 检测

    System.out.println("arr: " + Arrays.toString(arr));
        System.out.println("brr: " +Arrays.toString(brr));

运行结果如下
在这里插入图片描述

第二种方法:直接利用 Arrays类中的copyOf方法

    brr = Arrays.copyOf(arr,arr.length);

其中,copyOf方法里的两个变量分别意味着,被拷贝数组拷贝长度

第三种方法:利用Arrays中的clone方法

  brr = arr.clone();

第四种方法:利用System 中 arraycopy方法

    System.arraycopy(arr,0,brr,0,arr.length);

arraycopy的方法中有5个变量,分别代表着:被拷贝的数组名称,从那个下表开始被拷,拷给哪个数组,从那个下标开始拷,拷贝多长。

一维数组内存分析

在main()方法中创建一个数组的实际内存分析

 int[] arr = new int[]{1,2,3,4};

main()方法储存在Java栈中,而在main()方法里创建一个数组,实际上只是开辟了一个储存地址的空间。
例如上段代码那样,在Java栈中只开辟了一个存储地址的空间,名字叫arr,保存指向堆上的实际数组的地址(假设是0x1111)。
也就是说,在Java 栈里,并不存在实际的数组,我们创建的数组实际上存储在Java堆(堆是一种通用内存池,用于存放所有的Java对象。)中,开辟了arr数组 4x4字节 的空间 ,分别保存整型数字1,2,3,4.
在这里插入图片描述
那么我们在进行数组传参时,我们只是对堆上的数组进行操作。
例如,扩容操作

arr = Arrays.copyOf(arr,arr.length+1);

我们暂不解析Arrays类中的copyOf的底层操作,我们只从字面上看,自己被操作再返回给自己,实际上就是在堆上进行扩容操作,这时在堆上已经是一个新的数组空间地址也随之改变,也就是说,最后返回的实际上是新数组的地址
在这里插入图片描述
(本文部分内容摘自《Java编程思想》)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值