Java入門指南之IDEA高效調(diào)試與數(shù)組
前言
作為 Java 開發(fā)者,調(diào)試能力決定排錯(cuò)效率,數(shù)組功底決定代碼質(zhì)量。這篇文章把 IDEA 調(diào)試全套技巧、數(shù)組從基礎(chǔ)到進(jìn)階的知識(shí)點(diǎn)一次性講透,適合新手夯實(shí)基礎(chǔ)、老手快速回顧。
一、先搞懂:什么是程序調(diào)試?
調(diào)試(Debugging)不是簡單 “改代碼”,而是定位問題 → 縮小范圍 → 修復(fù)驗(yàn)證的完整過程。
- 小代碼:肉眼讀 + 打印日志
- 復(fù)雜項(xiàng)目:必須用 IDE 調(diào)試器
IDEA 內(nèi)置的調(diào)試器是 Java 開發(fā)效率神器,掌握它能讓你快速揪出隱藏 Bug。
二、IDEA 調(diào)試
1. 調(diào)試三步基礎(chǔ)
- 打斷點(diǎn):代碼行號(hào)左側(cè)單擊,出現(xiàn)紅色圓點(diǎn)
- 啟動(dòng)調(diào)試:右鍵 → Debug
- 控制執(zhí)行:用快捷鍵一步步觀察變量與流程
2. 核心調(diào)試操作
| 操作 | 快捷鍵 | 作用 |
|---|---|---|
| 逐過程(不進(jìn)方法) | F8 | 一行一行走,跳過方法內(nèi)部 |
| 逐語句(進(jìn)入方法) | F7 | 進(jìn)入自定義方法內(nèi)部 |
| 強(qiáng)制進(jìn)入 | Alt+Shift+F7 | 強(qiáng)行進(jìn)入 JDK 庫方法 / 無源碼方法 |
| 跳出方法 | Shift+F8 | 執(zhí)行完當(dāng)前方法并返回調(diào)用處 |
| 運(yùn)行到光標(biāo) | Alt+F9 | 直接跳到光標(biāo)所在行 |
| 恢復(fù)程序 | F9 | 跳到下一個(gè)斷點(diǎn) / 結(jié)束 |
| 重新調(diào)試 | Ctrl+F5 | 重啟調(diào)試會(huì)話 |
| 停止調(diào)試 | Ctrl+F2 | 終止調(diào)試 |
| 查看所有斷點(diǎn) | Ctrl+Shift+F8 | 統(tǒng)一管理斷點(diǎn) |
3. 進(jìn)階:條件斷點(diǎn)
循環(huán)幾百次只想在特定值停下?用條件斷點(diǎn):
- 右鍵斷點(diǎn)
- 填入條件(如
i == 20) - 調(diào)試只會(huì)在條件成立時(shí)暫停
4. 調(diào)試面板看什么?
- Debugger 面板:調(diào)用棧 + 實(shí)時(shí)變量值 + 表達(dá)式計(jì)算
- Console 面板:程序正常輸出 / 異常信息
- Mute Breakpoints:一鍵臨時(shí)屏蔽所有斷點(diǎn)
三、Java 數(shù)組
數(shù)組是 Java 最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),相同類型、連續(xù)內(nèi)存、下標(biāo)從 0 開始,這三個(gè)特征刻在心里。
1. 為什么要用數(shù)組?
不用數(shù)組:存 100 個(gè)成績要定義 100 個(gè)變量。用數(shù)組:一行搞定,遍歷、修改、傳參都更簡潔。
2. 數(shù)組創(chuàng)建與初始化(兩種方式)
動(dòng)態(tài)初始化(指定長度)
int[] arr = new int[5]; // 默認(rèn)值:0 String[] strs = new String[3]; // 默認(rèn)值:null
靜態(tài)初始化(指定內(nèi)容)
// 完整寫法
int[] arr1 = new int[]{1,2,3,4,5};
// 簡寫(推薦)
int[] arr2 = {1,2,3,4,5};
?? 注意:
- 簡寫形式不能拆分兩行寫
- 下標(biāo)范圍:
[0, length),越界拋ArrayIndexOutOfBoundsException
3. 數(shù)組遍歷:3 種寫法
- 普通 for 循環(huán)(可修改元素)
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
- for-each 循環(huán)(只讀更簡潔)
for (int num : arr) {
System.out.println(num);
}
- Arrays.toString(快速打?。?/li>
System.out.println(Arrays.toString(arr));
4. 關(guān)鍵:數(shù)組是引用類型
- 基本類型:變量存值
- 引用類型:變量存堆內(nèi)存地址
arr1 = arr2是指向同一塊內(nèi)存,不是拷貝
int[] a = {1,2,3};
int[] b = a;
b[0] = 100; // a[0] 也會(huì)變成 100
null:空引用,訪問會(huì)拋NullPointerException
5. 數(shù)組作為方法參數(shù) / 返回值
- 傳基本類型:值傳遞,不影響原變量
- 傳數(shù)組:引用傳遞,方法內(nèi)修改會(huì)影響原數(shù)組
- 數(shù)組可直接作為返回值,返回一組數(shù)據(jù)
6. 數(shù)組常用工具方法(java.util.Arrays)
Arrays.toString(arr):數(shù)組轉(zhuǎn)字符串
import java.util.Arrays;
/**
* Arrays.toString():數(shù)組轉(zhuǎn)字符串
* 特點(diǎn):
* 1. 一維數(shù)組直接輸出易讀格式
* 2. 多維數(shù)組需用 Arrays.deepToString()
* 3. 空數(shù)組輸出 []
*/
public class ArraysToStringDemo {
public static void main(String[] args) {
// 測試1:普通int數(shù)組
int[] intArr = {1, 2, 3, 4, 5};
System.out.println("int數(shù)組轉(zhuǎn)字符串:" + Arrays.toString(intArr));
// 測試2:字符串?dāng)?shù)組
String[] strArr = {"Java", "數(shù)組", "工具類"};
System.out.println("字符串?dāng)?shù)組轉(zhuǎn)字符串:" + Arrays.toString(strArr));
// 測試3:空數(shù)組
int[] emptyArr = new int[0];
System.out.println("空數(shù)組轉(zhuǎn)字符串:" + Arrays.toString(emptyArr));
// 測試4:多維數(shù)組(注意:一維toString不適用,需用deepToString)
int[][] multiArr = {{1,2}, {3,4}};
System.out.println("多維數(shù)組用toString:" + Arrays.toString(multiArr)); // 輸出地址
System.out.println("多維數(shù)組用deepToString:" + Arrays.deepToString(multiArr)); // 正確輸出
}
}
/*結(jié)果:
int數(shù)組轉(zhuǎn)字符串:[1, 2, 3, 4, 5]
字符串?dāng)?shù)組轉(zhuǎn)字符串:[Java, 數(shù)組, 工具類]
空數(shù)組轉(zhuǎn)字符串:[]
多維數(shù)組用toString:[[I@7852e922, [I@4e25154f]
多維數(shù)組用deepToString:[[1, 2], [3, 4]]
*/Arrays.copyOf(arr, len):數(shù)組拷貝(新對(duì)象)
import java.util.Arrays;
/**
* Arrays.copyOf():數(shù)組拷貝
* 特點(diǎn):
* 1. 返回新數(shù)組,原數(shù)組不受影響(深拷貝)
* 2. len < 原長度:截取前l(fā)en個(gè)元素
* 3. len > 原長度:補(bǔ)默認(rèn)值(int補(bǔ)0,String補(bǔ)null)
*/
public class ArraysCopyOfDemo {
public static void main(String[] args) {
int[] originalArr = {10, 20, 30, 40, 50};
System.out.println("原數(shù)組:" + Arrays.toString(originalArr));
// 場景1:拷貝長度 = 原長度(完整拷貝)
int[] copyFull = Arrays.copyOf(originalArr, originalArr.length);
System.out.println("完整拷貝:" + Arrays.toString(copyFull));
// 場景2:拷貝長度 < 原長度(截?。?
int[] copyShort = Arrays.copyOf(originalArr, 3);
System.out.println("截取前3個(gè)元素:" + Arrays.toString(copyShort));
// 場景3:拷貝長度 > 原長度(補(bǔ)默認(rèn)值)
int[] copyLong = Arrays.copyOf(originalArr, 7);
System.out.println("補(bǔ)0到7個(gè)元素:" + Arrays.toString(copyLong));
// 驗(yàn)證:修改新數(shù)組,原數(shù)組不變
copyFull[0] = 999;
System.out.println("修改后新數(shù)組:" + Arrays.toString(copyFull));
System.out.println("原數(shù)組仍不變:" + Arrays.toString(originalArr));
}
}
/*結(jié)果:
原數(shù)組:[10, 20, 30, 40, 50]
完整拷貝:[10, 20, 30, 40, 50]
截取前3個(gè)元素:[10, 20, 30]
補(bǔ)0到7個(gè)元素:[10, 20, 30, 40, 50, 0, 0]
修改后新數(shù)組:[999, 20, 30, 40, 50]
原數(shù)組仍不變:[10, 20, 30, 40, 50]
*/Arrays.copyOfRange(arr, from, to):范圍拷貝
import java.util.Arrays;
/**
* Arrays.copyOfRange():范圍拷貝
* 特點(diǎn):
* 1. 左閉右開:[from, to)
* 2. from = 0 且 to = 原長度 → 等價(jià)于 copyOf
* 3. 下標(biāo)越界會(huì)拋 ArrayIndexOutOfBoundsException
*/
public class ArraysCopyOfRangeDemo {
public static void main(String[] args) {
String[] originalArr = {"A", "B", "C", "D", "E", "F"};
System.out.println("原數(shù)組:" + Arrays.toString(originalArr));
// 場景1:拷貝中間范圍(下標(biāo)1到4,包含1,不包含4)
String[] range1 = Arrays.copyOfRange(originalArr, 1, 4);
System.out.println("拷貝[1,4):" + Arrays.toString(range1)); // [B, C, D]
// 場景2:拷貝從0到末尾(完整拷貝)
String[] range2 = Arrays.copyOfRange(originalArr, 0, originalArr.length);
System.out.println("拷貝完整數(shù)組:" + Arrays.toString(range2));
// 場景3:拷貝到超出原長度(補(bǔ)默認(rèn)值null)
String[] range3 = Arrays.copyOfRange(originalArr, 3, 8);
System.out.println("拷貝[3,8)(補(bǔ)null):" + Arrays.toString(range3));
}
}
/*結(jié)果:
原數(shù)組:[A, B, C, D, E, F]
拷貝[1,4):[B, C, D]
拷貝完整數(shù)組:[A, B, C, D, E, F]
拷貝[3,8)(補(bǔ)null):[D, E, F, null, null]
*/Arrays.sort(arr):高效排序
import java.util.Arrays;
/**
* Arrays.sort():數(shù)組排序
* 特點(diǎn):
* 1. 基本類型數(shù)組:快速排序/雙軸快排,效率高
* 2. 直接修改原數(shù)組(原地排序)
* 3. 字符串?dāng)?shù)組:按Unicode編碼升序(字母A-Z對(duì)應(yīng)升序)
*/
public class ArraysSortDemo {
public static void main(String[] args) {
// 場景1:int數(shù)組升序排序
int[] intArr = {5, 2, 9, 1, 5, 6};
System.out.println("排序前int數(shù)組:" + Arrays.toString(intArr));
Arrays.sort(intArr);
System.out.println("排序后int數(shù)組:" + Arrays.toString(intArr));
// 場景2:字符串?dāng)?shù)組排序
String[] strArr = {"Java", "Python", "C", "JavaScript"};
System.out.println("\n排序前字符串?dāng)?shù)組:" + Arrays.toString(strArr));
Arrays.sort(strArr);
System.out.println("排序后字符串?dāng)?shù)組:" + Arrays.toString(strArr));
// 場景3:指定范圍排序(sort(arr, from, to):左閉右開)
int[] rangeArr = {10, 5, 8, 2, 7, 1};
System.out.println("\n排序前范圍數(shù)組:" + Arrays.toString(rangeArr));
Arrays.sort(rangeArr, 1, 5); // 只排序下標(biāo)1到4的元素
System.out.println("排序[1,5)后:" + Arrays.toString(rangeArr));
}
}
/*結(jié)果:
排序前int數(shù)組:[5, 2, 9, 1, 5, 6]
排序后int數(shù)組:[1, 2, 5, 5, 6, 9]
排序前字符串?dāng)?shù)組:[Java, Python, C, JavaScript]
排序后字符串?dāng)?shù)組:[C, Java, JavaScript, Python]
排序前范圍數(shù)組:[10, 5, 8, 2, 7, 1]
排序[1,5)后:[10, 2, 5, 7, 8, 1]
*/Arrays.binarySearch(arr, key):有序數(shù)組二分查找
import java.util.Arrays;
/**
* Arrays.binarySearch():二分查找
* 前提:數(shù)組必須是升序排序后的!
* 特點(diǎn):
* 1. 找到:返回元素下標(biāo)
* 2. 未找到:返回 -(插入點(diǎn)) - 1
* 3. 有重復(fù)元素:返回任意一個(gè)匹配下標(biāo)(不保證是第一個(gè))
*/
public class ArraysBinarySearchDemo {
public static void main(String[] args) {
int[] sortedArr = {1, 2, 3, 5, 7, 9, 10}; // 必須先排序!
System.out.println("有序數(shù)組:" + Arrays.toString(sortedArr));
// 場景1:查找存在的元素
int key1 = 7;
int index1 = Arrays.binarySearch(sortedArr, key1);
System.out.println("查找" + key1 + ":下標(biāo)=" + index1);
// 場景2:查找不存在的元素
int key2 = 4;
int index2 = Arrays.binarySearch(sortedArr, key2);
System.out.println("查找" + key2 + ":返回值=" + index2 + "(插入點(diǎn)是3,-(3)-1=-4)");
// 場景3:查找超出范圍的元素
int key3 = 11;
int index3 = Arrays.binarySearch(sortedArr, key3);
System.out.println("查找" + key3 + ":返回值=" + index3 + "(插入點(diǎn)是7,-(7)-1=-8)");
// 錯(cuò)誤示例:未排序數(shù)組查找(結(jié)果不可靠)
int[] unsortedArr = {5, 2, 9};
int index4 = Arrays.binarySearch(unsortedArr, 2);
System.out.println("\n未排序數(shù)組查找2:" + index4 + "(結(jié)果錯(cuò)誤,不可信)");
}
}
/*結(jié)果:
有序數(shù)組:[1, 2, 3, 5, 7, 9, 10]
查找7:下標(biāo)=4
查找4:返回值=-4(插入點(diǎn)是3,-(3)-1=-4)
查找11:返回值=-8(插入點(diǎn)是7,-(7)-1=-8)
未排序數(shù)組查找2:-1(結(jié)果錯(cuò)誤,不可信)
*/7. 經(jīng)典算法手寫(面試??迹?/h3>
順序查找
/**
* 順序查找(線性查找)
* 核心:逐個(gè)遍歷、逐一比較,找到返回下標(biāo),未找到返回-1
* 適用:無序/有序數(shù)組都能查,優(yōu)點(diǎn)是簡單,缺點(diǎn)是效率低(時(shí)間復(fù)雜度 O(n))
*/
public class SequentialSearch {
public static void main(String[] args) {
// 測試數(shù)組(無序也能查)
int[] arr = {8, 3, 9, 7, 2, 5, 1, 6, 4};
int target = 7;
// 調(diào)用查找方法
int index = sequentialSearch(arr, target);
// 輸出結(jié)果
if (index != -1) {
System.out.println("找到目標(biāo)值 " + target + ",下標(biāo)為:" + index);
} else {
System.out.println("未找到目標(biāo)值 " + target);
}
}
/**
* 順序查找核心方法
* @param arr 待查找的數(shù)組
* @param target 要找的目標(biāo)值
* @return 找到返回下標(biāo),未找到返回-1
*/
public static int sequentialSearch(int[] arr, int target) {
// 健壯性處理:數(shù)組為空/長度為0,直接返回-1
if (arr == null || arr.length == 0) {
return -1;
}
// 遍歷數(shù)組,逐個(gè)比較
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i; // 找到立即返回下標(biāo),無需繼續(xù)遍歷
}
}
// 遍歷完都沒找到,返回-1
return -1;
}
}二分查找(有序數(shù)組)
/**
* 二分查找(折半查找)
* 核心:利用有序數(shù)組特性,每次排除一半元素,效率高(時(shí)間復(fù)雜度 O(log?n))
* 前提:數(shù)組必須是有序的(升序/降序,代碼需對(duì)應(yīng)調(diào)整)
*/
public class BinarySearch {
public static void main(String[] args) {
// 測試數(shù)組(必須是有序數(shù)組,這里用升序)
int[] sortedArr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int target = 5;
// 調(diào)用二分查找方法
int index = binarySearch(sortedArr, target);
// 輸出結(jié)果
if (index != -1) {
System.out.println("找到目標(biāo)值 " + target + ",下標(biāo)為:" + index);
} else {
System.out.println("未找到目標(biāo)值 " + target);
}
}
/**
* 二分查找核心方法(升序數(shù)組)
* @param sortedArr 有序數(shù)組(升序)
* @param target 要找的目標(biāo)值
* @return 找到返回下標(biāo),未找到返回-1
*/
public static int binarySearch(int[] sortedArr, int target) {
// 健壯性處理
if (sortedArr == null || sortedArr.length == 0) {
return -1;
}
// 定義左右指針
int left = 0;
int right = sortedArr.length - 1;
// 循環(huán)條件:左指針 <= 右指針(注意是 <=,否則會(huì)漏查最后一個(gè)元素)
while (left <= right) {
// 計(jì)算中間下標(biāo)(避免溢出:等價(jià)于 (left + right) / 2,但更安全)
int mid = left + (right - left) / 2;
if (sortedArr[mid] == target) {
return mid; // 找到目標(biāo),返回下標(biāo)
} else if (sortedArr[mid] < target) {
// 目標(biāo)在右半部分,左指針右移
left = mid + 1;
} else {
// 目標(biāo)在左半部分,右指針左移
right = mid - 1;
}
}
// 循環(huán)結(jié)束仍未找到,返回-1
return -1;
}
}冒泡排序
/**
* 冒泡排序
* 核心:相鄰元素兩兩比較,大的元素逐步“冒泡”到數(shù)組末尾
* 優(yōu)化:如果某一輪沒有交換,說明數(shù)組已有序,直接退出(減少循環(huán)次數(shù))
* 時(shí)間復(fù)雜度:最壞 O(n2),最好 O(n)(已排序數(shù)組)
*/
public class BubbleSort {
public static void main(String[] args) {
// 測試數(shù)組
int[] arr = {8, 3, 9, 7, 2, 5, 1, 6, 4};
System.out.println("排序前:" + Arrays.toString(arr));
// 調(diào)用冒泡排序方法
bubbleSort(arr);
// 輸出結(jié)果
System.out.println("排序后:" + Arrays.toString(arr));
}
/**
* 冒泡排序核心方法(升序)
* @param arr 待排序的數(shù)組(直接修改原數(shù)組)
*/
public static void bubbleSort(int[] arr) {
// 健壯性處理
if (arr == null || arr.length <= 1) {
return; // 空數(shù)組/只有1個(gè)元素,無需排序
}
int length = arr.length;
// 外層循環(huán):控制排序輪數(shù)(最多 length-1 輪)
for (int i = 0; i < length - 1; i++) {
// 標(biāo)記:本輪是否發(fā)生交換
boolean swapped = false;
// 內(nèi)層循環(huán):每輪比較到 length-1-i 位置(后i個(gè)元素已排好序)
for (int j = 0; j < length - 1 - i; j++) {
// 相鄰元素比較,前 > 后則交換(升序)
if (arr[j] > arr[j + 1]) {
// 交換兩個(gè)元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
// 標(biāo)記發(fā)生了交換
swapped = true;
}
}
// 優(yōu)化:本輪無交換,說明數(shù)組已有序,直接退出循環(huán)
if (!swapped) {
break;
}
}
}
}數(shù)組逆序
/**
* 數(shù)組逆序
* 核心:雙指針法,首尾元素交換,直到指針相遇
* 優(yōu)點(diǎn):時(shí)間復(fù)雜度 O(n),空間復(fù)雜度 O(1)(原地逆序,不額外占用空間)
*/
public class ReverseArray {
public static void main(String[] args) {
// 測試數(shù)組
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println("逆序前:" + Arrays.toString(arr));
// 調(diào)用逆序方法
reverseArray(arr);
// 輸出結(jié)果
System.out.println("逆序后:" + Arrays.toString(arr));
}
/**
* 數(shù)組逆序核心方法(原地逆序,直接修改原數(shù)組)
* @param arr 待逆序的數(shù)組
*/
public static void reverseArray(int[] arr) {
// 健壯性處理
if (arr == null || arr.length <= 1) {
return; // 空數(shù)組/只有1個(gè)元素,無需逆序
}
// 定義首尾指針
int left = 0;
int right = arr.length - 1;
// 循環(huán)交換:左指針 < 右指針時(shí)交換
while (left < right) {
// 交換首尾元素
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
// 左指針右移,右指針左移
left++;
right--;
}
}
}自定義數(shù)組拷貝
/**
* 自定義數(shù)組拷貝
* 核心:創(chuàng)建新數(shù)組,遍歷原數(shù)組,逐個(gè)復(fù)制元素到新數(shù)組
* 對(duì)比 JDK 自帶的 Arrays.copyOf:邏輯一致,幫你理解底層原理
*/
public class CustomArrayCopy {
public static void main(String[] args) {
// 測試數(shù)組
int[] originalArr = {8, 3, 9, 7, 2, 5, 1, 6, 4};
System.out.println("原數(shù)組:" + Arrays.toString(originalArr));
// 調(diào)用自定義拷貝方法
int[] copyArr = customCopyOf(originalArr, originalArr.length);
System.out.println("拷貝數(shù)組:" + Arrays.toString(copyArr));
// 驗(yàn)證:修改拷貝數(shù)組,原數(shù)組不受影響(證明是深拷貝)
copyArr[0] = 100;
System.out.println("修改后拷貝數(shù)組:" + Arrays.toString(copyArr));
System.out.println("修改后原數(shù)組:" + Arrays.toString(originalArr));
}
/**
* 自定義數(shù)組拷貝方法
* @param original 原數(shù)組
* @param newLength 新數(shù)組長度(可大于/小于原數(shù)組長度)
* @return 新的拷貝數(shù)組
*/
public static int[] customCopyOf(int[] original, int newLength) {
// 健壯性處理:原數(shù)組為空
if (original == null) {
return null;
}
// 1. 創(chuàng)建新數(shù)組(指定長度)
int[] newArr = new int[newLength];
// 2. 確定要拷貝的元素個(gè)數(shù)(取原數(shù)組長度和新長度的較小值)
int copyLength = Math.min(original.length, newLength);
// 3. 遍歷原數(shù)組,逐個(gè)復(fù)制到新數(shù)組
for (int i = 0; i < copyLength; i++) {
newArr[i] = original[i];
}
// 4. 返回新數(shù)組(如果新長度 > 原長度,多余位置默認(rèn)值為0)
return newArr;
}
}8. 二維數(shù)組
本質(zhì):數(shù)組的數(shù)組
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();
}
四、調(diào)試 + 數(shù)組:實(shí)戰(zhàn)組合技巧
- 遍歷數(shù)組時(shí)用條件斷點(diǎn),只看目標(biāo)元素
- 調(diào)試面板直接查看數(shù)組每一位的值
- 下標(biāo)越界時(shí),用調(diào)試看循環(huán)邊界是否正確
- 引用傳遞問題:在面板看地址是否相同
五、總結(jié)
- 調(diào)試是程序員的基本功,IDEA 快捷鍵用熟效率翻倍
- 數(shù)組是數(shù)據(jù)結(jié)構(gòu)基石,連續(xù)內(nèi)存、引用類型、下標(biāo) 0 起步
- 先會(huì)調(diào)試排錯(cuò),再扎實(shí)掌握數(shù)組,Java 基礎(chǔ)才算穩(wěn)
到此這篇關(guān)于Java入門指南之IDEA高效調(diào)試與數(shù)組的文章就介紹到這了,更多相關(guān)IDEA高效調(diào)試與java數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java開發(fā)時(shí)各類工具的使用規(guī)范
這篇文章主要介紹了java編碼時(shí)各類工具的使用規(guī)范,多人協(xié)作、共同開發(fā)一個(gè)項(xiàng)目,如果沒有統(tǒng)一的代碼規(guī)范的話,項(xiàng)目中的每個(gè)人都按照自己的習(xí)慣率性而為,就會(huì)導(dǎo)致整個(gè)項(xiàng)目的代碼看上去雜亂無章,可讀性非常差,并且持續(xù)增加后續(xù)的維護(hù)成本。對(duì)此感興趣可以來了解一下2020-07-07
SpringCloud 服務(wù)注冊(cè)IP錯(cuò)誤的解決
這篇文章主要介紹了SpringCloud 服務(wù)注冊(cè)IP錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Spring Boot集成SLF4j從基礎(chǔ)到高級(jí)實(shí)踐(最新推薦)
SLF4j (Simple Logging Facade for Java) 是一個(gè)日志門面(Facade),不是具體的日志實(shí)現(xiàn),這篇文章主要介紹了Spring Boot集成SLF4j從基礎(chǔ)到高級(jí)實(shí)踐(最新推薦),需要的朋友可以參考下2025-05-05
Java實(shí)現(xiàn)讀取SFTP服務(wù)器指定目錄文件的方法
SFTP是一種在安全通道上傳輸文件的協(xié)議,它是基于SSH(Secure Shell)協(xié)議的擴(kuò)展,用于在客戶端和服務(wù)器之間進(jìn)行加密的文件傳輸,這篇文章主要介紹了Java實(shí)現(xiàn)讀取SFTP服務(wù)器指定目錄文件,感興趣的朋友跟隨小編一起看看吧2023-08-08
Idea的Generate Sources無法生成QueryDSL問題及解決方法
這篇文章主要介紹了解決Idea的Generate Sources無法生成QueryDSL問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Druid(新版starter)在SpringBoot下的使用教程
Druid是Java語言中最好的數(shù)據(jù)庫連接池,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,DruidDataSource支持的數(shù)據(jù)庫,這篇文章主要介紹了Druid(新版starter)在SpringBoot下的使用,需要的朋友可以參考下2023-05-05

