数组和数组工具类
什么是数组
数组是具有相同数据类型且按一定次序排列的一组变量的集合体。即用一个变量名表示一批数据。Java
为数组在内存中分配一段连续的空间,且存储数据的个数是固定的。
数组名称
指向到数组元素的变量就是数组名称
数组元素
构成数组的每一个数据称为数组元素
数组下标(索引)
数组元素在数组中的位置(从0开始,依次加1)
数组下标越界
不再有效范围内的下标(有效范围>=0 并且 <length)
数组大小
元素个数叫做数组的大小,也叫数组的长度(length
可以查)
使用步骤
- 定义数组名称
- 给数组元素分配内存
- 元素初始化
- 使用数组
提示
- 数组是引用类型
- 内存地址编号是由
JVM
分配的,通常用十六进制表示。
使用
定义
定义数组有两种语法格式:
方法一:
数据类型 数组名[];
方法二:
数据类型[] 数组名;
定义数组本质上就是向
JVM
申请内存,JVM
将内存划分为几个区域。其中包含了堆和栈。不同的区域存储不同类别的数据。定义数组时,JVM
将数组的名称存储在栈中,栈是一个先进后出的数据结构,因此数据名称在栈底。
分配
语法格式
数组名 = new 数据类型[数组长度];
定义数组和分配内存可以合并在一起写
数据类型[] 数组名 = new 数据类型[数组长度];
声明一个数组时指定了数组名称和元素的类型,并未指定数组元素的个数,也没有为数组元素分配内存,由于没有为数组元素分配内存,所以无法使用数组存储数据。
要让系统改为数组元素分配存储空间,必须之处数组元素的个数,并通过
new
运算符为数组元素分配内存空间。
初始化
数组声明并为数据元素分配空间完成后,必须为数组元素初始化,才能使用数组元素。
数组元素类型 | 默认初始值 |
---|---|
byte,short,int,long | 0 |
float,double | 0.0 |
char | '\u0000' (空字符) |
boolean | false |
引用数据类型 | null |
tips:增强for循环遍历数组
语法规则
for(元素类型 变量名:要迭代的对象){
~~~~
}
一维数组和多维数组
一维数组只有一个维度,而多维数组有多个维度。在实际应用中,多维数组中使用最多的是二维数组。
一维数组的下标只能对应一个元素,而二维即多维数组,可用矩阵来表示,他们都是两个或多个下标值对应一个元素,是多对一的关系,因此是非线性结构。
一维数组的定义:
数据类型[] 数组名 = new 数据类型[数组长度];
多维数组的定义:
-
二维数组:
数组元素的值还是一个数组,也就是一维数组的一维数组
数据类型[][] 数组名 = new 数据类型[行数][列数];
- 三维数组:
数据类型[][][] 数组名 = new 数据类型[行数][列数][层数];
-
不规则数组
不规则数组是每一行的列数不一样的数组
使用
package com.kfm.base.array2;
public class Demo13 {
public static void main(String[] args) {
/*
多维数组: 多个维度
一维数组 int[] arr = new int[5]
多维数组可以理解为 数组中每个元素又是一个数组。
二维数组; 一维数组中每个元素都是数组 [大多数多维数组都是停留在二维],二维可以看作表格的行和列
三维数组: 二维数组中每个元素都是数组
...
二维数组:
int[][] arr = new int[长度][];
new int[3][]; 说明一维数组中有三个一维数组元素
eg: {{1, 2}, {3, 4}, {5, 6}}
{
{1, 2}, // 第一个元素
{3, 4}, // 第二个元素
{5, 6}, // 第三个元素
}
*/
// int[][] arr = {{}, {}, {}};
// int[][] arr = new int[][]{}; // 二维数组
int[][] arr = new int[2][];
arr[0] = new int[]{0, 1, 2};
arr[1] = new int[]{1, 2, 3};
// arr[2] = new int[]{2}; // IndexOutOfBoundsException
/*
0 1 2
1 2 3
*/
arr[1][1] = 6;
// System.out.println(arr.length); //
// 遍历输出
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
应用实例
package com.kfm.base.array2;
public class Demo15 {
public static void main(String[] args) {
/*
多维数组排序
每个同学有三门课的成绩分别是数组的 1 2 3 个元素
一个班有 5 个同学,按他们的总成绩输出每个同学的各科成绩
92 96 99
94 90 87
*/
int[][] scores = {
{78, 89, 93}, // 260
{88, 92, 89}, // 269
{79, 87, 88}, // 254
{92, 96, 99}, // 287
{94, 90, 87} // 271
};
// 对成绩进行排序
// 将每位同学成绩的和放到新数组中
int[] sumArr = new int[scores.length];
for (int i = 0; i < scores.length; i++) {
int sum = 0;
for (int j = 0; j < scores[i].length; j++) {
sum += scores[i][j];
}
sumArr[i] = sum;
}
// 对总分数组排序
for (int i = 0; i < sumArr.length - 1; i++) {
for (int j = 0; j < sumArr.length - 1 - i; j++) {
if (sumArr[j] < sumArr[j + 1]){
// 换总分顺序
int temp = sumArr[j];
sumArr[j] = sumArr[j + 1];
sumArr[j + 1] = temp;
// 换各科的顺序
int[] score = scores[j];
scores[j] = scores[j + 1];
scores[j + 1] = score;
}
}
}
// System.out.println(Arrays.toString(sumArr));
// 遍历输出
for (int i = 0; i < scores.length; i++) {
for (int j = 0; j < scores[i].length; j++) {
System.out.print(scores[i][j] + "\t");
}
System.out.println();
}
}
}
数组的内存结构
堆和栈
JVM
内存分成几个区域,其中有两个区域分别叫做堆和栈- 数组元素分配在堆中,数组名称分配在栈中
内存结构示例:
数组工具类(Arrays类
)
常用方法
方法 | 返回类型 | 说明 |
---|---|---|
equals(array1,array2) | boolean | 比较两个数组是否相等 |
sort(array) | void | 对数组array 的元素进行排序 |
toString(array) | String | 将一个数组array 转换成一个字符串 |
fill(array,val) | void | 把数组array 的所有元素都赋值为val |
copyOf(array,length) | 与array 数据类型一致 | 把数组array 赋值成一个长度为length 的新数组 |
binarySearch(array,val) | int | 查询元素值val 在数组array 中的下标 |
compare(array1,array2) | int | 按字典顺序比较数组,前面的数组大,返回大于0的值。反之返回小于0的值 |
copyOfRange(arr,start,end) | 与array 数据类型一致 | 将指定数组的指定范围复制到新数组中 |
fill(arr,start,end,val) | void | 将指定的值分配给指定数组的指定范围的每个元素 |
mismatch(array1,array2) | int | 查找并返回两个数组之间第一个不匹配的索引,否则如果未找到不匹配,则返回-1 |
mismatch(array1,,start1,end1,array2,start2,end2) | int | 查找并返回指定范围内两个数组之间第一个不匹配的相对索引,否则如果未找到不匹配,则返回-1 |