一、一维数组
- 声明与初始化
(1)静态初始化:数组的初始化和数组元素的赋值同时进行
int[] arr1;//声明
arr1 = new int[] {1,2,3,4};//赋值
//合并声明和初始化
int[] arr2 = new int[] {4,5,6,7};
//或 int arr2[] = new int[]{4,5,6,7}
//或 int[] arr2 = {4,5,6,7}//类型推断
(2)动态初始化:数组的初始化和数组元素的赋值分开进行
String[] arr3 = new String[3];
- 引用一维数组元素
通过角标,角标从0开始到数组长度-1结束
System.out.println(arr1[1]);
- 数组的属性:使用length属性调用
System.out.println(arr3.length);
- 一维数组的遍历
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
- 一维数组的默认初始化值
整型:0
浮点型:0.0
字符型:’\u0000’
布尔型:false
引用数据类型:null,不等同于’null’
此时的规范与后面类的属性默认初始化值一致 - 一维数组的内存解析
二、二维数组 - 声明和初始化
(1)动态初始化
//方式一
int[][] arr1 = new int[4][3];
//或
int[] arr1[] = new int[4][3];
int arr1[][] = new int[4][3];
//方式二
int[][] arr2 = new int[3][];
arr2[0] = new int[3];
arr2[1] = new int[2];
arr2[2] = new int[1];
(2)静态初始化
int[][] arr3 = new int[][]{1,2,3,4};
- 引用二维数组
通过角标的方式:角标从0开始到数组的长度-1结束
System.out.println(arr3[0][2]);
- 二维数组的属性
System.out.println(arr3.length);
System.out.println(arr3[i].length);
- 遍历二维数组
for (int i = 0;i < arr3.length;i++){
for (int j = 0;j < arr3[i].length;j++){
System.out.println(arr3[i][j]);
}
}
- 二维数组元素的默认初始化值
以动态初始化方式来解释
二维数组的外层元素默认初始化值为:地址值或null
二维数组内层元素的初始化值:若外层元素默认初始化值为地址值,则内层元素的默认初始化值同一维数组;若外层元素的默认初始化值为null,则内层元素不存在,若试图去调用会出现报错(NullPointerException) - 二维数组的地址解析
三、数组的常见算法
- 数组的赋值与复制
int[] arr1,arr2;
arr1 = new int[]{2,3,5,7,11,13};
//1.赋值:类似于创建一个快捷方式
arr2 = arr1;
for (int i = 0;i < arr1.length;i++){
System.out.print(arr1[i] + '\t');
}
//修改arr2中偶索引位置上的元素
for (int i = 0;i < arr2.length;i++){
if (i % 2 == 0){
arr2[i] = i;
}
System.out.print(arr1[i] + '\t');
System.out.println();
System.out.print(arr2[i] + '\t');
}
//复制
arr2 = new int[arr1.length];
for (int i = 0;i < arr1.length;i++){
arr2[i] = arr1[i];
}
System.out.println(arr1 + '\t');//地址值
System.out.println(arr2 + '\t');//地址值
for (int i = 0;i < arr2.length;i++) {
if(i % 2 == 0) {
arr2[i] = i;
}
}
for (int i = 0;i < arr1.length;i++) {
System.out.print(arr1[i] + "\t");//0 3 2 7 4 13
}
- 数组的反转
String[] arr3 = new String[]{"晴天","阴天","多云","下雨","下雪"};
//方式一:
for (int start = 0,int end = arr3.length;start < end;start++,end--){
String temp = arr3[start];
arr3[start] = arr3[end];
arr3[end] = temp;
}
//方式二:
for (int i = 0;i < arr3.length / 2;i++){
String temp = aarr3[i];
arr3[i] = arr3[length - 1 -i];
arr3[length - 1 -i] = temp;
}
- 数组中指定元素的查找
//1.线性查找:普遍适用性
String str = "下雨";
boolean isFlage = true;
for (int i = 0;i < arr3.length;i++){
if (arr3[i].equals(str)){
System.out.print("找到了,位置在:" + i);
isFlage = false;
break;
}
if(isFlage){
System.out.println("没有找到指定内容");
}
}
//2.二分法查找:数组要有序
int[] arr3 = new int[] {-1,0,1,2,3,4,5,6,7,8};
int num = 4;
boolean isFlage1 = true;
int head = 0;//首索引位置
int end = arr3.length - 1;//尾索引位置
while (head <= end) {
int mid = (head + end) / 2;
if (arr3[mid] == num) {
System.out.println("找到了,索引位置为:" + mid);
isFlage1 = false;
break;
} else if (arr3[mid] > num) {
end = mid - 1;
} else {
head = mid + 1;
}
}
if (isFlage1) {
System.out.println("没有找到");
}
- 数组的排序算法
※ 选择排序
直接选择排序、堆排序
※ 交换排序
冒泡排序、快速排序
※ 插入排序
直接插入排序、折半插入排序、Shell排序
※ 归并排序
※ 桶式排序
※ 基数排序
冒泡排序
// 冒泡排序
int[] bubble = new int[]{34,75,54,23,12,14,9,79};
//从小到大排列
for (int i = 0;i < bubble.length;i++){
for (int j = 0;j < bubble.length - 1 - i;j++){
if(bubble[j] > bubble[j + 1]){
int temp = bubble[j];
bubble[j] = bubble[j + 1];
bubble[j + 1] = temp;
}
}
}
for (int i = 0;i < bubble.length;i++){
System.out.print(bubble[i] + '\t');
}
四、Arrays工具类的使用
- java.util包下
- Arrays:操作数组的工具类,提供了一系列操作数组的方法
- 常见方法:
① boolean equals(int[] a,int[] b) —>判断两个数组是否相等。一系列重载的方法
② String toString(int[] a) —>输出数组信息。一系列重载的方法
③ void fill(int[] a,int val) —>将指定值填充到数组之中。一系列重载的方法
④ void sort(int[] a) —>对数组进行排序。一系列重载的方法
⑤ int binarySearch(int[] a,int key) —>对排序后的数组进行二分法检索指定的值
⑥ copyOf(原数组,新数组长度) —>复制数组,从下标0开始复制,复制指定参数的个数
⑦ copyOfRange(原数组,from,to) —>复制数组任意部分,从form到to(不包含)的元素
五、数组的常见异常
//1.数组角标越界异常:ArrayIndexOutOfBoundsException
for(int i = 0;i <= arr.length;i++) {
System.out.println(arr[i]);
}
System.out.println(arr[5]);
System.out.println(arr[-1]);
//2.空指针异常:NullPointerException
//举例1:
int[] arr1 = new int[4];
arr1 = null;
System.out.println(arr1[0]);
//举例2:
int[][] arr2 = new int[3][];
System.out.println(arr2[1][0]);
//举例3:
String[] arr3 = new String[3];
System.out.println(arr3[0].toString());
六、随机数的生成
如何生成一个随机数?
- Math.random():[0.0,1)
- 如:生成[1,30]范围的随机整数:
- ① Math.random():[0.0,1)
- ② Math.random() * 30:[0.0,30.0)
- ③ (int)(Math.random() * 30):[0,29]
- ④ (int)(Math.random() * 30) + 1:[1,30]
- 公式:获取[a,b]范围的随机整数:(int)(Math.random() * (b - a + 1)) + a 或 (int)(Math.random() * (b - a + 1) + a)