Java笔记3.1——Java基础之数组

第3章 数 组

目录

第3章 数 组

一.Eclipse 的使用配置 

二. 数组的概述

1.数组的概念

2.数组的特点

三.一维数组的使用

1.声明

2.初始化

3.数组元素的引用

4.数组元素的默认初始化值

5. 代码演示

6.内存的简化结构

7.练习题

四.多维数组的使用

1.概念

2.多维数组的使用

3.二维数组的内存解析

4.代码演示

5.课后练习 

五.数组中涉及的常见算法

1.练习题

2.二分法查找算法

3.排序算法

         3.1.冒泡排序

         3.2.快速排序

4.排序算法性能对比

4.1.各种内部排序方法性能比较

4.2.排序算法的选择

六.Arrays工具类的使用

七.数组使用中的常见异常


一.Eclipse 的使用配置 

详细信息参考:F:\工具\JAVA所需软件\软件\03_Eclipse\Eclipse的使用\Eclipse的使用配置.pdf

二. 数组的概述

1.数组的概念

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

 数组的常见概念:  数组名 、下标(或索引) 、元素、 数组的长度。

2.数组的特点

 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。

 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。

 数组的长度一旦确定,就不能修改。

 可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。

 数组的分类: 按照维度:一维数组、二维数组、三维数组、…

                          按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)

三.一维数组的使用

1.声明

 一维数组的声明方式: type var[] 或 type[] var;

 例如: int a[];    int[] a1;    double b[];     String[] c;       //引用类型变量数组

 Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法

2.初始化

 动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行

 静态初始化:在定义数组的同时就为数组元素分配空间并赋值。

3.数组元素的引用

 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;

 数组元素的引用方式:数组名[数组元素下标]

①.数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];

②.数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 —>n-1;如int a[]=new int[3]; 可引用的数组元素为a[0]、a[1]、a[2]

 每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长度(元素个数)

①.数组一旦初始化,其长度是不可变的

4.数组元素的默认初始化值

数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式 初始化。

①.对于基本数据类型而言,默认初始化值各有不同

②.对于引用数据类型而言,默认初始化值为null(注意与0不同!)

Java笔记3.1——Java基础之数组_第1张图片

5. 代码演示

package com.array.test;
/**
 * 
* @Description
* @author tyl Email:
* @version
* @date 2022年10月31日下午3:54:50
*
 */

/* 一维数组的使用
 * 1.一维数组的声明与初始化
 * 2. 如何调用数组的指定位置元素
 * 3.如何获取数组的长度
 * 4.遍历数组
 * 5.数组元素的默认初始化值
 * 6.数组的内存解析
 */
public class ArrayTest {
	/**
	* @Description 
	* @author tyl
	* @date 2022年10月31日下午4:46:52
	* @param args
	*/
	/**
	* @Description 
	* @author tyl
	* @date 2022年10月31日下午4:53:14
	* @param args
	*/
	public static void main(String[] args) {
		
		//1.一维数组的声明与初始化
		int[] ids; //声明
		//1.1 静态初始化:数组的初始化与数组的赋值同时进行
		ids = new int[]{1001, 1002, 1003, 1004}; //初始化
		//1.2 动态初始化:数组的初始化与数组元素的赋值分开进行
		String[] names = new String[5];
		//总结:数组一旦初始化之后,其长度就确定了。
		
		//2. 如何调用数组的指定位置元素:通过角标的方式调用
		// 从0开始
		names[0] = "wsasa";
		names[1] = "txxzx";
		names[2] = "yass";
		names[3] = "lqwqw";
		names[4] = "cgrgf";
		//names[5] = "wcaad"; //超出数组长度
		
		//3.如何获取数组的长度
		//方法属性:length
		System.out.println(names.length);
		System.out.println(ids.length);
		
		//4.遍历数组
/*		System.out.println(names[0]);
		System.out.println(names[1]);
		System.out.println(names[2]);
		System.out.println(names[3]);
		System.out.println(names[4]);*/ 
		
		for (int i=0; i

6.内存的简化结构

Java笔记3.1——Java基础之数组_第2张图片

 7.练习题

package com.array.demo;

import java.util.Scanner;

/*2. 从键盘读入学生成绩,找出最高分,
并输出学生成绩等级。
成绩>=最高分-10 等级为’A’ 
成绩>=最高分-20 等级为’B’
成绩>=最高分-30 等级为’C’ 
其余 等级为’D’
提示:先读入学生人数,根据人数创建int数组,
存放学生成绩。*/

public class ArraryDemo1 {
	public static void main(String[] args) {
		//1.使用Scanner获取学生人数
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入学生人数:");
		int number = scan.nextInt();
		
		//2.创建数组 动态初始化
        //int[] sorces = new int[number];
		double[] sorces = new double[number];
		
		//3.给数组赋值
		System.out.println("请输入"+number+"学生成绩");
		for(int i =0; i
/*升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。
屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。*/

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); //联系方式:18013820100
	}
}

四.多维数组的使用

1.概念

 Java 语言里提供了支持多维数组的语法。

 如果说可以把一维数组当成几何中的线性图形, 那么二维数组就相当于是一个表格,像右图Excel 中的表格一样。

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

2.多维数组的使用

Java笔记3.1——Java基础之数组_第3张图片

Java笔记3.1——Java基础之数组_第4张图片

 3.二维数组的内存解析

Java笔记3.1——Java基础之数组_第5张图片

 4.代码演示

package com.array.test;

/**
 * 
* @Description
* @author tyl 
* @version
* @date 2022年11月2日下午4:23:55
*
 */
/*  二维数组的使用
 * 
 * 1.二维数组的声明与初始化
 * 2.如何调用数组的指定位置元素
 * 3.如何获取数组的长度
 * 4.遍历数组
 * 5.数组元素的默认初始化值
 * 6.数组的内存解析
 * 
 * 
 */


public class ArrayTest2 {
	/**
	 * 
	* @Description 
	* @author tyl
	* @date 2022年11月2日下午4:25:04
	* @param args
	 */
	public static void main(String[] args) {

		// 1. 二维数组的声明与初始化
		int[] arr = new int[]{1,2,3}; //一维数组
		
		//静态初始化
		int[][] arr1 = new int[][]{{1,2,3},{2,3},{5,6}};
		//动态初始化1
		String[][] arr2 = new String[3][2];
		//动态初始化2
		String[][] arr3 = new String[3][];
		
		//正确
		int[] arr4[] = new int[][]{{1,2,3},{2,3},{5,6}};
		int arr5[][] = {{1,2,3},{2,3},{5,6}};
		int [] arr6 = {1,2,3};
		
		
		//2. 如何调用数组的指定位置元素
		System.out.println(arr1[0][1]); //2
		System.out.println(arr2[1][1]); //null
		
		arr3[1] = new String[4]; //给数组添加值
		System.out.println(arr3[1][0]); // null
		
		//3.如何获取数组的长度
		System.out.println(arr4.length); //3 外层
		System.out.println(arr4[0].length); //3 内层
		System.out.println(arr4[1].length); //2
		
		
		// 4.遍历数组
		for (int i=0; i

5.课后练习 

public class ArrayTest3 {
	
	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
package com.array.test;

/*使用二维数组打印一个 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]=yangHui[i][i] = 1;
			//2.2给每行的非首末元素赋值
			if(i>1){
				for(int j =1; j

声明:int[] x,y[]; 在给x,y变量赋值以后,以下选项允许通过编译的是:

a ) x[0] = y; no  

b) y[0] = x; yes

c) y[0][0] = x; no

d) x[0][0] = y; no

e) y[0][0] = x[0]; yes

f) x = y; no

提示:

一维数组:int[] x 或者int x[]

二维数组:int[][] y 或者 int[] y[] 或者 int y[][]

五.数组中涉及的常见算法

1. 数组元素的赋值(杨辉三角、回形数等)

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

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

4. 数组元素的排序算法

1.练习题

package com.array.test;

/*定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
要求:所有随机数都是两位数。
*/

public class ArrayTest4 {
	public static void main(String[] args) {
		int[] arr = new int[10];
		
		// 给数组赋值
		for(int i =0; i arr[i]){
				minValue = arr[i];
			}
		}
		System.out.println("最小值为:"+minValue);
		
		//求出总和
		int sum = 0;
		for(int i =0;i
package com.array.demo;

/* 使用简单数组
(1) 创建一个名为ArrayTest的类,在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。*/

public class ArrayDemo2 {
	public static void main(String[] args) {
		// 声明array1和array2两个变量
		int [] array1,array2;
		
		//使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
		array1 = new int[]{2,3,5,7,11,13,17,19};
		
		//显示array1的内容
		for (int i =0; i

思考:array1和array2是什么关系?

答:两者的地址值是一样的,在堆空间中指向同一个数组。(只new了一个数组)

拓展:修改题目,实现array2对array1数组的复制

答:相当于在堆空间中又new一个新的数组,两个地址值。

Java笔记3.1——Java基础之数组_第6张图片

 

Java笔记3.1——Java基础之数组_第7张图片

 2.二分法查找算法

package com.array.demo;

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

public class ArrayDemo3 {
	public static void main(String[] args) {
		
		String[] arr = new String[]{"sasas","sasas","sasasas","ssasa","sasasas"};
		
		//数组的复制
		String[] arr1 = new String[arr.length];
		for(int i =0;i dest2){
				end = middle-1;
			}else{ //arr3[middle] < dest2
				head = middle + 1;
			}
		}
		if(isFlag3){
			System.out.println("很遗憾!没找到");
		}
	
				
	}

}

3.排序算法

排序:假设含有n个记录的序列为{R1,R2,...,Rn},其相应的关键字序列为 {K1,K2,...,Kn}。将这些记录重新排序为{Ri1,Ri2,...,Rin},使得相应的关键 字值满足条Ki1<=Ki2<=...<=Kin,这样的一种操作称为排序。

 通常来说,排序的目的是快速查找。

衡量排序算法的优劣:

1.时间复杂度:分析关键字的比较次数和记录的移动次数

2.空间复杂度:分析排序算法中需要多少辅助内存

3.稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保 持不变,则称这种排序算法是稳定的。

排序算法分类:内部排序和外部排序。

 内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排 序操作都在内存中完成。

 外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排 序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最 常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。

 

Java笔记3.1——Java基础之数组_第8张图片

 

Java笔记3.1——Java基础之数组_第9张图片

3.1.冒泡排序

介绍: 冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

排序思想:

1. 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。

2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步 做完后,最后的元素会是最大的数。

3. 针对所有的元素重复以上的步骤,除了最后一个。

4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止。

代码实现:

package com.array.test;

/*冒泡排序的实现
 * 
 */
public class BubbleSortTest {
	/**
	 * 
	* @Description 
	* @author tyl
	* @date 2022年11月4日下午7:39:34
	* @param args
	 */
	public static void main(String[] args) {
		
		int[] arr = new int[]{55,66,44,88,-12,-65,0,55,22};
		
		//冒泡排序
		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;
				}
			}
			
		}
		
		//需要打印才能显示
		System.out.println();
		for (int i =0; i

3.2.快速排序

介绍: 快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快 排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可见掌握快排的重要性。

快速排序(Quick Sort)由图灵奖获得者Tony Hoare发明,被列为20世纪十 大算法之一,是迄今为止所有内排序算法中速度最快的一种。冒泡排序的升 级版,交换排序的一种。快速排序的时间复杂度为O(nlog(n))。

排序思想:

1. 从数列中挑出一个元素,称为"基准"(pivot),

2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准 值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后, 该基准就处于数列的中间位置。这个称为分区(partition)操作。

3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数 列排序。

4. 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好 了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代 (iteration)中,它至少会把一个元素摆到它最后的位置去。

4.排序算法性能对比

Java笔记3.1——Java基础之数组_第10张图片

 4.1.各种内部排序方法性能比较

1.从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归 并排序。

2.从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较 简单,将其认为是简单算法。对于Shell排序、堆排序、快速排序和归并排序 算法,其算法比较复杂,认为是复杂排序。

3.从稳定性看:直接插入排序、冒泡排序和归并排序时稳定的;而直接选择排序、快速排序、 Shell排序和堆排序是不稳定排序

4.从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采 用改进排序。

4.2.排序算法的选择

(1)若n较小(如n≤50),可采用直接插入或直接选择排序。 当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直 接插入,应选直接选择排序为宜。

(2)若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排 序为宜;

(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或 归并排序。

六.Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比 如排序和搜索)的各种方法。

Java笔记3.1——Java基础之数组_第11张图片

package com.array.test;

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,1,3};
		int [] arr2 = new int[]{1,1,2,3};
		boolean isEquals = Arrays.equals(arr1, arr2);
		System.out.println(isEquals);
		
		//2.String toString(int[] a) 输出数组信息
		System.out.println(Arrays.toString(arr2));
		
		//3.void fill(int[] a,int val)  将指定值填充到数组之中。
		Arrays.fill(arr2, 10);
		System.out.println(Arrays.toString(arr2));
		
		//4.void sort(int[] a)  对数组进行排序
		Arrays.sort(arr1);
		System.out.println(Arrays.toString(arr1));
		
		//5.nt binarySearch(int[] a,int key)  对排序后的数组进行二分法检索指定的值。
		int []  arr3 = new int[]{-42,-21,0,12,18,55,66};
		//int index = Arrays.binarySearch(arr3, 0);
		int index = Arrays.binarySearch(arr3, 88);
		if (index >= 0){
			System.out.println(index);
		}else{
			System.out.println("没找到");
		}
			
		
	}

}

七.数组使用中的常见异常

package com.array.test;

import javax.xml.soap.SAAJResult;

/*
 * 数组中的常见异常
 * 1.数组脚标越界异常(ArrayIndexOutOfBoundsException)
 * 2.空指针异常(NullPointerException)
 */
public class ArraysExceptionTest {
	public static void main(String[] args) {
		
		//1.数组脚标越界异常(ArrayIndexOutOfBoundsException)
		int[] arr = new int[]{1,2,3,4,5};
		
//		for(int i =0;i<=arr.length; i++){
//			System.out.println(arr[i]);
//		}
		
//		System.out.println(arr[-2]);
		
		//2.空指针异常(NullPointerException)
		//情况1:
//		int[] arr1 =new int[]{1,2,3};
//		arr1 =null;
//		System.out.println(arr1[0]);
		
		//情况2:
//		int[][] arr2 = new int[4][];
//		System.out.println(arr2[0][0]);
		
		//情况3:
//		String[] arr3 = new String[]{"aa","bb","cc"};
//		arr3[0] = null;
//		System.out.println(arr3[0].toString());

	}	
}

Java笔记3.1——Java基础之数组_第12张图片

 数组东西细节还挺多的,杨辉三角、冒泡排序、快速排序都挺难的,需要记住!

2022.11.4学习结束,下一章面向对象继续加油!........................................................................

你可能感兴趣的:(Java,java,eclipse,开发语言)