目录
一、数组定义格式
(一)什么是数组
数组(array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型。
数组的分类:
①按照数组维数分类:一维数组、二维数组……
②按照数组元素分类:基本数据类型的数组、引用数据类型元素的数组
(二)数组的定义格式
1. 一维数组:
格式一:
数据类型 [ ] 变量名
例: int [ ] arr
定义了一个int类型的数组,数组名是arr。
格式二:
数据类型 变量名 [ ]
例:int arr [ ]
定义了一个int类型的变量,变量名是arr数组。
2. 二维数组:
格式一:
数据类型 [ ] [ ] 变量名
例:int [ ] [ ] arr
格式二:
数据类型 变量名 [ ][ ]
例:int arr [ ][ ]
二维数组的使用:
规定:二维数组分为外层数组的元素,内层数组的元素
int [ ][ ] arr = new int [4][3];
外层元素:arr [0],arr[1] 等
内层元素:arr [0][0],arr [1][2] 等
二、数组初始化
数组必须先初始化,然后才能使用。
初始化就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
(一)动态初始化
动态初始化:初始化是只指定数组长度,有系统为数组分配初始值。
- 格式:数据类型 [ ] 变量名 = new 数据类型 [数组长度];
- 例: int [ ] arr = new int [3];(new是为数组申请内存空间)
(二)静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
- 格式:数据类型 [ ] 变量名 = new 数据类型 [ ] {数据1,数据2,数据3};
- 范例:int [ ] arr = new int {1,2,3};
- 简化格式:数据类型 [ ] 变量名 = {数据1,数据2,数据3};
- 例:int [ ] arr = {1,2,3};
三、内存分配
(一)Java中的内存分配
数组在初始化时,会为存储空间添加默认值
- 整数:默认值0
- 浮点数:默认值0.0
- 布尔值:默认值false
- 字符:默认值是空字符
- 引用数据类型:默认值是null
(PS×1:图中001是数组的地址)
栈内存:存储局部变量
- 定义在方法中的变量,例如:arr
- 使用完毕,立即消失
堆内存:存储new出来的内容(实体,对象)
- 数组在初始化时,会为存储空间添加默认值
- 每一个new出来的东西都有一个地址值
- 使用完毕,会在垃圾回收器空闲时被回收
(二)单个数组内存图
(PS×2:图中001为数组地址)
(三)多个数组内存图
(PS×3:图中001为数组地址)
(四)多个数组指向相同内存图
四、数组操作中的两个常见小问题
(一)索引越界
索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题。
(二)空指针异常
空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常。
null:空值,引用数据类型的默认值,表示不指向任何有效对象。
五、数组中的常见操作
获取数组元素数量
一条一条输出数组各个元素十分麻烦,届时可用循环输出。但循环输出需要获取数组的元素个数,如果元素个数过大,统计元素将过于困难。
- 格式:数组名.length
- 例:arr.length
遍历通用格式
int [] arr = {……};
for (int x = 0;x < arr.length;x++){
System.out.println(arr[x]);
}
int [][] arr = {{……},{……},{……}};
for (int i = 0;i < arr.length;i++){
for (int j = 0;j < arr[i].length;j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
六、Arrays工具类的使用
Java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。
下面是各种方法的使用范例:
1.
boolean equals (int [] a,int [] b) 判断两个数组是否相等
int [] arr1 = new int []{1,2,3,4};
int [] arr2 = new int []{1,3,2,4};
boolean isEquals = Arrays.equals (arr1,arr2);
System.out.println (isEquals);
2.
String toString (int [] a) 输出数组信息
System.out.println (Arrays.toString(arr1));
3.
void fill (int [] a,int val) 将指定值填充到数组之中
Arrays.fill (arr1,10);
System.out.println (Arrays.toString(arr1));
4.
void sort (int [] a) 对数组进行排序
Arrays.sort (arr2);
System.out.println (Arrays.toString(arr1));
5.
int binarySearch (int [] a,int key) 对排序后的数组进行二分法检索指定的值
int [] arr3 = new int []{-98,-34,2,34,54,66,79,105,210,333}
int index1 = Arrays.binarySearch (arr3,-34);
int index2 = Arrays.binarySearch (arr3,-34);
System.out.println (index1); //这时输出 1
System.out.println (index2); //这时输出 负数
/* 可修改为
if (index >= 0){
System.out.println (index);
}else{
System.out.println ("未找到");
}
*/