(尚硅谷java零基础教程)学习笔记day7/8-数组

1、数组的概述

1.1 定义

数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

1.2 数组的相关概念

  • 数组名
  • 元素
  • 数组的索引/下标
  • 数组的长度:元素的个数

1.3 数组的特点

(1) 数组是有序排列的;
(2) 数组本身属于引用数据类型,数组的元素是基本数据类型或引用数据类型;
(3) 数组在内存中占用一块连续的内存空间,数组名引用的是这块连续空间的首地址;
(4) 数组在内存中长度一旦确定,不可以修改

1.4 数组的分类*

(1)按照维数:一维数组、二维数组、……
(2)按照数组元素的类型:基本数据类型的数组、引用数据类型的数组

2、一维数组的使用

2.1 声明和初始化

  1. 声明是指出数组元素是什么类型的。
  2. 声明方式:type var[] 或 type[] var,声明的时候中括号 [] 放在类型后面或者数组名称后面都没有问题。
  3. 数组声明的时候不能指定其长度(数组元素的值),例如: int a[5]; //非法
  4. 初始化两种方式:静态初始化和动态初始化。
  5. 静态初始化: 在定义数组的同时就为数组元素分配空间并赋值。
  6. 动态初始化 :数组声明且为数组元素分配空间与赋值的操作分开进行。
int[] ids;//声明和初始化分开进行
//静态初始化:数组的初始化和数组元素的赋值操作同时进行
ids = new int[]{1001,1002,1003,1004};
//动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[5];//这里声明和初始化同时进行
names[0] = “钱学森”;
names[1] = “邓稼先”;
names[2] = “袁隆平”;

注意:
(1)声明和初始化可以分步进行也可以同步进行。
(2)不管是动态还是静态初始化,数组的长度就确定了,不能更改。
(3)静态初始化时候的 new int 语句可以省略,也是正确的可以编译通过的,例

String names1[] = {
“李四光”,“茅以升”,“华罗庚”
}

2.2 调用数组的指定位置的元素

  1. 数组元素的引用方式:数组名[数组元素下标]
  2. 数组的角标(索引)是从 0 开始的,到数组的长度 N-1 结束
  3. int a[]=new int[3]:可引用的数组元素为a[0]、a[1]、a[2]
  4. 定义并用运算符 new 为之分配空间后,才可以引用数组中的每个元素,即new之后,堆空间中才会为数组元素赋默认值。

2.3 获取数组的长度

  1. 每个数组都有一个属性 length 指明它的长度,例如:a.length指明数组a的长度(元素个数)
  2. 数组一旦初始化,其长度是不可变的
//属性:length
System.out.println(names.length);	//3
System.out.println(ids.length);		//4

2.4 遍历数组

  1. 使用 for 循环,同时需要用到数组长度属性作为循环条件。
/*		
System.out.println(names[0]);
System.out.println(names[1]);
System.out.println(names[2]);
*/
for (int i=0;i<names.length;i++){
	System.out.println(names[i]);
}

2.5 数组元素的默认初始化值(对动态初始化来说的)

  1. 数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化
    在这里插入图片描述
    注意:
System.out.println("*******************");
boolean[] arr1 = new boolean[5];
System.out.println(arr1[0]);	//boolean型的默认值是false
		
System.out.println("*******************");
String[] arr2 = new String[5];
System.out.println(arr2[0]);	//默认值是null

2.6 数组的内存解析

  1. 放在方法中的变量都是局部变量,局部变量放置在栈空间中

  2. new 出来的结构都放置在堆当中,堆中的元素地址确定之后,将第一个元素的地址赋给局部变量,作为栈中局部变量 arr 的地址

  3. 不管是静态初始化还是动态初始化,初始的时候堆中创建的结构变量中都赋值 0/null

  4. 然后静态初始化直接将元素赋新值,动态初始化后面进行赋值

  5. 程序举例1:

public class Test{
	public static void main(String args[]){
		//1、为s分配栈内存
		int[] s;            
		//2、为数组元素开辟空间后将地址值赋给栈内的s,并为他们赋默认值。        		
		s = new int[10];					
		// int[] s=new int[10];
		// 基本数据类型数组在显式赋值之前,
		// Java会自动给他们赋默认值。
		for ( int i=0; i<10; i++ ) {
		//3、为数组元素赋值,即把相应地址之内储存的数值进行修改。
			s[i] =2*i+1;					
			System.out.println(s[i]);
		}
	}
}

该程序的内存分布图示:
1
在这里插入图片描述
在这里插入图片描述
6. 程序举例2:
在这里插入图片描述

2.7 课后练习题目

1、练习1(会读程序)在这里插入图片描述
程序:

package com.atguigu.exer;

public class ArrayTest {
	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);
		//18013820100
	}
}

2、练习2
在这里插入图片描述
程序:

package com.atguigu.exer;

import java.util.Scanner;//导包快捷键ctrl+shift+o;

/*从键盘读入学生成绩,找出最高分,
并输出学生成绩等级。
成绩>=最高分-10    等级为’A’   
成绩>=最高分-20    等级为’B’
成绩>=最高分-30    等级为’C’   
其余 等级为’D’
提示:先读入学生人数,根据人数创建int数组,
存放学生成绩。*/
public class ArrayTest1 {
	public static void main(String[] args) {
		// 1.使用scanner读取学生个数num
		System.out.println("请输入学生总人数:");
		Scanner scanner = new Scanner(System.in);
		int number = scanner.nextInt();

		// 2.创建一个num长的数组score放置学生的成绩,动态初始化
		int[] score = new int[number];

		// 3.for循环内scanner输入学生成绩并赋值给score数组
		System.out.println("请输入" + number + "个学生成绩:");
		for (int i = 0; i < score.length; i++) {
			score[i] = scanner.nextInt();
		}

		// 4.通过排序算法找出最高赋值给max?如何选择效率最高的排序算法
		//这一次for循环遍历可以和上一个for循环遍历合并,减少程序复杂度
		int maxScore = 0;
		for (int i = 0; i < score.length; i++) {
			if (score[i] > maxScore) {
				maxScore = score[i];
			}
		}
		System.out.println("最高分是:" + maxScore);

		// 5.计算num个学生成绩与max的差值,if-else判断在哪一等级,并输出等级和成绩
/*		for (int i = 0; i < score.length; i++) {
			if (maxScore - score[i] <= 10) {
				System.out.println("第" + (i + 1) + "个学生的成绩为" + score[i] + ",等级为A");
			} else if (maxScore - score[i] <= 20) {
				System.out.println("第" + (i + 1) + "个学生的成绩为" + score[i] + ",等级为B");
			} else if (maxScore - score[i] <= 30) {
				System.out.println("第" + (i + 1) + "个学生的成绩为" + score[i] + ",等级为C");
			} else {
				System.out.println("第" + (i + 1) + "个学生的成绩为" + score[i] + ",等级为D");
			}
		}*/
		
		//宋老师版本
		char level;
		for (int i = 0; i < score.length; i++) {
			if (maxScore - score[i] <= 10) {
				level = 'A';
			} else if (maxScore - score[i] <= 20) {
				level = 'B';
			} else if (maxScore - score[i] <= 30) {
				level = 'C';
			} else {
				level = 'D';
			}
			System.out.println("第" + (i + 1) + "个学生的成绩为" + score[i] + ",等级为" + level);
		}
	}
}

注意:

  1. sout 运行时间很长,所以尽量不要在循环中使用。
  2. 这里程序不严谨,默认输入成绩在0-100之间。

3、多维数组的使用(以二维数组为例)

3.1 理解

  1. 对于二维数组的理解,我们可以看成是一维数组
    array1又作为另一个一维数组array2的元素而存
    在。
  2. 从数组底层的运行机制来看,其实没
    有多维数组

3.2 声明和初始化

  1. 静态初始化有一种方式,动态初始化有两种方式,下方的程序举例,声明和初始化同时进行。
  2. 对第二种动态初始化方式,可以看出二维数组的内层数组可以稍后初始化,但不是说不用初始化,也就是必须经过 new 在堆空间中开辟空间后才能使用。

在这里插入图片描述
在这里插入图片描述
3. 程序举例:

//静态初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
	
//动态初始化1
String[][] arr2 = new String[3][2];
//动态初始化2
String[][] arr3 = new String[3][];	
	
//也是正确的
int arr4[][] = new int[][]{{1,2,3},{4,5},{6,7,8}};//两[]的位置可以变
int arr5[][] = {{1,2,3},{4,5},{6,7,8}};//当声明和初始化在一行的时候,后面的new int[][]可以省略。

注意:
(1)声明的时候两个 [][] 位置可以放置在类型后面,也可以放置在数组名称后面。
(2)对于静态初始化,当声明和初始化在一行的时候,后面的 new int[][] 可以省略,也是正确的,编译可以通过。

3.3 调用数组指定位置的元素

  1. int[][] arr = new int[3][4];//声明和初始化
  • 外层元素:arr[0],arr[1]等
  • 内层元素:arr[0][1],arr[1][2]等
  1. 若运用第二种动态初始化方式,即内层数组结构还未被创建的时候内层数组元素是不能调用的,外层数组元素默认值为null。
System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null
//System.out.println(arr3[0][1]);
//报错:NullPointerException,空指针

3.4 数组的长度

  1. 外层数组:arr.length
  2. 内层数组:arr[i].length
System.out.println(arr4.length);	//3
System.out.println(arr4[0].length);	//3
System.out.println(arr4[1].length);	//2

3.5 遍历数组

  1. 遍历一维数组需要一个 for 循环,遍历二维数组需要两个 for 循环嵌套
  2. 这里外层循环条件为外层数组长度,内层循环为内层循环长度。
for(int i = 0;i < arr4.length;i++){
	for(int j = 0;j < arr4[i].length;j++){
		System.out.print(arr4[i][j]+"  ");
	}
	System.out.println();
}

3.6 数组元素的默认初始化值(动态初始化)

  1. 针对于初始化方式1:比如int[][] arr = new int[2][3];
  • 外层元素的初始化值为:内层数组首地址值
  • 内层元素的初始化值为:与一维数组初始化情况相同,0/null
  1. 针对于初始化方式2:比如int[][] arr = new int[2][];
  • 外层元素的初始化值:null
  • 内层元素的初始化值:不能调用,否则报错空指针
int[][] arr = new int[3][4];
System.out.println(arr[0]);		//[I@15db9742,一维int型@一个地址值
System.out.println(arr[0][0]);	// 0	
//System.out.println(arr);		//[[I@6d06d69c,二维数组int型@地址
		
System.out.println("******************");
float[][] arr1 = new float[3][4];
System.out.println(arr1[0]);	//[F@6d06d69c,一维float型@地址值
System.out.println(arr1[0][0]);	// 0.0
		
System.out.println("******************");
String[][] arr2 = new String[3][4];
System.out.println(arr2[0]);	//[Ljava.lang.String;@7852e922
System.out.println(arr2[0][0]);	// null
		
System.out.println("******************");
double[][] arr3 = new double[3][];
System.out.println(arr3[0]);	// null,数组的类型是引用数据类型,默认值是null

3.7 数组的内存解析

在这里插入图片描述
以这段程序为例:
第一句程序:(1)为 arr1 分配栈内存;(2)为 arr1 的元素即外层数组在堆空间中开辟一块连续的内存后,将首地址元素值赋值给 arr1;(3)为 arr1 的元素赋默认值,这里元素内放置数组即引用数据类型,默认值为null。
第二句程序:(1)为 arr1[1] 在堆空间中开辟一块连续的内存后,将首地址元素值赋值给 arr1[1];(2)为 arr1[1] 的元素赋默认值,这里元素为 int 型,默认值为0;(3)将静态初始化定义的元素分别赋值给对应位置的元素。
第三句程序:(1)为 arr[2] 在堆空间中开辟内存,将新开辟内存的首地址值赋值给 arr[2] ;(2)赋默认值0。
第四句:将30赋值给 arr[2][1]。

3.8 课后练习题

1、练习1
在这里插入图片描述
程序:

package com.atguigu.exer;
/*
 * 练习2:见第3章数组p32
 * 
 * 获取arr数组中所有元素的和。
 * 提示:使用for的嵌套循环即可。
 * 
 */
public class ArrayExer1 {
	public static void main(String[] args) {
		int[][] arr = new int[][] { { 3, 5, 8 }, { 12, 9 }, { 7, 0, 6, 4 } };

		int sum = 0; // 记录总和
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				sum += arr[i][j];
			}
		}
		System.out.println("arr数组中所有元素的和为" + sum);
	}
}

2、练习2(观察是否可以进行赋值,即是否是同类型数据)
在这里插入图片描述
3、练习3(杨辉三角)
在这里插入图片描述
程序:

package com.atguigu.exer;
/*
 * 使用二维数组打印一个 10 行杨辉三角。
 * 
 * 【提示】
 * 1. 第一行有 1 个元素, 第 n 行有 n 个元
 * 2. 每一行的第一个元素和最后一个元素都是 1
 * 3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即:
 * yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
 */
public class YanghuiExer {
	public static void main(String[] args) {
		//定义杨辉三角出现的行列数
		int leng = 10;
		
		//1.声明并初始化储存杨辉三角的二维数组
		int[][] yanghui = new int[leng][];
		
		//2.给数组的元素赋值,这里我犯了一个天大的错误!!!!!!!!
		//yanghui[0][0] = 1;	//空指针异常:java.lang.NullPointerException				
		//System.out.println(yanghui[0][0]);		
		
		for(int i = 0;i < yanghui.length;i++){
			
			//首先定义所有二维数组的内层数组长度
			yanghui[i] = new int[i+1];
			
			yanghui[i][0] = 1;							//所有行的第一个数字都是1
			//System.out.print(yanghui[i][0] + "\t");	//对杨辉三角进行打印
			
			//这里对首尾元素赋值的时候循环条件最好是j < yanghui[i].length-1
			for(int j = 1;j < i;j++){					
				yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
				//System.out.print(yanghui[i][j] + "\t");//对杨辉三角进行打印
			}
			yanghui[i][i] = 1;							//所有行的最后一个数字都是1
			//System.out.println(yanghui[i][0]);		//对杨辉三角进行打印
		}
		
		//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();
		}
		
	}
}

4、练习4
在这里插入图片描述
程序:

package com.atguigu.exer;

/*
 * 【拓展之笔试题】
 * 创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,
 * 且是随机赋值。同时,要求元素的值各不相同。
 */
public class YanghuiExer1 {
	public static void main(String[] args) {

		// 创建一个长度为6的int型数组
		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]) {
					// 一旦发现赋值相等情况,重新赋值并重新开始判断
					arr[i] = (int) (Math.random() * 30 + 1);
					j = 0;
				}
			}
		}
		// 遍历数组
		for (int ii = 0; ii < arr.length; ii++) {
			System.out.println(arr[ii]);
		}
	}
}

4、数组中涉及到的常见算法

在这里插入图片描述

4.1 数组元素的赋值(杨辉三角、回型数)

1、杨辉三角(见3.8课后练习题练习3)
2、回型数
在这里插入图片描述
程序(自己写的):以数组下标判断是否到头
注:

  1. 借鉴尚硅谷的,设置一个循环,以有多少个数为循环结束标志(没想到)。
  2. 回型数有四个走位,所以不能单纯的嵌套循环实现,很明显要分四种情况。
package com.atguigu.exer;
import java.util.Scanner;
/*
 * 从键盘输入一个整数(1~20) 
 * 则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
 * 例如: 输入数字2,则程序输出: 1 2
 *                            4 3 
 *       输入数字3,则程序输出: 1 2 3 
 *                            8 9 4 
 *                            7 6 5 
 *       输入数字4, 则程序输出: 
 *       1   2   3   4 
 *       12  13  14  5 
 *       11  16  15  6 
 *       10   9  8   7
 */
public class HuiXingExer {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入1-20内的一个整数");
		int leng = scan.nextInt();

		// 构造n*n维数组
		int arr[][] = new int[leng][leng];
		int s = leng * leng;// 一共有多少个数

		// 为数组赋值,这里需要设置flag,因为有四次变化
		// dir=1,right; dir=2,down; dir=3,left; dir=4,up;
		int dir = 1, i = 0, j = 0;//i表示行,j表示列
		int flag = leng-1;
		for (int m = 1; m <= s; m++) {
			if (dir == 1) {
				arr[i][j] = m;
				if(j == flag){
					dir = 2;
					i++;
					j--;
				}
				j++;
			}else if(dir == 2){
				arr[i][j] = m;	
				if(i == flag){
					dir = 3;
					j--;
					i--;
				}
				i++;
			}else if(dir ==3){
				arr[i][j] = m;
				if(j == (leng-flag-1)){
					dir = 4;
					i--;
					j++;
				}
				j--;				
			}else if(dir == 4){
				arr[i][j] = m;
				if(i == (leng-flag)){
					dir = 1;
					j++;
					i++;
					flag--;
				}
				i--;
			}
		}
		
		//遍历
		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();
		}
	}
}

程序(尚硅谷):以是否赋值判断是否到头
注意:

  1. 这里 arr[i][j++] = m; 是先赋值再 ++。
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();
		}
	}
}

4.2 求数值型数组中元素的最大值、最小值、平均数、总和等

在这里插入图片描述
程序:

package com.atguigu.java;
/*
 * 求数值型数组中元素的最大值、最小值、平均数、总和等
 * 
 * 练习5:
 * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
 * 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
 * 要求:所有随机数都是两位数。
 * 
 * 提示;
 * [0,1) * 90   [0,90) + 10   [10,100)   [10,99]
 * (int)(Math.random() * 90 + 10)
 * 
 */
public class ArrayTest1 {
	public static void main(String[] args) {
		int leng = 10;
		int[] arr = new int[leng];
		
		//这里如果没有限制随机数的范围,对max,min赋值的时候应该赋值数组中的一个数
		//max = arr[0];min = arr[0];
		//然后求最大最小值的循环与赋值的循环分开
		int max = 0, min = 99, sum = 0;
		float mean = 0.0f;

		// 给一维数组赋值随机整数,且所有整数都是两位数
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * 90 + 10);
			System.out.print(arr[i] + " ");

			sum += arr[i];
			if (max <= arr[i]) {
				max = arr[i];
			}
			if (min >= arr[i]) {
				min = arr[i];
			}
		}
		System.out.println();
		mean = (float) sum / leng;
		System.out.println("max = " + max + "\tmin = " + min + "\tsum = " + sum + "\tmean = " + mean);
	}
}

注:

  1. 这里初始定义 int max = 0, min = 99; 是在已知随机数的范围是10-99 的情况下,这样可以保证在一个循环内实现。
  2. 如果不知道初始范围,最好是定义为数组中的一个数。

4.3 数组的复制、反转、查找(线性查找、二分法查找)

1、数组的复制
在这里插入图片描述
程序:

package com.atguigu.exer;

public class ArrayExer2 {
	public static void main(String[] args) {
		// 声明array1和array2两个变量
		int[] array1, array2;

		// array1初始化,每new一次在堆空间中创建一个数组
		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
		// 把array1的地址给了array2,不能称作赋值
//		array2 = array1;
		// 真正的复制操作
		array2 = new int[array1.length];
		for(int i = 0; i < array1.length;i++){
			array2[i] = array1[i];
		}

		// 修改array2中的偶索引元素,使其等于索引值
		for (int i = 0; i < array2.length; i++) {
			if (i % 2 == 0) {
				array2[i] = i;
			}
		}

		// 打印出array1,array1发生了变化!!!
		for (int i = 0; i < array1.length; i++) {
			System.out.print(array1[i] + "\t");
		}
		System.out.println();
	}
}

注:

  1. 单纯的 array2 = array1; 语句只是将 array1 中存放的地址值赋给了 array2 ,所以 array1 和 array2 指向的是堆内存中的同一快内存,改变 array2 数组的元素就会改变 array1 中的元素。
  2. 想要实现对 array1 的复制,需要如下操作,即开辟一块儿和 array1 相同长度的内存空间,然后通过循环将 array1 的值一个一个赋值给 array2:
		array2 = new int[array1.length];
		for(int i = 0; i < array1.length;i++){
			array2[i] = array1[i];
		}
  1. 两种情况的内存解析图
    在这里插入图片描述
    在这里插入图片描述
    2、数组的反转
		for(int i = 0;i < arr.length/2;i++){
			String tmp = arr[i];
			arr[i] = arr[arr.length - i - 1]; 
			arr[arr.length - i - 1] = tmp;			
		}

3、数组的查找(线性查找、二分法查找)
线性查找:从数组第一个元素开始比较,直到找到要找的元素,没有的话,会遍历数组直到最后一个元素。
二分法查找(要求数组已经有顺序,适用性较差):从数组中间开始查找

package com.atguigu.java;

public class ArrayTest2 {
	public static void main(String[] args) {
		String[] arr = new String[]{"JJ","DD","GG","MM"};
		
		//查找/搜索
		//线性查找
		String dest = "GG";
		
		boolean isFlag = false;
		for(int i = 0;i < arr.length;i++){
			//这里String类型判断用equals,不能直接用==
			if(dest.equals(arr[i])){
				System.out.println("找到了指定的元素位置为:" + i);
				isFlag = true;
				break;
			}
		}
		if(isFlag == false){
			System.out.println("很遗憾,没有找到唉!");
		}
		
		//二分法查找:(熟悉即可)
		//前提:所要查找的数组必须有序。
		int[] arr2 = new int[]{-98,-32,3,6,34,56,67,445,2323};
		int dest1 = 35;
		int head = 0;//初始的首索引
		int end  = arr2.length - 1;//初始的末索引
		boolean isFlag1 = false;
		
		while(head <= end){
			int middle = (head + end)/2;
			if(dest1 == arr2[middle]){
				System.out.println("找到了指定的元素位置为:" + middle);
				isFlag1 = true;
				break;
			}else if(arr2[middle] > dest1){
				end = middle - 1;
			}else{
				head = middle + 1;
			}
		}
		if(isFlag1 == false){
			System.out.println("很遗憾,没有找到唉!");
		}
	}
}

4.4 数组元素的排序算法

在这里插入图片描述
在这里插入图片描述
堆排序、归并排序:会说思想
冒泡排序、快速排序:会写程序
在这里插入图片描述

详情见(尚硅谷java零基础教程)学习笔记day7/8-数组元素的排序算法

5、Arrays工具类的使用

在这里插入图片描述
注:

  1. 不要忘记调用工具类包 import java.util.Arrays;
  2. 对于上述五个常用的 Arrays 方法,只有3,4返回值类型是 void ,其他的都需要定义一个相同类型的变量来接收,或者直接输出。

程序:

package com.atguigu.java;

import java.util.Arrays;
/*
 * java.util.Arrays类即为操作数组的工具类,
 * 包含了用来操作数组(比如排序和搜索)的各种方法。
 */
public class ArraysToolTest {
	public static void main(String[] args) {
		
		//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);
		
		//String toString(int[] a);输出数组信息。
		System.out.println(Arrays.toString(arr1));
		
		//void fill(int[] a,int val);将指定值填充到数组之中。
		Arrays.fill(arr1, 10);
		System.out.println(Arrays.toString(arr1));
		
		//void sort(int[] a);对数组进行排序
		System.out.println("排序前:" + Arrays.toString(arr2));
		Arrays.sort(arr2);//底层使用的是快速排序法
		System.out.println("排序后:" + Arrays.toString(arr2));
		
		//int binarySearch(int[] a,int key);对排序后的数组进行二分法检索指定的值。
		int[] arr3 = new int[]{-98,-32,3,6,34,56,67,445,2323};
		int index = Arrays.binarySearch(arr3, 56);
		//System.out.println(index);
		if(index >= 0){
			System.out.println(index);
		}else{
			System.out.println("未找到指定元素!");
		}
	}
}

运行结果:

false
[1, 2, 3, 4]
[10, 10, 10, 10]
排序前:[1, 3, 2, 4]
排序后:[1, 2, 3, 4]
5

6、数组使用中的常见异常

在这里插入图片描述
注:

  1. 空指针异常,最常见的是多维数组中,内层元素还未初始化,就调用的情况。
  2. 一旦程序出现异常,未处理时就终止程序。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值