数组的定义与使用-----Java篇

1、数组的基本概念

1、数组的创建

int[] array = new int[10];//创建一个存放10个int类型元素的数组
double[] array2 = new double[5]; // 创建一个可以存放5个double类型元素的数组
String[] array3 = new double[3]; // 创建一个可以存放3个字符串元素的数组

在这里插入图片描述

2、数组的初始化

1、动态初始化

创建数组时,可以任意指定数组的元素个数;

int[] array = new int[10];
//'10'就是我指定的数组中的元素个数,这是可以任意改变的

2、静态初始化

int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = new String[]{"hell", "Java", "!!!"};

注意:
1、静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中 元素个数来确定数组的长度;
2、静态初始化时, {}中数据类型必须与[]前数据类型一致;
3、静态初始化可以简写,省去后面的new xxx[ ];

静态初始化也可以写成下面这样:

int[] array;
double[] array1;
float[] array2;

注意这些数组我们并没有对他进行初始化,他们中存放的是什么呢?
看下表:
在这里插入图片描述
在这里插入图片描述
如果数组中存储元素类型为引用类型,默认值为null

3、数组的使用

1、数组元素的访问

与c语言相同,我们通过下标对数组进行访问。同样的,我们也可以通过下标来改变数组原有的值。

int[] array = {1,2,3,4};
array[2] = 99;
System.out.println(array[2]);

在这里插入图片描述
如图所示:array[2]的值变成了99;
与c语言不同的是,java中出现数组越界的情况会直接报错
在这里插入图片描述
报错内容:
在这里插入图片描述

2、遍历数组

什么是 ‘遍历’
将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作。
注意:数组对象.length 来获取数组的长度
可以使用for each来遍历数组

int[] array = {1, 2, 3};
for (int x : array) {
//int x ; x代表数组中的元素,int代表元素类型
   System.out.println(x);
}

运行结果
在这里插入图片描述
for-each 是 for 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错

2、数组是引用类型

1、认识JVM内部结构

在这里插入图片描述
1、程序计数器 : 只是一个很小的空间, 保存下一条执行的指令的地址。
2、虚拟机栈: 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了

3、本地方法栈: 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量。
4、堆: JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销
毁。

5、方法区: 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. 方法编译出的的字节码就是保存在这个区域。
目前我们着重了解一下堆和虚拟机栈这两部分即可。

2、基本类型变量与引用类型变量的区别

1、基本数据类型创建的变量:称为基本变量,该变量空间中直接存放的是其所对应的值
2、引用数据类型创建的变量:一般称为对象的引用,其空间中存储的是对象所在空间的地址
举例:

public static void main() {
int a = 10;
int b = 20;
int[] arr = new int[]{1,2,3};
}

在上述代码中,a、b、arr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。
a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。
array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。
看图解释更加清晰:
在这里插入图片描述
引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象

3、再谈引用变量

看代码:

int[] array1 = new int[3];
array1[0] = 10;
array1[1] = 20;
array1[2] = 30;

int[] array2 = new int[]{1,2,3,4,5};
array2[0] = 100;
array2[1] = 200;

array1 = array2;

array1[2] = 300;
array1[3] = 400;
array2[4] = 500;
for (int i = 0; i < array2.length; i++) {
   System.out.println(array2[i]);
}

运行结果:
在这里插入图片描述
可能会有小伙伴疑惑这是为什么?
下面我画图来讲解一下
在这里插入图片描述
这是刚开始状态;
经过==array1 = array2;==后,array2中的内容放到了array1中,因此,内存中的内容变成了下图这样
在这里插入图片描述

此时,array1指向的是array2所指向的数组;因此对array1进行操作,实际上是对array2数组操作;
在这里插入图片描述

4、认识null

相信学过从语言的小伙伴对null并不陌生,在C语言中null代表空指针;在 Java 中null表示 “空引用” , 也就是一个不指向对象的引用;

int[] arr = null;
System.out.println(arr[0]);

报错:
在这里插入图片描述
注意:注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联;

3、数组的应用场景

1、保存数据

数组可以保存一组相同类型的数据

2、数组可以作为函数参数

函数的参数可以有两种,一种是基本数据类型,如 int、short等,另一类就是引用数据类型,例如数组

public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}
 // 执行结果
a[0] = 10
arr[0] = 10
//因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的

总结:所谓的 “引用” 本质上只是在栈上开辟了一块空间里面只存了一个地址.。Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中,这样可以避免对整个数组的拷贝(提高效率,减少浪费)。

3、作为函数的返回值

public static int[] Findmax(int[] array){
   int[] ret = {array[0]};
   for (int i = 0; i < array.length; i++) {
       if(array[i] > ret[0]){
           ret[0] = array[i];
       }
   }
   return ret;
}
public static void main(String[] args) {
   int[] array = {1,3,7,2};
   int[] ret = Findmax(array);
   System.out.println(Arrays.toString(ret));
}

如上面代码所示,函数参数是数组,并且返回值也是数组,最终以字符串的形式打印出了array数组中的最大值

4、二维数组

1、二维数组的创建与初始化

二维数组本质上也是一维数组,只不过每个元素又是一个一维数组。

数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
//举个简单的例子,创建一个存放整型的二维数组
int[][] array = new int[2][3]{1,2,3,4,5,6}
int[][] arr = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};
for (int row = 0; row < arr.length; row++) {
    for (int col = 0; col < arr[row].length; col++) {
    System.out.printf("%d\t", arr[row][col]);
}
System.out.println("");//换行
}

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

2、二维数组的存储

相信大家对二维数组在内存中是如何存储的一定充满好奇心,那么我来为大家解答一下:

public static void main(String[] args) {
  int[][] array = new int[2][3];
   System.out.println(Arrays.toString(array));
}

当我们执行上述代码时,我们会惊讶的发现,我们打印出来的是两个地址
在这里插入图片描述如果我们一定要打印出二维数组的内容,就需要用到操作数组的工具类Arrays.deepToString,即深度打印

 public static void main(String[] args) {
    int[][] array = new int[2][3];
    System.out.println(Arrays.deepToString(array));
 }

在这里插入图片描述
java的二维数组与C语言存储有稍微不同之处
在这里插入图片描述

int[][] array = new int[2][3];
System.out.println(array[0]);
System.out.println(Arrays.toString(array[0]));
System.out.println(array[1]);
System.out.println(Arrays.toString(array[1]));

在这里插入图片描述
看代码我们不难看出array0下标与一下标存放的是地址,只有将其转换为字符串后,才可以打印出值

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值