Java基础:第三章 数 组
- 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
- 数组的常见概念
1、数组名
2、下标(或索引)
3、元素
4、数组的长度
- 数组的特点:
- 数组是有序排列的。
- 数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型。
- 创建数组对象会在内存中开辟一整块连续的空间。
- 数组的长度一但确定,就不能修改。
- 数组的分类:
- 按照维数:一维数组、二维数组….
- 按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组
3-2 一维数组的使用:
- 一维数组的声明和初始化
- 如何调用数组的指定位置的元素
- 如何获取数组的长度
- 如何遍历数组
- 数组元素的默认初始化值:
- 数组元素是整型:0
- 数组元素是浮点型:0.0
- 数组元素是char型:0或 ‘\u0000’ , 而非 ‘0’
- 数组元素是boolean型: false
- 数组元素是引用数据类型:null
- 数组的内存解析
- 内存简化结构:
- 栈:(stack):放局部变量
- 堆:(heap):new出来的结构:对象、数组
- 方法区:
- 常量池:字符串
- 静态域:static
public class Array { public static void main(String[] args) { //1.一维数组的声明和初始化 int num;//声明 num = 10;//初始化 int id = 1001;//声明+初始化 int[] ids;//声明 //1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行 ids = new int[] {1001,1002,1003,1004}; //1.2 动态初始化:数组的初始化和数组元素的赋值操作分开进行 String[] names = new String[5]; //错误的写法: /* int[] arr1 = new int[]; int[5] arr2 = new int[]; int[] arr3 = new int[3]{1,2,3}; */ //总结:数组一但初始化完成,其长度就确定。 //2.如何调用数组的指定位置的元素 //数组的角标(索引)从0开始的,到数组的长度-1结束 names[0] = "王喜"; names[1] = "李二"; names[2] = "宁明"; //3.如何获取数组的长度 //属性:length System.out.println(names.length); System.out.println(ids.length); //4.如何遍历数组 for(int i = 0; i < names.length;i++) { System.out.println(names[i]); } } } public static void main(String[] args) { //5.数组元素的默认初始化值 int[] arr1 = new int[4]; for (int i = 0;i < arr1.length;i++) { System.out.println(arr1[i]); } float[] arr2 = new float[4]; for (int i = 0;i < arr2.length;i++) { System.out.println(arr2[i]); } System.out.println("**************"); char[] arr3 = new char[5]; for (int i = 0;i < arr3.length;i++) { System.out.println("------" + arr3[i] + "------"); } System.out.println("**************"); boolean[] arr4 = new boolean[5]; System.out.println(arr4[0]); System.out.println("**************"); String[] arr5 = new String[5]; System.out.println(arr5[0]); if (arr5[0] == null) { System.out.println("今天是冬至!"); } } public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[]{8, 2, 1, 0, 3}; int[] index = new int[]{2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3}; String tel = ""; for (int i = 0; i < index.length; i++) { tel += arr[index[i]]; } System.out.println("联系方式:" + tel); } } /* * 从键盘讲稿学生成绩,找出最高分,并输出学生成绩等级。 * 成绩 <= 最高分 -10 等级为 A * 成绩 <= 最高分 -20 等级为 B * 成绩 <= 最高分 -30 等级为 C * 其余 等级为D * */ import java.util.Scanner; public class ArrayDemo1 { public static void main(String[] args) { // 1.读取学生个数 ,使用Scanner Scanner scanner = new Scanner(System.in); System.out.println("请输入学生人数:"); int number = scanner.nextInt(); // 2、创建数组,存储学生成绩:动态初始化 int[] scores = new int[number]; // 3、组数组中的元素赋值 System.out.println("请输入" + number + "名学生成绩:"); int maxScore = 0; for (int i = 0 ;i < scores.length ;i++){ scores[i] = scanner.nextInt(); // 4、获取数组中的元素的最大值 if (maxScore < scores[i]) { maxScore = scores[i]; } } // 5、根据每个学生成绩与最高分的差值,得到第个学生的等级,并输出等级和成绩 char level; for (int i = 0;i < scores.length;i++){ if (maxScore - scores[i] <= 10) { level = 'A'; } else if (maxScore - scores[i] <= 20) { level = 'B'; } else if (maxScore - scores[i] <= 30) { level = 'C'; } else { level = 'D'; } System.out.println("学生 " + i + " 成绩为:" + scores[i] + " 等级为:" + level); } } }
多维数组的使用:
- Java语言里提供了支持多维数组的语法。
- 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格。
- 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组 array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多给数组。
public class ArrayTest2 { public static void main(String[] args){ //1、一维数组的声明和初始化 int[] arr1 = new int[]{1,2,3}; //二维数组,静态初始化 int[][] arr2 = new int[][]{{1,2,3},{3,4,5},{5,6,7}}; //动态初始化 String[][] arr3 = new String[3][2]; String[][] arr4 = new String[3][]; String[] arr5[] = new String[3][]; //2、如何调用数组的指定位置的元素 System.out.println(arr2[1][2]); //3、获取数组的长度 System.out.println(arr4.length); System.out.println(arr2[2].length); //4、如何遍历二维数组 for(int i = 0;i < arr2.length;i++){ for (int j = 0;j < arr2.length;j++){ System.out.print(arr2[i][j] + " "); } System.out.println(); } } } /* * 二维数组的使用: * 规定:二维数组分为外层数组的元素,内层数组的元素 * int[] arr = new int[4][3]; * 外层元素:arr[0],arr[1]...等 * 内层元素:arr[0][0],arr[1][1]等 * 1、数组元素的默认初始化值 * 针对于初始化方式一:比如:int[][] arr = new int[4][3]; * 外层元素的初始化值为:地址值 * 内层元素的初始化值为:与一维数组初始化情况相同 * 针对于初始化方式一:比如:int[][] arr = new int[4][]; * 外层元素的初始化值为:null * 内层元素的初始化值为:不能调用,否则报错。 * 2、数组的内存解析 * * */ public class ArrayTest3 { public static void main(String[] args){ int[][] arr = new int[4][3]; System.out.println(arr[0]);//地址值 System.out.println(arr[0][0]);//0 System.out.println("*********************1"); float[][] arr2 = new float[4][3]; System.out.println(arr2[1]);//地址值 System.out.println(arr2[1][1]);//0.0 System.out.println("*********************2"); String[][] arr3 = new String[4][3]; System.out.println(arr3[1]);//地址值 System.out.println(arr3[1][1]);//null System.out.println("*********************3"); double[][] arr4 = new double[4][]; System.out.println(arr4[1]);//地址值 System.out.println(arr4[1][1]);//null } }
二维数组的内存解析
复习
1、写出一维数组初始化的两种方式:
int[] arr1 = new int[5];//动态初始化 String[] arr2 = new String[]{"zhangsan","lisi","wangwu"};//静态初始化 String[] arr2 = {"zhangsan","lisi","wangwu"};//类型推断
数组一但初始化,其长度就是确定的,arr.length,数组长度一但确定,就不可以修改。
2、写出二维数组初始化的两种方式
int[][] arr1 = new int[4][3];//动态初始化 int[][] arr2 = new int[4][];//动态初始化 int[][] arr3 = new int[][]{{1,2,3},{1,2,3},{5,6,7}};//静态初始化
3、如何遍历如下的二维数组:
int[] arr = new int[]{{1,2,3},{1,2,3},{5,6,7}}; for(int i = 0;i < arr.length;i++){ for(int j = 0;j < arr.length;j++){ System.out.print(arr[i][j] + "\t"); } System.out.println(); }
4、不同类型的一维数组元素的默认初始化值各是多少?
char: 0 //ascii值为0的 整型:0 浮点型:0.0 boolean: false 引用类型: null
5、一维数组的内存解析
3-3 多维数组的使用
练习:
public class ArrayExer1 { public static void main(String[] args) { int[][] arr = new int[][] {{3,5,8},{12,9},{7,0,6,4}}; int arrSum = 0; for(int i = 0;i < arr.length;i++) { for(int j = 0;j < arr[i].length;j++) { arrSum += arr[i][j]; } } System.out.print("组数总和为: " + arrSum); } }
/** * 便用二维数组打印一个10行杨辉三角: * 提示: * 1、第一行有 1 个元素,第 n 行有 n 个元素 * 2、每一行的第一个元素和最后一个元素都是1 * 3、从第三行开始,对于非第一个元素和最后一个元素的元素。即: * yangHui[i][j] = yangHui[i-1][[j-1] + yangHui[i-1][j]; * */ public class YangHuiTest { 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]; //2.1 给首末元素赋值 yangHui[i][0] = 1; yangHui[i][i] = 1; //2.2给每行的非首末元素赋值 if(i > 1) {//if可以略掉 for(int j =1;j < yangHui[i].length - 1;j++) { yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j]; } } } //3、遍历二维数组 for(int i = 0;i < yangHui.length;i++) { for(int j = 0;j < yangHui[i].length;j++) { System.out.print(yangHui[i][j] + "\t "); } System.out.println(); } } } /* * 面试题目:创建一个长度为6的int型数组,要求取值为1~30,同时元素值各不相同 * */ public class ArrayExer3 { public static void main(String[] args) { //方式一: int[] arr = new int[6]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) (Math.random() * 30) + 1; boolean flag = false; while (true) { for (int j = 0; j < i; j++) { if (arr[i] == arr[j]) { flag = true; break; } } if (flag) { arr[i] = (int) (Math.random() * 30) + 1; flag = false; continue; } break; } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } } /* * 面试题目:创建一个长度为6的int型数组,要求取值为1~30,同时元素值各不相同 * */ public class ArrayExer3_1 { public static void main(String[] args) { //方式二: int[] arr = new int[6]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) (Math.random() * 30) + 1; for (int j = 0; j < i; j++) { if (arr[i] == arr[j]) { i--; break; } } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
3-4数组中涉及到的常见算法
1、数组元素的赋值(杨辉三角、回形数等)
2、求数值型数组中元素的最大值、最小值、平均数、总和等
3、数组的复制、反转、查找(线性查找、二分法查找)
4、数组元素的排序算法
/* * 回形格式方阵的实现 * 从键盘输入一个整数(1~20) * 则以该数字为矩阵的大小,把1。2。3...n*n的数字按照顺时针的形式填入其中。例如 * 输入数字1, 2, 3, 4,则程序输出 1 1 2 1 2 3 1 2 3 4 * 4 3 8 9 4 12 13 14 5 * 7 6 5 11 16 15 6 * 10 9 8 7 * */ import java.util.Scanner; public class RectangleTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个数字:"); int len = scanner.nextInt(); int[][] arr = new int[len][len]; int s = len * len; /* * k = 1:向右,k = 2:向下,k = 3:向左,k = 4:向上 * */ int k = 1; int i = 0, j = 0; for (int m = 1; m <= s; m++) { if (k == 1) { if (j < len && arr[i][j] == 0) { arr[i][j++] = m; } else { k = 2; i++; j--; m--; } } else if (k == 2) { if (i < len && arr[i][j] == 0) { arr[i++][j] = m; } else { k = 3; i--; j--; m--; } } else if (k == 3) { if (j >= 0 && arr[i][j] == 0) { arr[i][j--] = m; } else { k = 4; i--; j++; m--; } } else if (k == 4) { if (i >= 0 && arr[i][j] == 0) { arr[i--][j] = m; } else { k = 1; i++; j++; m--; } } } //遍历 for (int m = 0; m < arr.length; m++) { for (int n = 0; n < arr[m].length; n++) { System.out.print(arr[m][n] + "\t"); } System.out.println(); } } }
/*算法的考查: * 定义一个Int型的一维数组,包含10个元素,分别赋一些随机整数,然后, * 求出所有元素的最大值,最小值,和值,平均值,并输出来。 * 要求:所有随机数都是两位数。 * 提示: * [0,1)*90 -> [0,90)+10 -> [10,100) -> [10,99) * (int)(Math.random()*90+10) * */ public class RandomSumExer { public static void main(String[] args) { int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) (Math.random() * 90 + 10); System.out.print(arr[i] + "\t"); } System.out.println(); //求数组元素的最大值 int maxValue = arr[0];//初始值设为数组的某个元素而不是0,避免有负数时,最小值还是0 int minValue = arr[0]; int sumValue = 0; for(int i = 0;i < arr.length;i++){ if(maxValue < arr[i]){ maxValue = arr[i]; } } System.out.println("数组元素的最大值是:" + maxValue); //求数组元素的最小值 for(int i = 0;i < arr.length;i++){ if(minValue > arr[i]){ minValue = arr[i]; } sumValue += arr[i]; } System.out.println("数组元素的最小值是:" + minValue); //求数组元素的总和 System.out.println("数组元素的总和是:" + sumValue); //求数组元素的平均数 System.out.println("数组元素的平均数是:" + sumValue/arr.length); } }
package com.song.exer; /*使用简单数组 * 1、创建一个名为ArrayExer4的类,在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 ArrayExer4 { public static void main(String[] args) { int[] array1, array2; array1 = new int[]{2,3,5,7,11,13,17,19}; //显示array1的内容 for(int i = 0;i < array1.length;i++){ System.out.print(array1[i] + "\t"); } System.out.println(); //赋值array2变量等于array1 //不能称作数组的赋值 array2 = array1; //修改array2中的偶索引元素,使其于索引值, for(int i = 0;i < array2.length;i++){ if (i % 2 == 0) { array2[i] = i; }// } System.out.println("******************************"); //打印array1 for(int i = 0;i < array1.length;i++){ System.out.print(array1[i] + "\t"); } } } /*使用简单数组 * 思考:array1和array2是什么关系?他们地址相同,都指向了堆空间中的唯一的一个数组实体 * 拓展:修改题目,实现array2对array1数组的复制 * */ public class ArrayExer5 { public static void main(String[] args) { int[] array1, array2; array1 = new int[]{2, 3, 5, 7, 11, 13, 17, 19}; //显示array1的内容 for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + "\t"); } System.out.println(); //数组的复制 array2 = new int[array1.length]; for (int i = 0; i < array2.length; i++) { array2[i] = array1[i]; } //修改array2中的偶索引元素,使其于索引值, for (int i = 0; i < array2.length; i++) { if (i % 2 == 0) { array2[i] = i; } } System.out.println("******************************"); //打印array1 for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + "\t"); } } }
/* * 算法的考查:数组的复制,反转,查找 (线性查找 ,二分法查找 ) * */ public class ArrayTest4 { public static void main(String[] args) { String[] arr1 = new String[]{"李洋", "五哥", "小二", "掌柜", "客官","大侠"}; //数组复制(区别于数组变量的赋值:arr2=arr1) String[] arr2 = new String[arr1.length]; for (int i = 0; i < arr2.length; i++) { arr2[i] = arr1[i]; } //数组的反转 //方法一 for (int i = 0; i < arr1.length / 2; i++) { String temp = arr1[i]; arr1[i] = arr1[arr1.length - i - 1]; arr1[arr1.length - i - 1] = temp; } //遍历 for (int i = 0; i < arr1.length; i++) { System.out.print(arr1[i] + "\t"); } System.out.println(); //方法二 for (int i = 0, j = arr1.length - 1; i < j; i++, j--) { String temp = arr1[i]; arr1[i] = arr1[j]; arr1[j] = temp; } //遍历 for (int i = 0; i < arr1.length; i++) { System.out.print(arr1[i] + "\t"); } System.out.println(); //查找(或搜索) //线性查找 String dest = "大"; boolean isFlag = true; for (int i = 0; i < arr1.length; i++) { if (dest.equals(arr1[i])) { System.out.println("找到了指定的元素,是第 " + (i + 1) + " 个元素"); isFlag = false; break; } } if (isFlag) { System.out.println("没找到!"); } //二分法查找: //前提:所要查找的数组必须有序 int[] arr3 = new int[]{-60,-50,-40,-30,-1,20,35,70,80,90,100}; int dest1 = 90;//查找目标 int head = 0;//初始的首索引 int end = arr3.length-1;//初始的末索引 boolean isFlag1 = true; while (head <= end) { int middle = (head + end) / 2; if (dest1 == arr3[middle]) { System.out.println("找到了指定的元素,位置是 " + middle); isFlag1 = false; break; } else if (arr3[middle] > dest1) { end = middle - 1; } else { head = middle + 1; } } if (isFlag1) { System.out.println("没找到!"); } } }
排序算法分类:内部排序和外部排序
- 内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排序 操作都在内存中完成。
- 外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的是多路归排序。可以认为外部排序是由多次内部排序组成。
十大内部排序算法:
- 选择排序
- 直接选择排序、堆排序
- 交换排序
- 冒泡排序、快速排序
- 插入排序
- 直接插入排序、折半插入排序、Shell排序
- 归并排序
- 桶式排序
- 基数排序
冒泡排序
介绍:冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
排序思想:
- 比较相邻的元素。如果第一个比第二大(升序),就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的上面的步骤,直到没有任何一对数字需要比较为止。
/* * 数组的冒泡排序的实现 * */ public class BubbleSortTest { public static void main(String[] args) { int[] arr = new int[]{5, 55, 44, 35, 61, -98, 0, 3, 86, 47, 102}; //冒泡排序 for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i] + "\t"); } } }
快速排序
介绍:
快速排序通常明显比同为O(nlog) 的其他算法更快,因此常被 采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可见掌握快排的重要性。快速排序(Quick Sort)由图灵奖获得者Tony Hoare发明,被列为20世纪十大算法之一,是迄今为止所有内排序算法中速度最快的一种。冒泡排序的升级版,交换排序的一种。快速排序的时间复杂度为O(nlog(n))。
排序思想:
- 从数列中挑出一个元素,称为”基准“(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后 ,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
- 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了,虽然一直递归下去,但是这个算法总会结束,因此在第次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
/* * 快速排序 * */ public class Test { public static void swap(int[] data, int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } private static void subSort(int[] data, int start, int end) { if (start < end) { int base = data[start]; int low = start; int high = end + 1; while (true) { while (low < end && data[++low] - base <= 0) ; while (high > start && data[--high] - base >= 0) ; if (low < high) { swap(data, low, high); } else { break; } } swap(data, start, high); subSort(data, start, high - 1);//递归调用 subSort(data, high + 1, end); } } public static void quickSort(int[] data) { subSort(data, 0, data.length - 1); } public static void main(String[] args) { int[] data = {9, -20, 16, 30, 23, -30, -49, 25, 54, 30}; System.out.println("排序之前:\n" + java.util.Arrays.toString(data)); quickSort(data); System.out.println("排序之后:\n" + java.util.Arrays.toString(data)); } }
排序算法性能对比
各种内部排序方法性能比较
- 从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。
- 从算法简单性能看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法。对Shell排序,堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。
- 从稳定性看:直接插入排序、冒泡排序和归并排序是稳定的;而直接排序、快速排序、Shell排序和堆排序是不稳定排序。
- 从待排序的记录数n的大小看:n较小时,宜采用简单排序;而n较大时宜采用改进排序
排序算法的选择
- 若n较小(如n<=50),可采用直接插入或直接选择排序。当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选择直接选择排序为宜。
- 若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜。
- 若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
3-5 Arrays工具类的使用
import java.util.Arrays; /* * java.util.arrays:操作数组的工具类,里面定义了很多操作数组的方法 * * */ public class ArraysTest { public static void main(String[] args) { //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):输出数组信息 String s = Arrays.toString(arr1); System.out.println(s); //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(arr2)); //5、int binarySearch(int[] a,int key) int[] arr3 = {9, -20, 16, 30, 23, -30, -49, 25, 54, 30}; int index = Arrays.binarySearch(arr3, 23); System.out.println(index); if (index >= 0) { System.out.println("找到了!"); } else { System.out.println("没找到!"); } } }
3-6 数组使用中的觉异常
/* * 数组中的常见异常 * 1、数组角标越界的异常:ArrayIndexOutOfBoundsExcetion * 2、空指针异常:NullPointerException * */ public class ArrayExceptionTest { public static void main(String[] args) { //1、数组角标越界的异常:ArrayIndexOutOfBoundsExcetion int[] arr1 = new int[]{1,2,3,4,5}; // for (int i = 0; i <= arr1.length; i++) { // System.out.println(arr1[i]); // } // System.out.println(arr1[-2]); //2、空指针异常:NullPointerException //情况一: // int[] arr2 = new int[]{1,2,3,4}; // arr2 = null; // System.out.println(arr2[0]); //情况二: // int[][] arr3 = new int[4][]; // System.out.println(arr3[0][0]); //情况三: String[] arr4 = new String[]{"aa","bb","cc"}; arr4[0]=null; System.out.println(arr4[0].toString()); } }
复习:
/* * 1、使用冒泡排序,实现如下数组从小到大排序 * */ public class BubbleSortTest2 { public static void main(String[] args) { int[] arr = new int[]{99,-62,20,-10,-20,35,-40,60,-90}; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } } }