1.数组是什么
数组就是一个容器,用来存一批同种类型的数据。
例如:
//整数类型的数据 20,33,56,90
int[] arr = {20, 33, 56, 90};
//字符串类型的数据 张三,李四,王麻子
string[] name = {"张三","李四","王麻子"};
2.数组的定义和访问
静态初始化数组
- 定义数组的时候直接给数组赋值。
- 语法格式:
- 完整格式:数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2 ,元素3… };
- 简化格式:数据类型[] 数组名 = { 元素1,元素2 ,元素3,… }; (常用)
例如:
//整数类型的数据 20,33,56,90
int[] arr = {20, 33, 56, 90};
//字符串类型的数据 张三,李四,王麻子
string[] name = {"张三","李四","王麻子"};
注意:
- “数据类型[] 数组名”也可写成 “数据类型 数组名[] ”。(单不推荐)
- 什么类型的数组只能存放什么类型的数据。
- 数组变量名中存储的是数组在内存中的地址,数组是一种引用数据类型。
动态初始化数组
- 定义数组时先不存入具体的元素值,只确定数组存储的数据类型和数组的长度
- 语法格式:数据类型[] 数组名 = new 数据类型[长度];
例如:
int[] arr = new int[4];
// int类型的系统默认值为0,所以arr = {0, 0, 0, 0}
// 后赋值
arr[0] = 10;
System.out.println(arr[0]); // 10
注意:静态初始化和动态初始化数组的写法是独立的,不可以混用。
数组的访问
数组访问语法格式:数组名[索引]
//例如;
System.out.println(arr[0]);
数组的长度属性:length
数组长度访问语法格式:数组名.length
// 获取数组的长度(就是数组元素的个数)
System.out.println(arr.length);
数组的最大索引访问语法格式:数组名. length – 1 (前提:元素个数大于0)
注意:数组的索引是从0开始的
3.数组的遍历
数组遍历方法
数组遍历:就是一个一个数据的访问。
快速搭建好遍历数组的方法:数组名.fori+回车
//1.当遍历过程中需要使用到数组的索引/下标时,使用普通for循环
for(int i = 0;i < 数组名称.length;i++){
//获取数组中的元素
sout(数组名称[i]);
}
//2.当数组的遍历过程中,如果不需要使用到数组的索引,使用增强for(foreach)循环
for(最终结果的数据类型 变量名称:要遍历的数组名){
sout(变量名称);
}
注意:使用增强for循环的时候无法对数组的原始数据进行修改。为什么?
每次循环的时候都会数组中的值赋值给了一个变量,修改行为都是对变量的修改。
对数组的原始数据没有影响。
调用Arrays.toString()方法遍历数组
Arrays.toString(数组名)方法:可以直接遍历数组中的内容
例如:
为什么要遍历数组?
方便求和、元素搜索、找最大值
4.数组的种类
一维数组
定义:数组中的元素是一个具体的值。
创建语法:数据类型[] 数组名称 = new 数据类型[元素个数]
二维数组
定义:数组中的元素是一个一维数组。
创建语法:
数据类型[][] 数组名称 = new 数据类型[可以有多少个一维数组(行)][每个一维数组中可以有多少元素(列)];
例如:数据类型[][] 数组名称 = {{值1,值2,值3},{值1,值2,值3},{值1,值2,值3}}
多维数组
定义:数组中的元素是一个二维数组。
创建语法:
数据类型[][][] 数组名称 = new 数据类型[可以有多少个二维数组][每一个二维数组中可以有多少个一维数组][每一个一维数组中可以有多少元素];
例如:数据类型[][][] 数组名称 = {{{值1,值2,值3},{值1,值2,值3},{值1,值2,值3}},{{值1,值2,值3},{值1,值2,值3},{值1,值2,值3}}}
5.使用数组时常见的一个问题
- 如果某个数组变量存储的地址是null,那么该变量将不再指向任何数组对象
- 引用数据类型的默认值null
- 定义在方法中的变量作用范围仅在该方法中有效,被称为局部变量
局部变量要使用,必须赋值
- 直接定义在类中的变量叫做成员变量
成员变量:系统会自动给一个默认值
局部变量:系统不会给默认值,如果要使用,必须自己给值
- null:在内存中没有开辟对应的存储空间
- 在使用引用数据类型去做某些事的时候,如果出现了空指针异常,则一定是没有在内存中开辟空间(没有new)
- //NullPointerException:空指针异常:变量只起了一个名字,在内存中没有开空间(只出现在引用数据类型中)