知识点1:二维数组的使用
* 数组,属于引用数据类型。
* 数组的元素,可以是基本数据类型,或引用数据类型。
* > 数组A的元素,还可以是数组B。则构成了二维数组
对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。
public class ArrayTest {
public static void main(String[] args) {
// 1. 二维数组的声明和初始化
//静态初始化
int[][] arr = new int[][]{{1,2,3},{4,5},{6,7,8},{9,8,6,4}};
String[][] arr1 = new String[][]{{"陈伟霆","刘诗诗"},{"周笔畅","鹿晗","张艺兴"}};
// int[][][] arr2 = new int[][][]{{{1,2,3},{3,4},{4,5}},{{3,4},{4,5,6,6}}};
//动态初始化1
int[][] arr3 = new int[4][3];
//动态初始化2
int[][] arr4 = new int[3][];
//也是正确的格式:
int arr5[] = new int[5];
int arr6[][] = new int[5][7];
int[] arr7[] = new int[5][7];
//错误的:
// int[][] arr8 = new int[][5];
// int[][] arr9 = new int[5][7]{{1,2,3},{4,5},{6,7,8},{9,8,6,4}};
// 2. 二维数组元素的调用:通过角标的方式
System.out.println(arr[0][0]);
System.out.println(arr[3][3]);
System.out.println(arr1[1][1]);
arr3[1][2] = 10;
// arr4[0][0] = 10;//报空指针的异常
// 3. 二维数组的长度
System.out.println(arr3.length);//4
System.out.println(arr3[0].length);//3
System.out.println(arr1.length);//2
System.out.println(arr1[1].length);//3
System.out.println(arr4.length);//3
// System.out.println(arr4[0].length);//报NullPointerException的错误
// 4. 二维数组的遍历
for(int i = 0;i < arr1.length;i++){
for(int j = 0;j < arr1[i].length;j++){
System.out.print(arr1[i][j] + "\t");
}
System.out.println();
}
}
}
- 数组元素的默认值
package com.atguigu.java;
/**
*
* 测试二维数组的使用
* 5. 二维数组元素的默认初始化值 (以动态初始化为例)
* 动态初始化方式1:比如:int[][] arr1 = new int[4][3];
* 外层元素的值:存储代表的一维数组的内存地址值。
* 内层元素的值:
* 整型数组,元素的默认初始化值为:0
* 浮点型数组,元素的默认初始化值为:0.0
* 字符型数组,元素的默认初始化值为:0
* boolean型数组,元素的默认初始化值为:false
* 引用数组类型数组,元素的默认初始化值为:null
*
* 动态初始化方式2:比如:int[][] arr2 = new int[3][];
* 外层元素的值:null
* 内层元素的值:根本不存在。如果调用的话,报NullPointerException的错误
*
* 对于二维数组来说,约定称谓:
* > 外层元素:比如:arr1[0],arr1[1]
* > 内层元素:比如:arr1[0][1],arr[1][0]
*
*
*/
public class ArrayTest1 {
public static void main(String[] args) {
// 5. 二维数组元素的默认初始化值
int[][] arr1 = new int[4][3];
System.out.println(arr1[0]);//[I@1540e19d
double[][] arr2 = new double[4][3];
System.out.println(arr2[0]);//[D@677327b6
System.out.println(arr1[0][0]);//0
System.out.println(arr2[0][0]);//0.0
System.out.println("######################");
int[][] arr3 = new int[4][];
System.out.println(arr3[0]);
System.out.println(arr3[0][0]);//NullPointerException
System.out.println("######################");
arr3[0] = new int[4];
arr3[1] = new int[]{1,2,3};
arr3[2] = new int[5];
arr3[3] = new int[6];
String[][] classes = new String[4][];
classes[0] = new String[40];
classes[1] = new String[50];
}
}
- 二维数组的内存解析
说明:其他内存解析的图,见ppt
知识点2:数组中的常见算法
1. 数组元素的赋值
- 杨辉三角
package com.atguigu.exer;
import java.util.concurrent.ForkJoinPool;
/**
*
* 使用二维数组打印一个 10 行杨辉三角。
*
* 【提示】
* 1. 第一行有 1 个元素, 第 n 行有 n 个元素
* 2. 每一行的第一个元素和最后一个元素都是 1
* 3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即:
* yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
*/
public class ArrayDemo {
public static void main(String[] args) {
//1.二维数组的动态初始化
int[][] yangHui = new int[10][];
//2.二维数组的外层元素的动态初始化
for(int i = 0;i < yangHui.length;i++){
yangHui[i] = new int[i + 1];
}
//3. 给二维数组的内层元素赋值
for(int i = 0;i < yangHui.length;i++){
//3.1 每一行的首末元素赋值为1
yangHui[i][0] = yangHui[i][i] = 1;
//3.2 每一行的非首末元素赋值。规律为:yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
//if(i >= 2){
for(int j = 1;j < yangHui[i].length - 1;j++){
yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
}
//}
}
//4. 遍历二维数组
for (int i = 0; i < yangHui.length; i++) {
for (int j = 0; j < yangHui[i].length; j++) {
System.out.print(yangHui[i][j] + " ");
}
System.out.println();
}
}
}
- 回形数(略)
- 附随机数问题
创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时,要求元素的值各不相同。 Math.random()
2. 数值型数组的特征值的计算
package com.atguigu.homework;
/**
*
* 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
* 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
* 要求:所有随机数都是两位数。
*
* 提示:如何获取指定范围的随机数:[10,99]
* (int)(Math.random() * 90 + 10)
*
* {34,43,65,35,67,45,76,87}
*/
public class HomeWork01 {
public static void main(String[] args) {
//1.创建int[]数组,并初始化数组元素
int[] arr = new int[10];
for(int i = 0;i < arr.length;i++){
arr[i] = (int)(Math.random() * 90 + 10);
}
//遍历数组
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
//2. 求特征值:最大值、最小值、总和、平均数
//最大值:
int max = arr[0];
for(int i = 1;i < arr.length;i++){
if(max < arr[i]){
max = arr[i];
}
}
System.out.println("最大值为:" + max);
//最小值
int min = arr[0];
for(int i = 1;i < arr.length;i++){
if(min > arr[i]){
min = arr[i];
}
}
System.out.println("最小值为:" + min);
//总和
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("总和为:" + sum);
//平均数
double avg = (double)sum / arr.length;
System.out.println("平均数为:" + avg);
}
}
3. 数组的复制、反转、查找(或搜索)
package com.atguigu.java;
/**
*
* 测试:数组的复制、反转、查找(线性查找、二分法查找)
*/
public class ArrayTest2 {
public static void main(String[] args) {
//1. 复制操作
int[] arr1 = new int[]{3,4,5,3,6,23,6,84,4};
int[] arr2 = new int[arr1.length];
for (int i = 0; i < arr2.length; i++) {
arr2[i] = arr1[i];
}
//2. 反转操作
//方式1:
// for(int i = 0;i < arr1.length / 2;i++){
// int temp = arr1[i];
// arr1[i] = arr1[arr1.length - 1 - i];
// arr1[arr1.length - 1 - i] = temp;
// }
//方式2:
for(int x = 0,y = arr1.length - 1;x < y;x++,y--){
int temp = arr1[x];
arr1[x] = arr1[y];
arr1[y] = temp;
}
//遍历操作
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + " ");
}
System.out.println();
//3. 查找之线性查找
int[] arr3 = new int[]{3,14,5,13,6,23,16,84,4};
int target = 166;
// boolean isFlag = false;
int i = 0;
for(;i < arr3.length;i++){
if(target == arr3[i]){
System.out.println("在索引为" + i + "的位置找打了指定的元素");
// isFlag = true;
break;
}
}
if(i == arr3.length){
System.out.println("不好意思,没有找到指定的元素");
}
// if(!isFlag){
// System.out.println("不好意思,没有找到指定的元素");
// }
//4. 查找之二分法查找
//二分法查找:要求此数组必须是有序的。
int[] arr4 = new int[]{-99,-54,-2,0,2,33,43,256,999};
boolean isFlag = true;
int number = 256;
number = 333;
int head = 0;//首索引位置
int end = arr4.length - 1;//尾索引位置
while(head <= end){
int middle = (head + end) / 2;
if(arr4[middle] == number){
System.out.println("找到指定的元素,索引为:" + middle);
isFlag = false;
break;
}else if(arr4[middle] > number){
end = middle - 1;
}else{//arr4[middle] < number
head = middle + 1;
}
}
if(isFlag){
System.out.println("未找到指定的元素");
}
}
}
- 练习1
package com.atguigu.exer;
/**
*
* 使用简单数组
* (1)创建一个名为ArrayDemo1的类,在main()方法中声明array1和array2两个变量,
* 他们是int[]类型的数组。
*
* (2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
* (3)显示array1的内容。
* (4)赋值array2变量等于array1,修改array2中的偶索引元素,
* 使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。
*
* 思考:array1和array2是什么关系?
* 拓展:修改题目,实现array2对array1数组的复制 见【ArrayDemo2.java】
*/
public class ArrayDemo1 {
public static void main(String[] args) {
int[] array1,array2;
array1 = new int[]{2,3,5,7,11,13,17,19};
//显示array1的内容
System.out.println("显示array1的内容:");
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i] + " ");
}
System.out.println();
//赋值array2变量等于array1
//此操作不能称为数组的复制。
array2 = array1;
//修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
for(int i = 0;i < array2.length;i++){
if(i % 2 == 0){
array2[i] = i;
}
}
//打印出array1
System.out.println("显示array1的内容:");
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i] + " ");
}
System.out.println();
}
}
对应的图示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpmS6rVs-1625668172940)(assets/1595925751381.png)]
- 练习2:
package com.atguigu.exer;
/**
*
* 使用简单数组
* (1)创建一个名为ArrayDemo1的类,在main()方法中声明array1和array2两个变量,
* 他们是int[]类型的数组。
*
* (2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
* (3)显示array1的内容。
* (4)赋值array2变量等于array1,修改array2中的偶索引元素,
* 使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。
*
* 思考:array1和array2是什么关系?
* 拓展:修改题目,实现array2对array1数组的复制
*/
public class ArrayDemo2 {
public static void main(String[] args) {
int[] array1,array2;
array1 = new int[]{2,3,5,7,11,13,17,19};
//显示array1的内容
System.out.println("显示array1的内容:");
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i] + " ");
}
System.out.println();
//复制array1
array2 = new int[array1.length];
for(int i = 0;i < array2.length;i++){
array2[i] = array1[i];
}
//修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
for(int i = 0;i < array2.length;i++){
if(i % 2 == 0){
array2[i] = i;
}
}
//打印出array1
System.out.println("显示array1的内容:");
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i] + " ");
}
System.out.println();
}
}
对应的图示
4. 数组的排序
- 排序的概念
排序:假设含有n个记录的序列为{R1,R2,...,Rn},其相应的关键字序列为{K1,K2,...,Kn}。将这些记录重新排序为{Ri1,Ri2,...,Rin},使得相应的关键字值满足条Ki1<=Ki2<=...<=Kin,这样的一种操作称为排序。
通常来说,排序的目的是快速查找。
- 排序算法的衡量标准
1.时间复杂度:分析关键字的比较次数和记录的移动次数
2.空间复杂度:分析排序算法中需要多少辅助内存
3.稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
- 常见的十大排序算法
红色:重要的 (建议:会手写)
黄色:次重要的 (明白排序思想)
- 冒泡排序
package com.atguigu.java;
/**测试冒泡排序
*/
public class ArrayTest3 {
public static void main(String[] args) {
int[] arr1 = new int[]{3,14,5,13,6,23,16,84,4};
for(int i = 0;i < arr1.length - 1;i++){
for(int j = 0;j < arr1.length - 1 - i;j++){
if(arr1[j] > arr1[j + 1]){
int temp = arr1[j];
arr1[j] = arr1[j + 1];
arr1[j + 1] = temp;
}
}
}
//遍历
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + " ");
}
}
}
- 快速排序
知识点3:Arrays工具类的使用
- Arrays是操作数组的工具类
- 熟悉常用的方法
- 代码演示
package com.atguigu.java1;
import java.util.Arrays;
/**
* Arrays:操作数组的工具类。
*
*/
public class ArraysTest {
public static void main(String[] args) {
int[] arr1 = new int[]{1,2,3,4,5};
int[] arr2 = new int[]{1,2,4,3,5};
System.out.println(arr1 == arr2);
//1. equals()
System.out.println(Arrays.equals(arr1,arr2));
//2. toString()
System.out.println(arr1);
System.out.println(Arrays.toString(arr1));
//3. fill()
Arrays.fill(arr1,10);
System.out.println(Arrays.toString(arr1));
//4. sort()
int[] arr3 = new int[]{3,14,5,13,6,23,16,84,4};
Arrays.sort(arr3);
System.out.println(Arrays.toString(arr3));
//5.binarySearch()
//前提:数组必须有序
int index = Arrays.binarySearch(arr3, 23);
if(index >= 0){
System.out.println("找到了指定元素,位置为:" + index);
}else{
System.out.println("未找到");
}
}
}
知识点4:数组中的常见异常
package com.atguigu.java1;
/**
* 测试数组中的常见异常
*/
public class ArrayExceptionTest {
public static void main(String[] args) {
//1. 数组角标越界异常:ArrayIndexOutOfBoundsException
int[] arr = new int[10];//0-9
System.out.println(arr[9]);
// System.out.println(arr[10]);//越界
// System.out.println(arr[-10]);//越界
//2. 空指针异常:NullPointerException
//情况1:
// int[] arr1 = new int[10];
// arr1 = null;
// System.out.println(arr1[0]);
//情况2:
// int[][] arr2 = new int[5][];
// System.out.println(arr2[0][0]);
//情况3:
String[] arr3 = new String[5];
System.out.println(arr3[0].toString());
}
}