目录
1.5 数组的工具类Arrays
3. 数组使用的常见问题
4.3 Debug的按键及功能
1. 数组
1.1 静态初始化数组
定义数组的时候直接给数组赋值
1. 静态初始化数组的格式
数据类型[ ] 数组名 = { 元素1,元素2,元素3... };
int[ ] a = {1,2,3,4,5};
数据类型[ ] 数组名 = new 数据类型[ ] { 元素1,元素2,元素3... };
int[ ] a = new int[ ]{1,2,3,4,5};
2. 数组是属于什么类型,数组变量名中存储的是什么?
引用数据类型,存储的数组在内存中的地址信息
1.2 动态初始化数组
定义数组的时候 只确定元素的类型和数组的长度,之后再存入具体数据
1. 数组的动态初始化格式
数据类型[ ] 数组名 = new 数据类型[ 长度 ];
int[ ] a = new int[5];
2. 两种数组定义时的特点和场景有什么区别
当前已经知道存入的元素值,用静态初始化
当前还不清楚要存入哪些数据,用动态初始化
3. 动态初始化数组元素的默认值是什么样的
byte、short、int 、char、long类型数组元素的默认值都是 0
float、double类型数组元素的默认值都是 0.0
boolean类型数组元素的默认值是 false 、String类型数组元素的默认值是 null
1. 3 数组的创建过程
1. 在内存中开辟连续的空间,用来存放数据
2. 给数组完成初始化过程,给每个元素赋予默认值
3. 数组完成初始化会分配一个唯一的地址值
4. 把唯一的地址值交给引用类型的变量a去保存
5. 如果想要操作数组中的元素,可以根据变量保存的地址找到数组,然后根据下标来操作数组的具体元素
数组名保存的是数组的地址值,不是数组中每一个具体的元素,数组名是一个引用类型的变量
1.4 数组的特性
- 数组的长度通过**数组名.length;**来获取
- 数组一旦创建,长度无法改变
- 数组的下标从0开始,最大下标为数组长度-1
- 如果访问到了不存在的下标,会数组下标越界异常
1.5 数组的工具类Arrays
1. toString(数组名),除了char类型以外,其他类型的数组想要查看数组的具体元素,都得使用这 个方法,如果不用,打印是数组的地址值
2. sort(数组名),给数组进行排序
3. copyOf(要复制的数组,新数组的长度)
如果新的长度大于原数组的长度–数组的扩容
如果新的长度小于原数组的长度–数组的缩容
如果新的长度等于原数组的长度–普通的复制
注意:不管是什么长度,都不是修改原数组,而是创建新数组
2. 数组的遍历
1. 如果只是想查看数组中有哪些元素,直接使用System.out.println(Arrays.toString(数组名));就可以
2. 如果想要拿到数组中的一个个的具体元素,或者是对数组中的元素做进一步的操作,就需要对数组进行遍历
3. 遍历:把数组中的所有元素,从头到尾逐个“过一遍”
4. 通过循环遍历数组,所以循环中的循环变量代表的是数组的下标
package com.example.basic;
/*本类用于复习数组的操作*/
public class TestArray {
public static void main(String[] args) {
//需求1:求出数组中所有元素之和
//f1();
//需求2:求出数组中所有元素的最大值
f2();
}
private static void f2() {
//需求2:求出数组中所有元素的最大值
//1.定义一个数组
int[] a = {10,20,98,40,55};
//2.定义一个变量,用来存储结果,也就是数组中所有元素的最大值
int max = a[0];//这个位置不能写0,应该是数组中的第一个元素
//3.遍历数组,依次拿出数组中的每一个元素与之前设定的元素做比较
for (int i = 0; i < a.length; i++) {
//4.判断当前遍历到的元素,与max谁大
if(a[i]>max){//如果当前遍历到的元素比max大
max = a[i];//就把遍历到的这个元素的值赋值给max
}
}
//5.循环结束,输出数组中最大的值
System.out.println("数组中的最大值为:"+max);
}
private static void f1() {
//需求1:求出数组中所有元素之和
//1.定义一个数组
int[] a = {12,12,22,22,22};
//2.定义一个变量,用来保存最终求和的结果
int sum = 0;
//3.通过数组的遍历,遍历数组中的每一个元素,然后累加
for (int i = 0; i < a.length; i++) {
sum = sum + a[i];
}
System.out.println("数组累加所有元素之和为:"+sum);
}
}
3. 数组使用的常见问题
1. 如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)
int [ ] arr = new int [ ] {11,22,33};
System.out.println(arr[2]);
2. 如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException(空指针异常)
arr = null;
System.out.println(arr); //null
// System.out.println(arr.length); //出现异常
4. Debug工具的使用
4.1 Debug概念
Debug是一种程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。
4.2 Debug的操作流程
Debug调试,又被称为断点调试,断点是一个标记,告诉我们从哪里开始查看。操作流程具体分为以下几个步骤:
1. 如何加断点
2. 如何运行加了断点的程序
3. 看哪里
4. 点哪里
5. 如何删除断点
与增加断点相同。
4.3 Debug的按键及功能
Show Execution Point(显示执行点):如果你的光标在其它行或其它页面,点击这个按钮可跳转到当前代码执行的行
Step Over(步过) :一行一行地往下走,如果这一行上有方法 不会进入方法 。
Step Into(步入):如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内, 不会进入官方类库的方法
Force Step Into (强制步入):能进入任何方法,查看底层源码的时候可以用这个 进入官方类库的方法 。
Step Out (步出):从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值。
(将执行点移回方法调用,从堆栈中删除当前方法帧)
Drop Frame(退回断点):从当前位置退回到之前断点处。有时候当我们步入方法体之后,还想回退到方法体外,点这个按钮后,断点重新回到方法体之外。在继续还是可以再次进到方法内。
Run to Cursor (运行到光标处):你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。
Evaluate Expression计算表达式:使用这个操作在调试过程中计算某个表达式的值,而不用再去打印信息。
重启
Stop:关闭程序。
修改运行配置
Resume Program:恢复程序,比如,你在第20行和25行有两个断点,当前运行至第20行,使用这个操作运行到下一个断点(即第25行),如果下面没有断点了,再使用这个操作,则运行完整个流程。
Pause Program:暂停程序,启用Debug。
View Breakpoints:查看所有断点。
Mute Breakpoints:隐藏断点,选择这个后,所有断点变为灰色,断点失效。再次点击,断点变为红色,有效。