跳到主要内容Java 入门:IDEA 高效调试与数组 | 极客日志Javajava算法
Java 入门:IDEA 高效调试与数组
讲解 Java 程序调试与数组基础。内容包括 IDEA 调试器使用(打断点、控制执行、条件断点)、数组定义与初始化(动态/静态)、遍历方式、引用类型特性、方法传参、Arrays 工具类用法及经典算法(排序、查找、逆序)。旨在提升排错效率与数据结构掌握度。
暖阳10K 浏览 一、先搞懂:什么是程序调试?
调试(Debugging)不是简单'改代码',而是定位问题 → 缩小范围 → 修复验证的完整过程。
- 小代码:肉眼读 + 打印日志
- 复杂项目:必须用 IDE 调试器
IDEA 内置的调试器是 Java 开发效率神器,掌握它能让你快速揪出隐藏 Bug。
二、IDEA 调试
1. 调试三步基础
- 打断点:代码行号左侧单击,出现红色圆点
- 启动调试:右键 → Debug
- 控制执行:用快捷键一步步观察变量与流程
2. 核心调试操作
| 操作 | 快捷键 | 作用 |
|---|
| 逐过程(不进方法) | F8 | 一行一行走,跳过方法内部 |
| 逐语句(进入方法) | F7 | 进入自定义方法内部 |
| 强制进入 | Alt+Shift+F7 | 强行进入 JDK 库方法 / 无源码方法 |
| 跳出方法 | Shift+F8 | 执行完当前方法并返回调用处 |
| 运行到光标 | Alt+F9 | 直接跳到光标所在行 |
| 恢复程序 | F9 | 跳到下一个断点 / 结束 |
| 重新调试 | Ctrl+F5 | 重启调试会话 |
| 停止调试 | Ctrl+F2 | 终止调试 |
| 查看所有断点 | Ctrl+Shift+F8 | 统一管理断点 |
3. 进阶:条件断点
循环几百次只想在特定值停下?用条件断点:
- 右键断点
- 填入条件(如
i == 20)
- 调试只会在条件成立时暂停
4. 调试面板看什么?
- Debugger 面板:调用栈 + 实时变量值 + 表达式计算
- Console 面板:程序正常输出 / 异常信息
- Mute Breakpoints:一键临时屏蔽所有断点
三、Java 数组
数组是 Java 最基础的数据结构,相同类型、连续内存、下标从 0 开始,这三个特征刻在心里。
1. 为什么要用数组?
不用数组:存 100 个成绩要定义 100 个变量。用数组:一行搞定,遍历、修改、传参都更简洁。
2. 数组创建与初始化(两种方式)
动态初始化(指定长度)
int[] arr = new int[5];
String[] strs = [];
new
String
3
静态初始化(指定内容)
int[] arr1 = new int[]{1,2,3,4,5};
int[] arr2 = {1,2,3,4,5};
- 简写形式不能拆分两行写
- 下标范围:
[0, length),越界抛 ArrayIndexOutOfBoundsException
3. 数组遍历:3 种写法
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
for (int num : arr) {
System.out.println(num);
}
System.out.println(Arrays.toString(arr));
4. 关键:数组是引用类型
- 基本类型:变量存值
- 引用类型:变量存堆内存地址
arr1 = arr2 是指向同一块内存,不是拷贝
int[] a = {1,2,3};
int[] b = a;
b[0] = 100;
null:空引用,访问会抛 NullPointerException
5. 数组作为方法参数 / 返回值
- 传基本类型:值传递,不影响原变量
- 传数组:引用传递,方法内修改会影响原数组
- 数组可直接作为返回值,返回一组数据
6. 数组常用工具方法(java.util.Arrays)
Arrays.toString(arr):数组转字符串
Arrays.copyOf(arr, len):数组拷贝(新对象)
Arrays.copyOfRange(arr, from, to):范围拷贝
Arrays.sort(arr):高效排序
Arrays.binarySearch(arr, key):有序数组二分查找
import java.util.Arrays;
public class ArraysBinarySearchDemo {
public static void main(String[] args) {
int[] sortedArr = {1, 2, 3, 5, 7, 9, 10};
System.out.println("有序数组:" + Arrays.toString(sortedArr));
int key1 = 7;
int index1 = Arrays.binarySearch(sortedArr, key1);
System.out.println("查找" + key1 + ":下标=" + index1);
int key2 = 4;
int index2 = Arrays.binarySearch(sortedArr, key2);
System.out.println("查找" + key2 + ":返回值=" + index2 + "(插入点是 3,-(3)-1=-4)");
int key3 = 11;
int index3 = Arrays.binarySearch(sortedArr, key3);
System.out.println("查找" + key3 + ":返回值=" + index3 + "(插入点是 7,-(7)-1=-8)");
int[] unsortedArr = {5, 2, 9};
int index4 = Arrays.binarySearch(unsortedArr, 2);
System.out.println("\n未排序数组查找 2:" + index4 + "(结果错误,不可信)");
}
}
import java.util.Arrays;
public class ArraysSortDemo {
public static void main(String[] args) {
int[] intArr = {5, 2, 9, 1, 5, 6};
System.out.println("排序前 int 数组:" + Arrays.toString(intArr));
Arrays.sort(intArr);
System.out.println("排序后 int 数组:" + Arrays.toString(intArr));
String[] strArr = {"Java", "Python", "C", "JavaScript"};
System.out.println("\n排序前字符串数组:" + Arrays.toString(strArr));
Arrays.sort(strArr);
System.out.println("排序后字符串数组:" + Arrays.toString(strArr));
int[] rangeArr = {10, 5, 8, 2, 7, 1};
System.out.println("\n排序前范围数组:" + Arrays.toString(rangeArr));
Arrays.sort(rangeArr, 1, 5);
System.out.println("排序 [1,5) 后:" + Arrays.toString(rangeArr));
}
}
import java.util.Arrays;
public class ArraysCopyOfRangeDemo {
public static void main(String[] args) {
String[] originalArr = {"A", "B", "C", "D", "E", "F"};
System.out.println("原数组:" + Arrays.toString(originalArr));
String[] range1 = Arrays.copyOfRange(originalArr, 1, 4);
System.out.println("拷贝 [1,4):" + Arrays.toString(range1));
String[] range2 = Arrays.copyOfRange(originalArr, 0, originalArr.length);
System.out.println("拷贝完整数组:" + Arrays.toString(range2));
String[] range3 = Arrays.copyOfRange(originalArr, 3, 8);
System.out.println("拷贝 [3,8)(补 null):" + Arrays.toString(range3));
}
}
import java.util.Arrays;
public class ArraysCopyOfDemo {
public static void main(String[] args) {
int[] originalArr = {10, 20, 30, 40, 50};
System.out.println("原数组:" + Arrays.toString(originalArr));
int[] copyFull = Arrays.copyOf(originalArr, originalArr.length);
System.out.println("完整拷贝:" + Arrays.toString(copyFull));
int[] copyShort = Arrays.copyOf(originalArr, 3);
System.out.println("截取前 3 个元素:" + Arrays.toString(copyShort));
int[] copyLong = Arrays.copyOf(originalArr, 7);
System.out.println("补 0 到 7 个元素:" + Arrays.toString(copyLong));
copyFull[0] = 999;
System.out.println("修改后新数组:" + Arrays.toString(copyFull));
System.out.println("原数组仍不变:" + Arrays.toString(originalArr));
}
}
import java.util.Arrays;
public class ArraysToStringDemo {
public static void main(String[] args) {
int[] intArr = {1, 2, 3, 4, 5};
System.out.println("int 数组转字符串:" + Arrays.toString(intArr));
String[] strArr = {"Java", "数组", "工具类"};
System.out.println("字符串数组转字符串:" + Arrays.toString(strArr));
int[] emptyArr = new int[0];
System.out.println("空数组转字符串:" + Arrays.toString(emptyArr));
int[][] multiArr = {{1,2}, {3,4}};
System.out.println("多维数组用 toString:" + Arrays.toString(multiArr));
System.out.println("多维数组用 deepToString:" + Arrays.deepToString(multiArr));
}
}
7. 经典算法手写(面试常考)
- 顺序查找
- 二分查找(有序数组)
- 数组逆序
- 自定义数组拷贝
public class CustomArrayCopy {
public static void main(String[] args) {
int[] originalArr = {8, 3, 9, 7, 2, 5, 1, 6, 4};
System.out.println("原数组:" + Arrays.toString(originalArr));
int[] copyArr = customCopyOf(originalArr, originalArr.length);
System.out.println("拷贝数组:" + Arrays.toString(copyArr));
copyArr[0] = 100;
System.out.println("修改后拷贝数组:" + Arrays.toString(copyArr));
System.out.println("修改后原数组:" + Arrays.toString(originalArr));
}
public static int[] customCopyOf(int[] original, int newLength) {
if (original == null) {
return null;
}
int[] newArr = new int[newLength];
int copyLength = Math.min(original.length, newLength);
for (int i = 0; i < copyLength; i++) {
newArr[i] = original[i];
}
return newArr;
}
}
public class ReverseArray {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println("逆序前:" + Arrays.toString(arr));
reverseArray(arr);
System.out.println("逆序后:" + Arrays.toString(arr));
}
public static void reverseArray(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
int left = 0;
int right = arr.length - 1;
while (left < right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {8, 3, 9, 7, 2, 5, 1, 6, 4};
System.out.println("排序前:" + Arrays.toString(arr));
bubbleSort(arr);
System.out.println("排序后:" + Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
int length = arr.length;
for (int i = 0; i < length - 1; i++) {
boolean swapped = false;
for (int j = 0; j < length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
}
public class BinarySearch {
public static void main(String[] args) {
int[] sortedArr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int target = 5;
int index = binarySearch(sortedArr, target);
if (index != -1) {
System.out.println("找到目标值 " + target + ",下标为:" + index);
} else {
System.out.println("未找到目标值 " + target);
}
}
public static int binarySearch(int[] sortedArr, int target) {
if (sortedArr == null || sortedArr.length == 0) {
return -1;
}
int left = 0;
int right = sortedArr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (sortedArr[mid] == target) {
return mid;
} else if (sortedArr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
}
public class SequentialSearch {
public static void main(String[] args) {
int[] arr = {8, 3, 9, 7, 2, 5, 1, 6, 4};
int target = 7;
int index = sequentialSearch(arr, target);
if (index != -1) {
System.out.println("找到目标值 " + target + ",下标为:" + index);
} else {
System.out.println("未找到目标值 " + target);
}
}
public static int sequentialSearch(int[] arr, int target) {
if (arr == null || arr.length == 0) {
return -1;
}
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
}
8. 二维数组
int[][] arr = {{1,2},{3,4},{5,6}};
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();
}
四、调试 + 数组:实战组合技巧
- 遍历数组时用条件断点,只看目标元素
- 调试面板直接查看数组每一位的值
- 下标越界时,用调试看循环边界是否正确
- 引用传递问题:在面板看地址是否相同
五、总结
- 调试是程序员的基本功,IDEA 快捷键用熟效率翻倍
- 数组是数据结构基石,连续内存、引用类型、下标 0 起步
- 先会调试排错,再扎实掌握数组,Java 基础才算稳
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online