Java基础Day06

day06

  1. 数组在内存中的地址
    1.1 两个数组在内存中指向两个地址

在这里插入图片描述

1.2 两个数组在内存中指向同一块内存空间

在这里插入图片描述
2. 数组中的异常
异常: 指程序在正常的运行过程中,出现了一些错误的或者是意外的情况,称为异常.
目前学习到的情况,代码中如果出现了异常,只能停止代码
2.1 数组下标(索引)越界

  1. 数组下标越界: 下标,角标,索引,三者表示的都是同一个含义 ; 越界: 超出范围
    发生原因: 获取数组中不存在的索引元素对应的元素值(使用了数组中不存在的索引)
    Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
    at ArrException.main(ArrException.java:10)

解释: ArrayIndexOutOfBoundsException 数组下标越界

  1. 数组下标越界的解决方案:
    因为数组中的索引不存在发生异常----> 每次使用索引之前,判断一下数组中是否包含这个索引—>数组中可以用索引索引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 空指针异常

  1. 在Java中,所有的引用数据类型有一个默认的值,可以设置为null,表示空
  2. 如果数组的值设置为null,那么再针对数组做操作(例如通过索引获取元素,求数组长度等等)就会报出空指针异常
    NullPointerException : 空指针异常
  3. 空指针异常的解决方案
    只要验证数组不为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");
	}
}

}

空指针异常的图解:
在这里插入图片描述

  1. 数组的操作
    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]);
	}
}

}

  1. 二维数组
    二维数组 : 定义一个数组,数组中的每一个元素,恰巧又是另外一个数组

4.1 二维数组的定义

  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 : 二维数组在内存中的地址

在这里插入图片描述

  1. 静态定义一个二维数组
    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);
}
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值