栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 1、数组的基本概念
    • 1、数组的创建
    • 2、数组的初始化
      • 1、动态初始化
      • 2、静态初始化
    • 3、数组的使用
      • 1、数组元素的访问
      • 2、遍历数组
  • 2、数组是引用类型
    • 1、认识JVM内部结构
    • 2、基本类型变量与引用类型变量的区别
    • 3、再谈引用变量
    • 4、认识null
  • 3、数组的应用场景
    • 1、保存数据
    • 2、数组可以作为函数参数
    • 3、作为函数的返回值
  • 4、二维数组
    • 1、二维数组的创建与初始化
    • 2、二维数组的存储

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("%dt", 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下标与一下标存放的是地址,只有将其转换为字符串后,才可以打印出值

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1036682.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号