day06
- 数组在内存中的地址
1.1 两个数组在内存中指向两个地址
1.2 两个数组在内存中指向同一块内存空间
2. 数组中的异常
异常: 指程序在正常的运行过程中,出现了一些错误的或者是意外的情况,称为异常.
目前学习到的情况,代码中如果出现了异常,只能停止代码
2.1 数组下标(索引)越界
- 数组下标越界: 下标,角标,索引,三者表示的都是同一个含义 ; 越界: 超出范围
发生原因: 获取数组中不存在的索引元素对应的元素值(使用了数组中不存在的索引)
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
at ArrException.main(ArrException.java:10)
解释: ArrayIndexOutOfBoundsException 数组下标越界
- 数组下标越界的解决方案:
因为数组中的索引不存在发生异常----> 每次使用索引之前,判断一下数组中是否包含这个索引—>数组中可以用索引索引0—数组长度-1
结论: 判断使用的索引需要在0-(数组长度-1)之间
代码
// 数组中的异常 : Exception 就表示异常
public class ArrException{
public static void main(String[] args) {
int[] arr = new int[3];
// 2索引在数组中存在的,最大的索引
System.out.println(arr[2]);// 0
// 3索引在数组arr中,根本不存在
// System.out.println(arr[3]);
/*
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
at ArrException.main(ArrException.java:10)
*/
// 数组下标越界异常的解决方式:
int index = 3;
if( index >= 0 && index <= arr.length-1 ){
System.out.println(arr[index]);
}else{
System.out.println("数组中不存在"+index+"索引");
}
}
}
2.2 空指针异常
- 在Java中,所有的引用数据类型有一个默认的值,可以设置为null,表示空
- 如果数组的值设置为null,那么再针对数组做操作(例如通过索引获取元素,求数组长度等等)就会报出空指针异常
NullPointerException : 空指针异常 - 空指针异常的解决方案
只要验证数组不为null就可以了
代码
// 数组的空指针异常
public class ArrException1{
public static void main(String[] args) {
int[] arr = new int[5];
System.out.println(arr);// 15db9742
System.out.println(arr[0]);// 0
// 将数组arr1 的值设置为null,null是所有引用数据类型的默认值,表示空
int[] arr1 = null;
/*
空指针异常发生的原因:
1) 引用数据类型的值设置为null,表示空,表示什么都没有
2) 要使用这个引用数据类型做任何操作(打印除外),都会报出空指针异常
*/
System.out.println(arr1);// null
// NullPointerException : 空指针异常
// System.out.println(arr1[0]);
// System.out.println(arr1.length);// NullPointerException : 空指针异常
//空指针异常的解决方案: 只要验证数组不为null就可以了
if( arr1 != null ){// 表示arr1 不为 null
System.out.println(arr1[0]);
System.out.println(arr1.length);// NullPointerException : 空指针异常
}else{
System.out.println("数组不能为null");
}
}
}
空指针异常的图解:
- 数组的操作
3.1 数组中的最值
要求: 定义一个方法,能获取到任意一个int[]的最大值
代码
// 求数组中的最大值
public class ArrMax {
public static void main(String[] args) {
int[] arr = {2,3,-9,99,78,177};
//int[] arr = null ;
//int[] arr = {};// arr在内存中有地址,只不过容器中没有元素,长度为0
int max = getMax(arr);
System.out.println(max);
}
// 要求: 定义一个方法,能获取到任意一个int[]的最大值
public static int getMax(int[] a){
// 数组不能为null,再控制数组的长度不能为0
if( a != null && a.length != 0){
// 擂台思想: 向将数组中的第一个元素,当做最大值,将数组中的而每一个元素进行比较
// 较大值,赋值为max
int max = a[0];// 先默认将数组中的第一个元素,当做最大值
// 获取到数组中的每一个元素,使用循环的方式
for( int i = 1 ; i < a.length ; i ++ ){
if(max < a[i]){// a[i] 大于当前数组中的最大值,做替换,将a[i]赋值为max
max = a[i];
}
}
return max ;//将最大值进行返回
}else{
System.out.println("数组不能为null,默认返回0");
return 0;
}
}
}
3.2 指定元素在数组中的索引位置
要求: 给定数据5,判断5在数组int[] arr = {3,4,5,77,8,0} 中第一次出现的索引位置
如果,在数组中找到数据,就返回对应的索引位置,没有找到数据,就返回-1
3.3 数组的反转
要求 : 给出人一个int[] arr = {1,2,3,4,5,6,99},获取到数组的反转结果
分析: 将最后一个元素与第一个元素进行值的替换; 将倒数第二个元素与第二个元素进行替换…,直到替换到数组的中间位置结束
结果 : {99,6,5,4,3,2,1}
代码
// 数组的反转
public class ArrFanZhuan{
public static void main(String[] args) {
int[] a = {99,8,7,0,66,44}; // {44,66,0,7,8,99}
int[] w = getFanZhuanArr(a);
printArr(w);
}
/*
要求 : 给出人一个int[] arr = {1,2,3,4,5,6,99},获取到数组的反转结果
分析: 将最后一个元素与第一个元素进行值的替换; 将倒数第二个元素与第二个元素进行替换...,直到替换到数组的中间位置结束
结果 : {99,6,5,4,3,2,1}
*/
public static int[] getFanZhuanArr(int[] arr){
for( int i = 0 , j = arr.length -1 ; i < j ; i ++ , j -- ){
// 数组元素的替换
// 先将arr[i] 原值保留下来
int temp = arr[i];
// 将大索引的值替换给小索引
arr[i] = arr[j];
// 将小索引的值替换给大索引
arr[j] = temp ;
}
return arr ;
}
public static void printArr(int[] i){
for( int m = 0 ; m < i.length ; m ++ ){
System.out.println(i[m]);
}
}
}
3.4 数组的排序
要求: 给出一个数组 int[] arr = {-6,9,7,99,2,0,13}
将数组中的元素,按照从小到大的顺序进行排序(升序排列)
排序方法: 选择排序
代码
// 选择排序
public class XuanZePaiXu {
public static void main(String[] args) {
int[] arr = {1,8,23,-4,25};
printArr(arr);
System.out.println("---------------------");
// 数组中5个元素,一共比较了四次
for( int i = 0 ; i < arr.length-1 ; i ++ ){
for( int j = i+1 ; j < arr.length ; j ++ ){
// 小索引上面存储的小的数值,大索引存储大的数值
if(arr[i] > arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printArr(arr);
}
public static void printArr(int[] i){
for( int m = 0 ; m < i.length ; m ++ ){
System.out.println(i[m]);
}
}
}
- 二维数组
二维数组 : 定义一个数组,数组中的每一个元素,恰巧又是另外一个数组
4.1 二维数组的定义
- 动态定义二维数组
int[] arr = new int[3];
数据类型[][] 数组名 = new 数据类型[必须给出一个容器大小][可以为空,可以写int
类型数值]
int[][] arr1 = new int[3][5];
解释说明: int[][] arr1 = new int[3][5];
定义arr1一个数组,数组长度是3, 数组中的每一个元素都是一个长度为5的int类型数组
代码
public static void main(String[] args) {
int[][] arr = new int[3][2];
System.out.println(arr); // [[I@15db9742
}
二维数组变量打印结果:
[[I@15db9742 :
[[ : 表示是一个二维数组
I : 二维数组中,每一个数组元素都是int类型
@ : 没有特殊含义,就表示分隔符
15db9742 : 二维数组在内存中的地址
- 静态定义一个二维数组
int[] arr = {1,2,3,4,5,-9};
int[][] arr1 = {{1,2},{},{3,4,5}};
解释:
arr1这个二维数组,包含了三个一维数组元素
分别是: {1,2} , {} , {3,4,5}
arr1[2][1]----->4
4.2 二维数组中元素的获取方式
int[][] arr1 = new int[3][5];
arr1[0]----> 输出结果就是一个一维数组的地址
arr1[0][0]----> 将arr1二维数组中的第一个数组元素里面的第一个数值获取到
代码
// 二维数组的定义
public class ArrArrDemo{
public static void main(String[] args) {
// 1. 二维数组的定义
int[][] arr = new int[3][2];
System.out.println(arr); // [[I@15db9742
System.out.println(arr.length);
System.out.println(arr[0][0]);//0
System.out.println(arr[1]);// 地址值
System.out.println(arr[2]);// 地址值
System.out.println("--------------------");
// 2. 二维数组中元素的赋值
arr[0][1] = 88;
System.out.println(arr[0][0]);// 0
System.out.println(arr[0][1]);// 88
}
}
4.3二维数组的遍历
将二维数组中的每一个元素值获取到,使用循环实现
int[][] arr = {{1,2},{4,4,67},{-9}};
代码
// 二维数组的遍历
public class ArrArrBianLi{
public static void main(String[] args) {
// 将二维数组arr进行遍历,就是将二维中的每一个数值的元素获取到
int[][] arr = {{1,2},{4,4,67},{-9}};
for(int i = 0 ; i < arr.length ; i++ ){// 将二维数组中的每一个数组元素获取到
// arr[i]----->{1,2} 二维数组中的每一个元素,都是一个一维数组
for( int j = 0 ; j < arr[i].length ; j ++ ){
int ele = arr[i][j];
System.out.println(ele);
}
}
}
}