JAVA-模块五 数组
- 一、数组(一维)
- 1.1数组是什么?
- 1.2java中数组静态初始化:(存)
- 两种定义格式:
- 数组初始化格式:
- 静态初始化后,打印数组名:
- 1.3 数组元素访问(取):
- 静态数组访问格式:
- 数组遍历,数组长度速算:数组名.length
- 1.4数组的动态初始化:
- 1.5数组内存图:
- 两个数组指向相同的内存图:
- 方法的传参传递问题(传值和传址):
- 1 参数是基本数据类型:传递的是数据值
- 2 参数是引用数据类型:传递的是地址值
- 1.6 数组常见问题:
- 二、二维数组:
- 2.1二维数组的静态初始化:
- 2.2二维数组的访问:
- 2.3 二维数组遍历:
- 2.4 二维数组动态初始化:
- 2.5 二维数组内存图:
- 三 、其他:
一、数组(一维)
1.1数组是什么?
数组是一种容器,用于存放同种数据类型的多个值
1.2java中数组静态初始化:(存)
初始化概念:在内存中为数组开辟空间,并且存放的过程
静态初始化:怎么体现出静态,
两种定义格式:
格式1:
格式2:(更推荐,跟C语言更接近)
这两种定义格式,只是定义了数组类型的变量,内存中并没有创建数组容器。
数组初始化格式:
完整格式:
数据类型[ ] 数组名 =new数据类型[ ]{ 元素1,元素2,元素3,…}
简化格式(实际使用):
数据类型[ ] 数组名 ={ 元素1,元素2,元素3,…}(省略了new和数据类型)
静态初始化后,打印数组名:
[I@4eec7777
[I@3b07d329
[ ---->表示当前空间是数组类型
@ ----->表示分隔符,没有实际意义
I ------>表示当前数组类型是int类型
后面的一串数字是16进制数,是数组的地址
1.3 数组元素访问(取):
静态数组访问格式:
数组名[索引],索引就是下标(从0开始)
数组遍历,数组长度速算:数组名.length
概念:将所有元素都取出,但是当数组比较长的时候,计数过于鸡肋
选择使用length动态获取数组的长度(元素的个数):
格式为 :数组名.length,返回值为数组长度
1.4数组的动态初始化:
动态初始化概念:指定数组的长度后,系统会自动为数组分配默认值(数组初始化),来存储相应的默认数据
格式:
动态初始化默认值分类:
-
整形类型(,short,int,long) :0
-
小数类型(float,double):0.0
-
布尔类型:false
-
字符型:‘\u0000’---->U ni code字符,也是一种字符,常见的体现是空白体现
-
引用数据类型:null
java中的引用数据:数组,类,接口
String:本质是一个类,因此字符串本质是类
动态初始化:手动指定数组的长度,系统给出默认初始化值(初始化了元素的个数)
静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组长度(初始化了具体的元素)
使用范围:
使用数组的动态初始化:只明确了元素个数,不清楚具体的数值
使用数组的静态初始化:需求给出明确要存储的数据—>静态初始化
1.5数组内存图:
java中的内存分配:
(1)栈(方法运行进入的内存)
(2)堆(new出来的就会在堆内存中开辟空间并产生地址,有new进堆)
(3)方法区(字节码文件会加载至方法区)
示例:
整个数组的地址赋给arr进行存储:
arr[0]=44:通过arr数组名在堆内存中找到这个数组,再根据索引值找到0号元素
两个数组指向相同的内存图:
数组名记录的是数组的地址:
通过赋值后,两打印结果一样(array1和array2指向的是同一个数组)
方法的传参传递问题(传值和传址):
java到底是值传递还是址传递?
1 参数是基本数据类型:传递的是数据值
2 参数是引用数据类型:传递的是地址值
方法调用之后,打印输出的值仍然是100(类比传值调用)
要想对数number进行修改,调用修改后需要有返回值:(传值调用要想对变量的值进行修改)
栈区执行过程:
传递的数组名存储的是数组的地址调用(传址调用):
第二次打印的值为66
栈区和堆区的执行过程:
1.6 数组常见问题:
问题1 数组的越界异常:越界访问数组
问题2 空指针异常:
当引用数据类型的变量被赋值为null(空)之后,表示和堆内存的连接被切断,这时候再访问堆内数据,空发生空指针异常。(被赋予null后找不到堆内存中的数据)
二、二维数组:
二维数组介绍:
二维数组也是一种容器,用于存储一维数组(容器的嵌套)
使用范围:操作数为多组
2.1二维数组的静态初始化:
完整格式:
简化格式:等号右边省略new 数据类型[ ] [ ]
public class ArrayDemo1 {
public static void main(String[] args) {
int[][] arr={
{11,22,33},
{44,55,66},
{77,88,99},
};
System.out.println(arr);
}
}
打印数组名的结果是一串地址:
两个[ [表示是二维数组
对二维数组进行打印:
二维数组存储一维数组时,存储的是一维数组的地址值:
2.2二维数组的访问:
访问格式:
数组名[ m ] [ n ];
m索引指定访问一维数组的序号,n指定访问的一维数组中元素的序号
2.3 二维数组遍历:
arr[i表示的每一个一维数组(的地址)
可以将二维数组中存储的一维数组的地址存放在一个对应类型的一维数组中
整理思路:
步骤1 遍历二维数组,获取每一个一维数组
步骤2 继续遍历一维数组,获取具体的元素
public static void printArray(int[][] arr){
for (int i = 0; i < arr.length; i++) {
//arr[i]表示每一个一位数组
int[] temp=arr[i];//抽出二维数组中的某个一维数组
for (int j = 0; j < temp.length; j++) {
System.out.println(temp[j]);
}
}
}
精进后->
public static void printArray(int[][] arr){
for (int i = 0; i < arr.length; i++) {
//arr[i]表示每一个一位数组
int[] temp=arr[i];//抽出二维数组中的某个一维数组
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
2.4 二维数组动态初始化:
格式:指定分配内存空间的大小,先不存数
也会有默认值(和一维数组动态初始化的默认值类型一样)
可以将提前初始化好的一维数组存放到二维数组中:
public static void main(String[] args) {
int[] arr1={11,22,33};
int[] arr2={44,55,66};
int[][] arr=new int[2][3];
arr[0]=arr1;//将arr1存放到二维数组中的0号索引位置
arr[1]=arr2;//将arr2存放到二维数组中的1号索引位置
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
2.5 二维数组内存图:
进行了地址的替换
栈中:
堆中:
三 、其他:
1 批量修改变量名:选中后,shift+F6
2 将主函数中部分内容独立为方法(抽调方法):选中后ctrl+Alt+m
3 IDEA 数组遍历的快捷键:-------->数组名.fori