目录
1.笔记
1.1 数组
1. 数组 容器:存储东西(数据)的 数组概念:数组就是用于存储数据的长度固定的容器,保证多个数据的数据类型要一致 ① 创建数组的时候,必须指定长度 ② 数组在创建的时候,需要指定数据类型 ③ 数组是有顺序的(位置的顺序) 数组的特点: 数组的长度一旦确定,就不允许修改 2. 数组的使用 2.1 数组的定义 ① 动态初始化 ★ 语法: a. 数组的声明 数据类型[] 数组名; //推荐 数据类型 数组名[]; b. 数组空间的开辟 数组名=new 数据类型[数组长度]; 二合一:数据类型[] 数组名=new 数据类型[数组长度]; ② 静态初始化(在创建数组的同时,将数据指定完成) a. 数据类型[] 数组名; 数组名=new 数据类型[]{数据1,数据2,数据3...}; 合二为一: 数据类型[] 数组名=new 数据类型[]{数据1,数据2,数据3...}; 注意事项: 数据的个数就是数组的长度,并且不允许显示的指定长度 b. 数据类型[] 数组名={数据1,数据2,数据3...}; 注意事项: 不允许拆开 ③ 动态和静态的使用场合 在创建数组的时候,不知道数据是什么,就是用动态初始化! 在创建数组的时候,已知数据是什么,就可以采用静态初始化! 2.2 数组值的操作 ① 存值 数组名[角标]=值; 注意: a. 值要匹配数组的数据类型 b. 角标不能超过数组的角标范围 ② 取值 数组名[角标] 2.3 数组的特性 a. 数组是存在默认值的 整型数组:0 浮点型数组:0.0 String数组:null boolean数组:false char数组:空白符 2.4 异常总结(已经接触到的,全面的后面会总结) ① 数组角标越界:(使用了数组范围之外的角标,就会出现此异常) ArrayIndexOutOfBoundsException 出现异常,程序会终止,仔细的查看异常信息,异常类型、异常位置 案例:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at Demo1.main(Demo1.java:12) 异常类型:ArrayIndexOutOfBoundsException 异常位置:Demo1.java:12 ② 空指针 :(有null值打点) NullPointerException 保证每个点前面的变量的值不能是null值! 案例:Exception in thread "main" java.lang.NullPointerException at Demo1.main(Demo1.java:9) 异常类型:NullPointerException 异常位置:Demo1.java:9 3. 数组的遍历 遍历(将数组中所有数据进行展示) 如何获得数组的长度 int length=数组名.length; 数组本身是引用数据类型,所有可以赋值为null 举例:int[] arrs=new int[5]; arrs中存储的数据是int型,是基本数据类型 arrs本身是引用数据类型(引用数据类型都可以赋值为null) 4. 数组的内存 程序运行时需要内存(计算机的运行内存) jvm(java虚拟机,在运行java程序时,会去电脑的运行内存分配空间) ① 虚拟机栈: ② 堆内存: ③ 方法区: 这一部分要多画内存图理解5. 数组的反转 int[] arrs={3,5,7,8,9}; 编写程序,让arrs中的数据进行反转{9,8,7,5,3} 6. 数组的查找 ① 顺序查找(早上找x的日测题) 从头到尾一个一个的找! ② 二分查找 对数组有一个要求:数组必须是有序(大小)的! int num=3; int[] arrs={3,5,7,8,9};//从小-大的顺序 7.数组的排序 int[] arrs={3,15,7,28,9}; 编写程序,让arrs是有序的!(小-大、大-小) ① 冒泡排序(5个数据) 冒第一个泡,写一个循环,让数组中的最大值出现在数组的最后一个位置 冒第二个泡,写一个循环,让数组中的第二大值出现在数组的最倒数第二个位置 ... 两两对比,大值放在后面!5个数数据,冒最大的泡,需要对比多少次?4次 {3,15,7,28,9} {3,7,15,28,9} {3,7,15,28,9} {3,7,15,9,28} ② 简单选择排序 找到数组中的最大值,放在最后一个位置 找到数组中第二大的值,放在倒数第二个位置 {3,15,7,28,9} int max=28; int index=3; 将index和最后一个位置进行交换 {3,15,7,9,28} int max=15; int index=1; 将index和倒数第二个位置进行交换 {3,9,7,15,28}8. 二维数组 数组:本身也是一个数据类型(引用数据类型) 数组中是可以存储数组的,称之为二维数组 8.1 使用 a. 定义 数据类型[][] 数组名; 数据类型 数组名[][]; b. 初始化 ① 动态初始化 (1) 数组名=new 数据类型[n][m]; 二维数组的空间以及小数组的空间都会开辟, 二维数组的空间存储的是小数组的地址, 小数组中存储的是数据类型的默认值 (2)数组名=new 数据类型[n][]; 只开辟二维数组的空间,长度为n 小数组的空间是不开辟的, 二维数组中默认值是null(数组是引用数据类型,默认值就是null) ② 静态初始化 数据类型[][] 数组名=new 数据类型[][]{{n个数据},{n个数据},{n个数据}...}; 数据类型[][] 数组名={{n个数据},{n个数据},{n个数据}...};
2. 练习
2.1 二维数组练习题
练习一:
请使用二维数组存储如下数据,并遍历显示
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
public static void main(String[] args){
//1、声明一个二维数组,并且确定行数
//因为每一行的列数不同,这里无法直接确定列数
int[][] arr = new int[5][];
//2、确定每一行的列数
for(int i=0; i<arr.length; i++){
/*
arr[0] 的列数是1
arr[1] 的列数是2
arr[2] 的列数是3
arr[3] 的列数是4
arr[4] 的列数是5
*/
arr[i] = new int[i+1];
}
//3、确定元素的值
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr[i].length; j++){
arr[i][j] = i+1;
}
}
//4、遍历显示
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr[i].length; j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args){
//1、声明一个二维数组,并且初始化
int[][] arr = {
{1},
{2,2},
{3,3,3},
{4,4,4,4},
{5,5,5,5,5}
};
//2、遍历显示
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr[i].length; j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args){
//1、声明一个二维数组,并且确定行数
//因为每一行的列数不同,这里无法直接确定列数
int[][] arr = new int[5][];
for(int i=0; i<arr.length; i++){
//2、确定每一行的列数
arr[i] = new int[i+1];
//3、确定元素的值
for(int j=0; j<arr[i].length; j++){
arr[i][j] = i+1;
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
练习二:
请使用二维数组存储如下数据,并遍历显示
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
public static void main(String[] args){
int[][] arr = {
{1,1,1,1,1},
{2,2,2,2,2},
{3,3,3,3,3},
{4,4,4,4,4}
};
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr[i].length; j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
public static void main(String[] args) {
//1、声明二维数组,并确定行数和列数
int[][] arr = new int[4][5];
//2、确定元素的值
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr[i][j] = i + 1;
}
}
//3、遍历显示
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr[i].length; j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
练习三:
请使用二维数组存储如下数据,并遍历显示
String[][] employees = {
{"10", "1", "段誉", "22", "3000"},
{"13", "2", "令狐冲", "32", "18000", "15000", "2000"},
{"11", "3", "任我行", "23", "7000"},
{"11", "4", "张三丰", "24", "7300"},
{"12", "5", "周芷若", "28", "10000", "5000"},
{"11", "6", "赵敏", "22", "6800"},
{"12", "7", "张无忌", "29", "10800","5200"},
{"13", "8", "韦小宝", "30", "19800", "15000", "2500"},
{"12", "9", "杨过", "26", "9800", "5500"},
{"11", "10", "小龙女", "21", "6600"},
{"11", "11", "郭靖", "25", "7100"},
{"12", "12", "黄蓉", "27", "9600", "4800"}
};
其中"10"代表普通职员,"11"代表程序员,"12"代表设计师,"13"代表架构师
public static void main(String[] args) {
String[][] employees = {
{"10", "1", "段誉", "22", "3000"},
{"13", "2", "令狐冲", "32", "18000", "15000", "2000"},
{"11", "3", "任我行", "23", "7000"},
{"11", "4", "张三丰", "24", "7300"},
{"12", "5", "周芷若", "28", "10000", "5000"},
{"11", "6", "赵敏", "22", "6800"},
{"12", "7", "张无忌", "29", "10800","5200"},
{"13", "8", "韦小宝", "30", "19800", "15000", "2500"},
{"12", "9", "杨过", "26", "9800", "5500"},
{"11", "10", "小龙女", "21", "6600"},
{"11", "11", "郭靖", "25", "7100"},
{"12", "12", "黄蓉", "27", "9600", "4800"}
};
System.out.println("员工类型\t编号\t姓名\t年龄\t薪资\t奖金\t股票\t");
for (int i = 0; i < employees.length; i++) {
switch(employees[i][0]){
case "10":
System.out.print("普通职员");
break;
case "11":
System.out.print("程序员");
break;
case "12":
System.out.print("设计师");
break;
case "13":
System.out.print("架构师");
break;
}
for (int j = 1; j < employees[i].length; j++) {
System.out.print("\t" + employees[i][j]);
}
System.out.println();
}
}
2.2 二维数组的内存图分析(重要)
示例一:分析下列代码内存图
int[][] arr = {
{1},
{2,2},
{3,3,3},
{4,4,4,4},
{5,5,5,5,5}
};
示例二:分析下列代码内存图
//1、声明二维数组,并确定行数和列数
int[][] arr = new int[4][5];
//2、确定元素的值
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr[i][j] = i + 1;
}
}
示例三: 分析下列代码内存图
//1、声明一个二维数组,并且确定行数
//因为每一行的列数不同,这里无法直接确定列数
int[][] arr = new int[5][];
//2、确定每一行的列数
for(int i=0; i<arr.length; i++){
/*
arr[0] 的列数是1
arr[1] 的列数是2
arr[2] 的列数是3
arr[3] 的列数是4
arr[4] 的列数是5
*/
arr[i] = new int[i+1];
}
//3、确定元素的值
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr[i].length; j++){
arr[i][j] = i+1;
}
}