一文带你深入理解【Java基础】· 数组

写在前面


        Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误不足之处,请多多指正!谢谢大家!!!

        如果小哥哥小姐姐们对我的文章感兴趣,请不要吝啬你们的小手,多多点赞加关注呀!❤❤❤ 爱你们!!!


【往期回顾】

一文带你深入理解【Java基础】 · Java语言概述

一文带你深入理解【Java基础】 · Java基本语法:变量

一文带你深入理解【Java基础】 · Java基本语法:运算符

一文带你深入理解【Java基础】· Java基本语法:程序流程控制


【习题总结】

【Java基础】· 第3章 · 数组习题总结


目录

1. 数组的概述

 2. 一维数组的使用

2.1 声明

2.2 初始化

2.3 数组元素的引用

2.4 数组元素的默认初始化值

2.5 创建基本数据类型数组 (1)

3. 多维数组的使用

3.1 多维数组的使用

4. Arrays工具类的使用

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

6.代码


1. 数组的概述


1.1 数组的概述

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

数组的常见概念

  • 数组名
  • 下标(或索引)
  • 元素
  • 数组的长度

  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
  • 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
  • 数组的长度一旦确定,就不能修改
  • 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。

数组的分类:

  • 按照维度:一维数组、二维数组、三维数组、
  • 按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)


 2. 一维数组的使用


2.1 声明

一维数组的声明方式: type var[] 或 type[] var;
例如:
int a[];
int[] a1;
double b[];
String[] c; //引用类型变量数组
Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法

2.2 初始化

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

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


2.3 数组元素的引用

  • 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;
  • 数组元素的引用方式:数组名 [ 数组元素下标 ]
    • 数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];
    • 数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 —>n-1int a[]=new int[3]; 可引用的数组元素为a[0]a[1]a[2]
  • 每个数组都有一个属性 length 指明它的长度,例如: a.length 指明数组 a 的长
    ( 元素个数 )
    • 数组一旦初始化,其长度是不可变的

2.4 数组元素的默认初始化值

  • 数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。例如:
public class Test {
    public static void main(String args[]){
        int a[] = new int[5];
        System.out.println(a[3]); //a[3]的默认值为0
    } 
}
  • 对于基本数据类型而言,默认初始化值各有不同
  • 对于引用数据类型而言,默认初始化值为 null( 注意与0不同!)

2.5 创建基本数据类型数组 (1)

  • Java中使用关键字new来创建数组
  • 如下是创建基本数据类型元素的一维数组

内存的简化结构:

练习1:

升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。
屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。
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);
    } 
}

​​​


3. 多维数组的使用


3.1 多维数组的使用

  • Java 语言里提供了支持多维数组的语法。
  • 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像右图Excel中的表格一样。
  • 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。

  • 注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。
  • Java中多维数组必都是规则矩阵形式

4. Arrays工具类的使用


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


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



6.代码


/*
 * 一、数组的概述
 * 1.数组的理解:数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,
 * 并通过编号的方式对这些数据进行统一管理。
 * 
 * 2.数组相关的概念:
 * >数组名
 * >元素
 * >角标、下标、索引
 * >数组的长度:元素的个数
 * 
 * 3.数组的特点:
 * 1)数组是有序排列的
 * 2)数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型
 * 3)创建数组对象会在内存中开辟一整块连续的空间
 * 4)数组的长度一旦确定,就不能修改。
 * 
 * 4. 数组的分类:
 *   ① 按照维数:一维数组、二维数组、。。。
 *   ② 按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组
 * 
 * 5. 一维数组的使用
 *   ① 一维数组的声明和初始化
 *   ② 如何调用数组的指定位置的元素
 *   ③ 如何获取数组的长度
 *   ④ 如何遍历数组
 *   ⑤ 数组元素的默认初始化值 :见ArrayTest1.java
 *   ⑥ 数组的内存解析 :见ArrayTest1.java
*/
public class ArrayTest {
	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[5];
		// int[] arr3 = new int[3]{1,2,3};

		// 也是正确的写法:
		int[] arr4 = { 1, 2, 3, 4, 5 };// 类型推断

		// 总结:数组一旦初始化完成,其长度就确定了。

		// 2.如何调用数组的指定位置的元素:通过角标的方式调用。
		// 数组的角标(或索引)从0开始的,到数组的长度-1结束。
		names[0] = "王铭";
		names[1] = "王赫";
		names[2] = "张学良";
		names[3] = "孙居龙";
		names[4] = "王宏志";// charAt(0)
		// names[5] = "周扬";

		// 3.如何获取数组的长度。
		// 属性:length

		System.out.println(names.length);// 5
		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 < names.length; i++) {
			System.out.println(names[i]);
		}
	}
}
/*
 * ⑤ 数组元素的默认初始化值
 * 		> 数组元素是整型:0
 * 		> 数组元素是浮点型:0.0
 * 		> 数组元素是char型:0或'\u0000',而非'0'
 * 		> 数组元素是boolean型:false
 * 
 * 		> 数组元素是引用数据类型:null
 *  
 *  ⑥ 数组的内存解析
 */
public class ArrayTest1 {

	public static void main(String[] args) {
		// 5.数组元素的默认初始化值
		int[] arr = new int[4];
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("**********");

		short[] arr1 = new short[4];
		for (int i = 0; i < arr1.length; i++) {
			System.out.println(arr1[i]);
		}
		System.out.println("**********");
		float[] arr2 = new float[5];
		for (int i = 0; i < arr2.length; i++) {
			System.out.println(arr2[i]);
		}

		System.out.println("**********");
		char[] arr3 = new char[4];
		for (int i = 0; i < arr3.length; i++) {
			System.out.println("----" + arr3[i] + "****");
		}

		if (arr3[0] == 0) {
			System.out.println("你好!");
		}

		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("北京天气不错!");
		}
	}
}
/*
 * 二维数组的使用
 * 
 * 1.理解:
 * 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。
 * 其实,从数组底层的运行机制来看,其实没有多维数组。
 * 
 * 2. 二维数组的使用:
 *   ① 二维数组的声明和初始化
 *   ② 如何调用数组的指定位置的元素
 *   ③ 如何获取数组的长度
 *   ④ 如何遍历数组
 *   ⑤ 数组元素的默认初始化值 :见 ArrayTest3.java
 *   ⑥ 数组的内存解析 :见 ArrayTest3.java
 * 
 * 
 */
public class ArrayTest2 {
	public static void main(String[] args) {
		// 1.二维数组的声明和初始化
		int[] arr = new int[] { 1, 2, 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][];
		// 错误的情况
		// String[][] arr4 = new String[][4];
		// String[4][3] arr5 = new String[][];
		// int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};

		// 也是正确的写法:
		int[] arr4[] = new int[][] { { 1, 2, 3 }, { 4, 5, 9, 10 }, { 6, 7, 8 } };
		int[] arr5[] = { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8 } };

		// 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]);

		// 3.获取数组的长度
		System.out.println(arr4.length);// 3
		System.out.println(arr4[0].length);// 3
		System.out.println(arr4[1].length);// 4

		// 4.如何遍历二维数组
		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();
		}

	}
}
/*
 * 二维数组的使用:
 * 	规定:二维数组分为外层数组的元素,内层数组的元素
 * 		int[][] arr = new int[4][3];
 * 		外层元素:arr[0],arr[1]等
 * 		内层元素:arr[0][0],arr[1][2]等
 * 
 *   ⑤ 数组元素的默认初始化值 
 *   针对于初始化方式一:比如:int[][] arr = new int[4][3];
 *      外层元素的初始化值为:地址值
 *      内层元素的初始化值为:与一维数组初始化情况相同
 *      
 *   针对于初始化方式二:比如:int[][] arr = new int[4][];
 *   	外层元素的初始化值为:null
 *      内层元素的初始化值为:不能调用,否则报错。
 *   
 *   ⑥ 数组的内存解析 
 * 
 */
public class ArrayTest3 {
	public static void main(String[] args) {

		int[][] arr = new int[4][3];
		System.out.println(arr[0]);// [I@15db9742
		System.out.println(arr[0][0]);// 0

		// System.out.println(arr);//[[I@6d06d69c

		System.out.println("*****************");
		float[][] arr1 = new float[4][3];
		System.out.println(arr1[0]);// 地址值
		System.out.println(arr1[0][0]);// 0.0

		System.out.println("*****************");

		String[][] arr2 = new String[4][2];
		System.out.println(arr2[1]);// 地址值
		System.out.println(arr2[1][1]);// null

		System.out.println("*****************");
		double[][] arr3 = new double[4][];
		System.out.println(arr3[1]);// null
		// System.out.println(arr3[1][0]);//报错

	}
}
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);// 18...
	}

}
import java.util.Scanner;

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

 * 
 */
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];
			}
		}
		// for(int i = 0;i < scores.length;i++){
		// 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("student " + i + " score is " + scores[i] + ",grade is " + level);
		}

	}
}
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):输出数组信息。
		System.out.println(Arrays.toString(arr1));

		// 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 = new int[] { -98, -34, 2, 34, 54, 66, 79, 105, 210, 333 };
		int index = Arrays.binarySearch(arr3, 210);
		if (index >= 0) {
			System.out.println(index);
		} else {
			System.out.println("未找到");
		}

	}
}
/*
 * 算法的考查:求数值型数组中元素的最大值、最小值、平均数、总和等
 * 
 * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
 * 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。	
 * 要求:所有随机数都是两位数。
 * 
 * [10,99]
 * 公式:(int)(Math.random() * (99 - 10 + 1) + 10)
 * 
 */
public class ArrayTest1 {
	public static void main(String[] args) {
		int[] arr = new int[10];

		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * (99 - 10 + 1) + 10);
		}

		// 遍历
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "\t");
		}
		System.out.println();

		// 求数组元素的最大值
		int maxValue = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (maxValue < arr[i]) {
				maxValue = arr[i];
			}
		}
		System.out.println("最大值为:" + maxValue);

		// 求数组元素的最小值
		int minValue = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (minValue > arr[i]) {
				minValue = arr[i];
			}
		}
		System.out.println("最小值为:" + minValue);
		// 求数组元素的总和
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {
			sum += arr[i];
		}
		System.out.println("总和为:" + sum);
		// 求数组元素的平均数
		int avgValue = sum / arr.length;
		System.out.println("平均数为:" + avgValue);
	}
}
/*
 * 算法的考查:数组的复制、反转、查找(线性查找、二分法查找)
 * 
 * 
 */
public class ArrayTest2 {

	public static void main(String[] args) {

		String[] arr = new String[] { "JJ", "DD", "MM", "BB", "GG", "AA" };

		// 数组的复制(区别于数组变量的赋值:arr1 = arr)
		String[] arr1 = new String[arr.length];
		for (int i = 0; i < arr1.length; i++) {
			arr1[i] = arr[i];
		}

		// 数组的反转
		// 方法一:
		// for(int i = 0;i < arr.length / 2;i++){
		// String temp = arr[i];
		// arr[i] = arr[arr.length - i -1];
		// arr[arr.length - i -1] = temp;
		// }

		// 方法二:
		// for(int i = 0,j = arr.length - 1;i < j;i++,j--){
		// String temp = arr[i];
		// arr[i] = arr[j];
		// arr[j] = temp;
		// }

		// 遍历
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "\t");
		}

		System.out.println();
		// 查找(或搜索)
		// 线性查找:
		String dest = "BB";
		dest = "CC";

		boolean isFlag = true;

		for (int i = 0; i < arr.length; i++) {

			if (dest.equals(arr[i])) {
				System.out.println("找到了指定的元素,位置为:" + i);
				isFlag = false;
				break;
			}

		}
		if (isFlag) {
			System.out.println("很遗憾,没有找到的啦!");

		}
		// 二分法查找:(熟悉)
		// 前提:所要查找的数组必须有序。
		int[] arr2 = new int[] { -98, -34, 2, 34, 54, 66, 79, 105, 210, 333 };

		int dest1 = -34;
		dest1 = 35;
		int head = 0;// 初始的首索引
		int end = arr2.length - 1;// 初始的末索引
		boolean isFlag1 = true;
		while (head <= end) {

			int middle = (head + end) / 2;

			if (dest1 == arr2[middle]) {
				System.out.println("找到了指定的元素,位置为:" + middle);
				isFlag1 = false;
				break;
			} else if (arr2[middle] > dest1) {
				end = middle - 1;
			} else {// arr2[middle] < dest1
				head = middle + 1;
			}

		}

		if (isFlag1) {
			System.out.println("很遗憾,没有找到的啦!");
		}

	}
}
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("总和为:" + sum);
	}

}
*
 * 使用简单数组
(1)创建一个名为ArrayExer2的类,在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是什么关系?array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。
 * 拓展:修改题目,实现array2对array1数组的复制
 */
public class ArrayExer2 {
	public static void main(String[] args) { // alt + /
		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");
		}

		// 赋值array2变量等于array1
		// 不能称作数组的复制。
		array2 = array1;

		// 修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
		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");
		}
	}
}
/*
 * 使用简单数组
 * 拓展:修改题目,实现array2对array1数组的复制
 */
public class ArrayExer3 {
	public static void main(String[] args) { // alt + /
		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");
		}

		// 数组的复制:
		array2 = new int[array1.length];
		for (int i = 0; i < array2.length; i++) {
			array2[i] = array1[i];
		}

		// 修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
		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 BubbleSortTest {
	public static void main(String[] args) {

		int[] arr = new int[] { 43, 32, 76, -98, 0, 64, 33, -21, 32, 99 };

		// 冒泡排序
		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.print(arr[i] + "\t");
		}

	}
}
/**
 * 快速排序 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小, 则分别对这两部分继续进行排序,直到整个序列有序。
 * 
 * @author shkstart 2018-12-17
 */
public class QuickSort {
	private 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, -16, 30, 23, -30, -49, 25, 21, 30 };
		System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
		quickSort(data);
		System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
	}
}
/*
 * 使用二维数组打印一个 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 < 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] + "  ");
			}
			System.out.println();
		}

	}

}
/*
 * 数组中的常见异常:
 * 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
 * 
 * 2. 空指针异常:NullPointerException
 * 
 */
public class ArrayExceptionTest {
	public static void main(String[] args) {

		// 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
		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]);

		// System.out.println("hello");

		// 2.2. 空指针异常:NullPointerException
		// 情况一:
		// int[] arr1 = new int[]{1,2,3};
		// arr1 = null;
		// System.out.println(arr1[0]);

		// 情况二:
		// int[][] arr2 = new int[4][];
		// System.out.println(arr2[0][0]);

		// 情况三:
		String[] arr3 = new String[] { "AA", "BB", "CC" };
		arr3[0] = null;
		System.out.println(arr3[0].toString());
	}
}

结语


本人会持续更新文章的哦!希望大家一键三连,你们的鼓励就是作者不断更新的动力

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spark是一个快速通用的集群计算框架,它可以处理大规模数据,并且具有高效的内存计算能力。Spark可以用于各种计算任务,包括批处理、流处理、机器学习等。本文将你了解Spark计算框架的基本概念和使用方法。 一、Spark基础概念 1. RDD RDD(Resilient Distributed Datasets)是Spark的基本数据结构,它是一个分布式的、可容错的、不可变的数据集合。RDD可以从Hadoop、本地文件系统等数据源中读取数据,并且可以通过多个转换操作(如map、filter、reduce等)进行处理。RDD也可以被持久化到内存中,以便下次使用。 2. Spark应用程序 Spark应用程序是由一个驱动程序和多个执行程序组成的分布式计算应用程序。驱动程序是应用程序的主要入口点,它通常位于用户的本地计算机上,驱动程序负责将应用程序分发到执行程序上并收集结果。执行程序是运行在集群节点上的计算单元,它们负责执行驱动程序分配给它们的任务。 3. Spark集群管理器 Spark集群管理器负责管理Spark应用程序在集群中的运行。Spark支持多种集群管理器,包括Standalone、YARN、Mesos等。 二、Spark计算框架使用方法 1. 安装Spark 首先需要安装Spark,可以从Spark官网下载并解压缩Spark安装包。 2. 编写Spark应用程序 编写Spark应用程序通常需要使用Java、Scala或Python编程语言。以下是一个简单的Java代码示例,用于统计文本文件中单词的出现次数: ```java import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import java.util.Arrays; import java.util.Map; public class WordCount { public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("WordCount").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> lines = sc.textFile("input.txt"); JavaRDD<String> words = lines.flatMap(line -> Arrays.asList(line.split(" ")).iterator()); Map<String, Long> wordCounts = words.countByValue(); for (Map.Entry<String, Long> entry : wordCounts.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } sc.stop(); } } ``` 3. 运行Spark应用程序 将编写好的Spark应用程序打包成jar包,并通过以下命令运行: ```bash spark-submit --class WordCount /path/to/wordcount.jar input.txt ``` 其中,--class参数指定应用程序的主类,后面跟上打包好的jar包路径,input.txt是输入文件的路径。 4. 查看运行结果 Spark应用程序运行完毕后,可以查看应用程序的输出结果,例如上述示例中的单词出现次数。 以上就是Spark计算框架的基本概念和使用方法。通过学习Spark,我们可以更好地处理大规模数据,并且提高计算效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麟-小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值