Java数组总结及内存分析

1 数组概述

1.1 概念

Java数组是一种常见的数据结构,可用于存储多个数据,每个数组元素存放一种数据。(但Java类与类之间可以支持继承关系,这样可能产生一个数组可以存放多种数据类型的假象)。这些无序排列的同类数据元素的集合称为数组。通常可通过数组元素的索引来访问数组元素。

1.2 优点

  • 提高代码的简洁性和效率。
  • 查询数据方便。

1.3 特点

  • 一旦数组初始化完成,长度便不可改变。
  • Java数组既可以存储基本数据类型的数据,也可以存储引用类型的数据。
  • Java数组本身就是一种引用类型。

2 快速入门

2.1 一维数组

2.1.1 一维数组定义

方法一
 语法:type[] arrayName;
 例子:int[] a;
 
方法二 
 语法:type arrayName[];
 例子:int a[]

tips: 推荐使用第一种写法,第一种有更能体现数组为一种数据类型,有更好的语义。第二种的写法的风格是来自于C/C++。而且第二种的写法也在逐渐的被淘汰掉。

2.1.2 数组的初始化

静态初始化:程序员指定数组的初始值,系统决定长度。 
 语法:arrayName = new type[]{element1, element2, ...};
 例子:a = new int[]{1, 2, 3};
 
动态初始化:程序员指定长度,系统为元素分配初始值。
 语法:arrayName = new type[length];
 例子:a = new int[100]

tips

  • java数组必须先初始化,然后才可以使用。所谓初始化就是为数组的元素分配内存空间,并为每个数组元素赋初始值。
  • 声明和初始化有一种简写,此时初始化为静态初始化。
type[] arratName = {element1, element2, ...};
int[] a = {1, 2, 3};

2.1.3 访问一维数组

数组经过定义和初始化后,可以通过数组的引用变量后紧跟一个方括号([]),方括号里是数组元素的索引值进行访问。

语法:arrayName[item];
例子:a[0];

2.1.4 案例一

案例分析:定义一个int型的一维数组,包含4个元素,求出其中的最大值。

代码实现:

public static void main(String[] args){
	int[] numbers;  //定义一个引用变量为numbers的一维数组
	numbers = new int[]{3142};  //对numbers进行静态初始化
	//也可以使用简写方法
	//int[] numbers = {3,1,5,2,7,9,0,6,4,8};
	int max = numbers[0];
	for(int i = 0; i < numbers.length; i++){
		if(max < numbers[i]){
			max = numbers[i];
		}
	}
	System.out.println("该数组的最大值为:"+ max);
}

2.2 二维数组

二维数组可以看成是一维数组为元素的一维数组。如果把二维数组作为矩阵的话,二维数组的第一个下标为行数,第二个下标为列数。

2.2.1 定义二维数组

语法:type[][] arrayName;
例子:int[][] numbers; 

2.2.2 初始化二维数组

静态初始化:程序员指定数组的初始值,系统决定长度。 
	语法:arrayNAme = new type{{element1},{element2},...};
	例子:numbers = new int{{1,2},{3,4},{5,6}};
	
动态初始化:程序员指定长度,系统为元素分配初始值。
	语法:arrayName = new type[item1][item2];
	numbers = new int[3][2];

tips
同样,二维数组也可以有简化的写法,声明的同时直接静态初始化

语法:type[][] arrayName = {{element1},{element2}{element3}};
例子:int[][] numbers={{1,2},{2,3}{4,5}};

2.2.3 案例二

案例分析:定义一个三列二行的二维数组,并求得二维数组中所有元素的值。
代码实现:

public static void main(String[] args) {
  //定义一个二维数组
  int[][] numbers;
  
  //对该二维数组进行初始化
  numbers = new int[][]{{1,2},{3,4},{5,6}};

  //也可以使用简写方式
  //int[][] numbers = {{1,2},{3,4},{5,6}};
  
  int sum = 0;
  for(int i = 0; i < numbers.length; i++){
   for(int j = 0; j < numbers[i].length; j++) {
    sum = sum + numbers[i][j];
   }
  }
  System.out.println("此二维数组元素的和为:" + sum);
 }

数组的内存分析

3.1 数组在内存中的定义


数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的。

如果想要访问堆内存中的数组元素,则程序只能通过arrayName[index]的形式实现。

数组的名称只是一个引用变量,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可以通过数组变量来访问数组元素。

如果想要在程序中访问数组对象本身,只能通过这个数组的引用变量来访问它。

实际的数组对象被存放在堆(heap)内存中,引用该数组的引用变量存储在栈(stack)内存中。

3.2 案例一内存分析

内存分析:以案例一分析

int[] numbers;  //定义一个引用变量为numbers的一维数组
numbers = new int[]{3142};  //对numbers进行静态初始化
int max = numbers[0];
for(int i = 0; i < numbers.length; i++){
	if(max < numbers[i]){
   		max = numbers[i];
  	}
}
  • 当执行完第一行代码 int[] numbers;后,仅定义一个数组变量,然后在栈内存中定义了一个空引用(numbers数组变量)。这个引用并未指向任何有效内存。
    在这里插入图片描述
  • 当执行完第二行代码时,系统将负责为该数组变量分配内存空间,并为数组变量赋上指定的值。
    在这里插入图片描述
  • 当执行完第三行代码后,在栈内存中定义一个整型变量max,然后该变量指向数组的第一个元素地址。
    在这里插入图片描述
  • 执行循环语句,max最后会指向数组中最大的值。

3.3 二维数组内存分析

Java语言里的数组类型是引用变量,因此数组变量其实就是一个引用,这个引用指向真实的数组内存。如果数组元素的引用再次指向真实的数组内存,这看上去就像多维数组了。

内存分析:以案例二分析

int[][] numbers;
numbers = new int[][]{{1,2},{3,4},{5,6}};
  • 当执行完第一行代码 int[] numbers;后,仅定义一个数组变量,然后在栈内存中定义了一个空引用(numbers数组变量)。这个引用并未指向任何有效内存。
    在这里插入图片描述
  • 当执行完第二行代码时,系统将负责为该数组变量分配内存空间,并为数组变量赋上指定的值。其数组的第一个下标对应的内存存放的只是第二下标的内存地址。
    在这里插入图片描述以上,是说明二维数组的本质是一维数组。

总结

一维数组
	定义:type[] arrayName;
	初始化:
		静态初始化:arrayName = new type[]{element1,element2};
		动态初始化:arrayName = new type[length]; 
	简写:type[] arrayName = {element1,element2};

二维数组
	定义:type[][] arrayName;
	初始化:
		静态初始化:arrayName = new type{{element1},{element2}};
		动态初始化 arrayName = new type[length1][length2];
	简写:type[][] arrayName = {{element1},{element2},{element3}};
	

这是本人对数组的浅薄见解,不足之处,还请各位大佬指出。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值