C/C++ 轉 Java 的數據結構初階對比指南

一、先遣了解和回顧

1、預覽快速對比表格

數據結構????C/C++ 實現????Java 實現????關鍵區別??
??數組??int arr[5];int[] arr = new int[5];語法類似,Java 數組是對象
??動態數組??vector<int> v;ArrayList<Integer> list = new ArrayList<>();C++:手動內存管理;Java:自動擴容+泛型
??鏈表??list<int> l;?(雙向鏈表)LinkedList<Integer> list = new LinkedList<>();Java鏈表實現迭代器更簡潔
??棧??stack<int> s;Deque<Integer> stack = new ArrayDeque<>();??Java建議避免用?Stack?類(已過時)??
??隊列??queue<int> q;Queue<Integer> queue = new LinkedList<>();都支持 FIFO,Java 接口更統一
??二叉樹??需手動實現節點結構同左(需自定義?TreeNode無標準庫,實現邏輯相似
??堆??priority_queue<int> pq;PriorityQueue<Integer> pq = new PriorityQueue<>();??C++默認大頂堆,Java 默認小頂堆!??
??排序??sort(v.begin(), v.end());Collections.sort(list);C++用迭代器,Java 用集合工具類
??映射?unordered_map<string, int>HashMap<String, Integer> map = new HashMap<>();C++用?[]?訪問,Java 用?put()/get()
??集合?unordered_set<string>HashSet<String> set = new HashSet<>();Java的?Set?是接口

2、Java中的包裝類

基本數據類型包裝類
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

【1】裝箱/裝包:基本數據類型變為包裝類型。Java 中的基本數據類型(如 int、double 等)是原始類型,而包裝類型(如 Integer、Double 等)是類。

例如:

????????????????Integer i = Integer.valueOf(i);? ? //顯示裝箱,通過包裝類的靜態方法 valueOf() 轉換

? ? ? ? ? ? ? ? Integer n = 2025;? ? ?//自動裝箱?,編譯器自動調用 Integer.valueOf() 方法

【2】拆箱/拆包:把包裝類型變為基本數據類型

例如:

????????????????int? a = n.intValue();? ? //顯示拆箱,通過包裝類的實例方法 intValue() 轉換

?????????????????int b = n;???//自動拆箱,編譯器自動調用 n.intValue() 方法

補充說明:

(1)性能問題:自動裝箱和拆箱雖然方便,但可能會帶來性能開銷。因為每次裝箱都會創建一個新的對象,而每次拆箱都需要調用方法。如果在性能敏感的代碼中,建議盡量避免頻繁的裝箱和拆箱操作。

(2)空指針異常:在使用自動拆箱時,如果包裝類型變量為 null,調用拆箱方法會拋出 NullPointerException。例如:

Integer m = null;
int c = m; // 拋出 NullPointerException,因為 m 為 null

(3)緩存機制:Integer.valueOf() 方法有一個緩存機制。對于 -128 到 127 之間的整數,valueOf() 方法會直接返回緩存的對象,而不是每次創建新對象。例如:

Integer x = 100; // 自動裝箱,使用緩存對象
Integer y = 100; // 自動裝箱,使用相同的緩存對象
System.out.println(x == y); // 輸出 true

但超出這個范圍時,每次調用 valueOf() 都會創建新的對象:

Integer z = 2025;
Integer w = 2025;
System.out.println(z == w); // 輸出 false

二、數據結構代碼說明及其對比

1、數組(Array)

C/C++

C/C++ 中數組是一塊連續的內存空間,聲明方式如int arr[5];,可通過arr[i]訪問元素

//原生數組
int arr[5] = {1, 2, 3, 4, 5}; // 靜態數組
int size = sizeof(arr) / sizeof(arr[0]); // 獲取數組大小

補充:在C++11起,可以使用標準庫容器?std::array來讀取數組大小,必須要使用<array>頭文件。(所有 STL 容器(如 std::list, std::map, std::string 等)均支持 .size():)

#include <array>
std::array<int, 5> arr = {1, 2, 3, 4, 5};
size_t length = arr.size(); // size_t是C++中的無符號整型

Java

Java 中數組是對象,可用new關鍵字創建,如int[] arr = new int[5];,通過arr[i]訪問元素。Java 數組有length屬性獲取長度,如arr.length

int[] arr = {1, 2, 3, 4, 5}; // 靜態數組
int size = arr.length; // 獲取數組大小

2、動態數組(Dynamic Array)

C++

C++中使用std::vector來實現動態數組。使用<vector>頭文件。

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> vec = { 1,2,3,4,5 };vec.push_back(6);  //1. 添加元素,在末尾cout << "添加元素后:";for (int n : vec) cout << n << " ";// 值傳遞(創建副本)遍歷cout << endl;vec.insert(vec.begin() + 2, 712);  //2. 指定位置添加元素cout << "指定位置添加元素后:";for (auto it = vec.begin();it != vec.end();++it)  cout << *it << " ";//使用迭代器遍歷cout << endl;vec.erase(vec.begin() + 3);  //3. 刪除元素,索引為3的元素被刪除cout << "刪除第四個元素后:";for (int i = 0;i < vec.size();++i) cout << vec[i] << " ";cout << endl;cout << "獲取長度:" << vec.size() << endl;  //4. 獲取長度cout << "獲取索引為3的元素:" << vec[3] << endl;  //5. 獲取指定元素return 0;
}

Java

Java中使用ArrayList來實現動態數組,功能類似。需要導入?java.util.ArrayList

動態數組不能使用.length而是要使用.size()獲取長度!!! .length?是數組的屬性??,.size()?是ArrayList?的方法??

import java.util.ArrayList;
import java.util.Arrays;public class FirstTest {public static void main(String[] args){ArrayList<Integer> number = new ArrayList<>(Arrays.asList(1,2,3,4,5));number.add(100);//1. 添加元素,會添加到最后System.out.println("添加后:"+number);number.add(1,711);//2. 在指定位置添加元素System.out.println("指定添加后:"+number);number.remove(1);//3. 刪除第二個元素System.out.println("刪除后:"+number);System.out.println("長度:"+number.size());//4. 獲取長度System.out.println("索引為1(即第二個)的元素:"+number.get(1));//5. 獲取指定元素}
}

3、鏈表(Linked List)

C/C++

鏈表通過指針連接節點,每個節點包含數據和指向下一節點的指針。

如定義單鏈表節點struct ListNode { int val; ListNode* next; };,需手動管理內存,通過malloc分配內存,free釋放內存。

//C++代碼
#include <iostream>
using namespace std;//單向鏈表節點結構體
struct ListNode {int val;  // 節點存儲的數據ListNode* next;  // 指向下一個節點的指針explicit ListNode(int x):val(x),next(nullptr){}//定義了一個只允許顯式調用的構造函數,用給定值初始化節點數據,并把 next 置空。
};//在鏈表頭部插入節點
ListNode* addNode(ListNode*& head, int val) {ListNode* newNode = new ListNode(val);  // 創建新節點newNode->next = head;                   // 新節點指向原頭節點return newNode;                         // 返回新的頭節點
}
//打印鏈表
void printList(ListNode*& head) {for (ListNode* cur = head;cur;cur = cur->next) {cout << cur->val << " ";}cout << endl;
}int main()
{ListNode* head = nullptr;head = addNode(head, 3);head = addNode(head, 2);head = addNode(head, 1);printList(head);//輸出1 2 3return 0;
}

Java

Java 中通過實現鏈表,無需手動管理內存,自動回收內存。

可定義class ListNode { int val; ListNode next; },使用new創建節點對象。

class ListNode {int val;          // 節點中保存的整數值ListNode next;    // 指向下一個節點的引用,若為空則表示鏈表結束// 構造方法:創建節點時只需給定 val,next 默認為 nullListNode(int val) {this.val = val;}
}public class LinkedList {/*** 在鏈表頭部插入新節點* @param head 當前鏈表頭節點* @param val  待插入的新值* @return 插入后的新鏈表頭節點*/public static ListNode addNode(ListNode head, int val) {ListNode newNode = new ListNode(val); // 創建新節點newNode.next = head;                  // 新節點指向原頭節點return newNode;                       // 新節點成為新頭,返回}/*** 按順序打印鏈表中的所有值* @param head 鏈表頭節點*/public static void printList(ListNode head) {ListNode cur = head;while (cur != null) {                 // 遍歷直到鏈表尾System.out.print(cur.val + " ");  // 打印當前節點值cur = cur.next;                   // 移動到下一個節點}System.out.println();}public static void main(String[] args) {ListNode head = null;     // 初始鏈表為空head = addNode(head, 3);  // 頭部插入 3head = addNode(head, 2);  // 頭部插入 2head = addNode(head, 1);  // 頭部插入 1printList(head);          // 輸出:1 2 3}
}

4、棧(Stack)

C/C++

可通過數組或鏈表實現棧,手動管理元素進出。

如用數組實現時,需定義棧頂指針,通過操作指針來實現壓棧和彈棧操作。

//C++代碼
#include <iostream>
#include <limits>
using namespace std;const int MAX_SIZE = 5;//棧的最大容量class ArrayStack {
private:int stackArray[MAX_SIZE];//存儲棧元素的數組int topPointer;  //棧頂指針(索引位置)
public:ArrayStack() {topPointer = -1;//初始化棧頂指針為-1}//壓棧操作void push(int value) {if (topPointer >= MAX_SIZE - 1) { //檢查棧是否已滿cout << "Stack Overflow! Cannot push " << value << endl;return;}stackArray[++topPointer] = value;//棧頂指針先加1,再將元素存入cout << "Pushed:" << value << endl;}//彈棧操作int pop() {if (isEmpty()) {cout << "Stack Underflow!" << endl;return INT_MIN; //返回錯誤碼}int value = stackArray[topPointer--]; // 先取出棧頂元素,指針再減1cout << "Popped:" << value << endl;return value;}//獲取棧頂元素(不彈出)int peek() {if (isEmpty()) {cout << "Stack is empty!" << endl;}return stackArray[topPointer];}//檢查棧是否為空bool isEmpty() {return topPointer == -1;}//顯示棧狀態void display() {if (isEmpty()) {cout << "Stack:[](Empty)" << endl;return;}cout << "Stack:[";for (int i = 0;i <= topPointer;++i) {cout << stackArray[i] << " ";}cout << "]" << endl;}
};int main() {ArrayStack myStack;myStack.push(2025);//壓入2025myStack.push(7);//壓入7myStack.display();cout << "Top element:" << myStack.peek() << endl;//查看棧頂myStack.pop();myStack.push(13);myStack.push(14);myStack.push(15);myStack.push(16);//棧滿myStack.push(17);//溢出錯誤myStack.display();return 0;
}

Java

Java 有java.util.Stack類,是Vector的子類,提供了push(壓棧)、pop(彈棧)等方法。也可使用Deque接口的實現類如LinkedList來模擬棧,addFirst和removeFirst方法可分別實現壓棧和彈棧功能。

(1)使用java.util.Stack
(2)使用LinkedList實現Deque接口
import java.util.Stack;
import java.util.LinkedList;
import java.util.Deque;public class StackDemo {public static void main(String[] args) {//方法一:使用java.util.StackSystem.out.println("Using java.util.Stack:");Stack<Integer>jdkStack = new Stack<>();//壓棧操作Stack.push()jdkStack.push(2025);jdkStack.push(7);jdkStack.push(14);//彈棧操作Stack.pop()System.out.println("Popped:"+jdkStack.pop());//彈出14//查看棧頂元素,不移除Stack.peek()System.out.println("Top element:"+jdkStack.peek());//顯示7//顯示當前棧內容System.out.println("Stack contents:"+jdkStack);//方法二:使用LinkedList實現Deque接口System.out.println("Using LinkedList as Deque:");Deque<Integer>dequeStack = new LinkedList<>();//模擬壓棧操作(添加到頭部)addFirst()dequeStack.addFirst(2025);dequeStack.addFirst(10);dequeStack.addFirst(1);//模擬彈棧操作(移除頭部)removeFirst()System.out.println("Popped:"+dequeStack.removeFirst());//彈出1//查看棧頂peekFirst()System.out.println("Top element:"+dequeStack.peekFirst());//顯示10//顯示當前棧狀態System.out.println("DequeStack contents:"+dequeStack);}
}

5、隊列(Queue)

C/C++

可以使用數組或鏈表實現隊列結構。數組實現時建議采用循環隊列來優化空間利用率,而鏈表實現則更為直觀,只需維護隊頭和隊尾兩個指針即可。

(1)數組實現
#include <iostream>
using namespace std;class CircularQueue {
private:int* data;  //動態數組int front;  //隊頭下標int rear;   //隊尾下標(指向即將入隊的空位)int capacity; //數組容量int count;//當前元素個數
public://構造函數:申請數組并初始化指針explicit CircularQueue(int cap) :capacity(cap), front(0), rear(0), count(0) {data = new int[capacity];}//析構函數:釋放動態數組~CircularQueue() {delete[] data;}//入隊,O(1)bool enqueue(int val) {if (count == capacity) {cout << "隊列已滿," << val << "無法入隊" << endl;return false;}data[rear] = val;  //放入數值rear = (rear + 1) % capacity; //循環后移++count;cout << val << "入隊" << endl;return true;}//出隊,O(1)bool dequeue(int& out) {if (count == 0) {cout << "隊列為空,無法出隊" << endl;return false;}out = data[front];front = (front + 1) % capacity;//循環后移--count;return true;}//查看隊頭,不刪除bool peek(int& out)const {if (count == 0) return false;out = data[front];return true;}//當前元素數量int size()const { return count; }};int main() {CircularQueue q(3);q.enqueue(2025);q.enqueue(7);q.enqueue(18);q.enqueue(5);//提示隊列已滿int val;while (q.size()) {if (q.dequeue(val)) cout << val << "出隊" << endl;}q.dequeue(val);return 0;
}

(2)鏈表實現
//C++代碼
#include <iostream>
using namespace std;//鏈表節點:每個節點保存一個數據與下一個數據的指針
struct Node
{int data;   //存儲節點的整數值Node* next; //指向下一個節點的指針Node(int val):data(val),next(nullptr){}//構造函數,接收一個整數參數val,用val初始化data,將next指針置空
};//鏈式隊列,只維護“隊頭”與“隊尾”兩個指針即可
class LinkedQueue {
private:Node* front;Node* rear;
public:LinkedQueue():front(nullptr),rear(nullptr){}//初始化front和rear為空指針//入隊:尾插法,時間復雜度O(1)void enqueue(int val) {Node* node = new Node(val);//在堆上新建節點if (!rear) {//若rear為空,則隊列為空front = rear = node; //空隊列時首尾指針都指向新節點}else {rear->next = node; //當前尾結點的next指向新節點rear = node; //更新尾指針,指向新的尾結點}cout << val << "入隊" << endl;}//出隊:頭刪法,時間復雜度O(1)bool dequeue(int& out) {  //dequeue函數,通過引用out帶出出隊值if (!front) {  //如果front為空,說明隊列為空cout << "隊列已空,無法出隊" << endl;return false;}Node* tmp = front;//暫存當前隊頭節點地址out = tmp->data;  //取出當前隊頭值,存入outfront = front->next; //頭指針后移,指向下一個節點if (!front) rear = nullptr; //若隊列變為空,同步尾指針為空delete tmp;return true;}//查看隊頭但不刪除,返回INT_MIN表示空隊列int peek() {if (!front) {cout << "隊列為空" << endl;return INT_MIN;}return front->data;}
};int main()
{LinkedQueue q;q.enqueue(2025);q.enqueue(7);q.enqueue(16);cout << "隊頭元素:" << q.peek() << endl; //查看隊頭元素,不刪除int val; //接收 dequeue 彈出的那個隊頭元素if (q.dequeue(val)) cout << val << "出隊" << endl;if (q.dequeue(val)) cout << val << "出隊" << endl;if (q.dequeue(val)) cout << val << "出隊" << endl;if (q.dequeue(val)) cout << val << "出隊" << endl; //此時隊已經為空return 0;	
}

Java

Java 有java.util.Queue接口,常用實現類有PriorityQueue和LinkedList。LinkedList實現了Queue接口,提供offer()方法進行入隊操作,poll()方法進行出隊操作。

(1)使用LinkedList

(先進先出)

import java.util.LinkedList;
import java.util.Queue;//例一:使用LinkedList實現隊列(先進先出)
public class QueueDemo1 {public static void main(String[] args) {Queue<String> linkedListQueue = new LinkedList<>();//入隊,添加到隊尾linkedListQueue.offer("live");linkedListQueue.offer("towards");linkedListQueue.offer("death");System.out.println("LinkedList隊列內容:"+linkedListQueue);//出隊,移除并返回隊列頭部元素String firstItem = linkedListQueue.poll();System.out.println("出隊元素:"+firstItem);System.out.println("出隊后的隊列:"+linkedListQueue);//查看隊列頭部元素,僅查看,不刪除String peekItem = linkedListQueue.peek();System.out.println("查看當前隊頭:"+peekItem);}
}

(2)使用PriorityQueue

(按優先級排序,默認為自然序)

默認序:

????????????????數字,按數值升序排列(例如?[1,?2,?3])。

????????????????字符串,按字典序(Unicode?編碼)升序排列(例如?["apple",?"banana",?"cherry"])。

import java.util.PriorityQueue;
import java.util.Queue;//使用PriorityQueue
public class QueueDemo2 {public static void main(String[] args) {Queue<Integer> priorityQueue = new PriorityQueue<>();//亂序入隊priorityQueue.offer(2025);priorityQueue.offer(7);priorityQueue.offer(17);System.out.println("PriorityQueue初始隊列:"+priorityQueue);//按優先級出隊(數值由小到大)System.out.println("按優先級出隊結果:");while (!priorityQueue.isEmpty()){System.out.print("->"+priorityQueue.poll());}}
}

6、二叉樹(Binary Tree)

用前序遍歷為例

C/C++

二叉樹節點通常定義為struct TreeNode { int val; TreeNode* left; TreeNode* right; };,通過指針連接左右子樹,遍歷等操作需遞歸或利用棧等輔助數據結構實現。

#include <iostream>
#include <vector>
using namespace std;struct TreeNode
{int val;  //節點存儲的整數值TreeNode* left;  //指向左子節點的指針TreeNode* right; //指向右子節點的指針TreeNode(int x) :val(x), left(nullptr), right(nullptr) {}
};//前序遍歷:根->左->右
void preorderTraversal(TreeNode* root, vector<int>& res)
{if (root == nullptr)return;//遞歸終止條件,當前節點為空res.push_back(root->val);  //訪問根節點preorderTraversal(root->left, res); //遞歸遍歷左子樹preorderTraversal(root->right, res); //遞歸遍歷右子樹
}
int main(){//創建根節點TreeNode* root = new TreeNode(1);//第二層節點root->left = new TreeNode(2);root->right  = new TreeNode(3);//第三層節點root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);vector<int>result; //儲存遍歷結果的容器preorderTraversal(root, result);//執行前序遍歷cout << "前序遍歷結果:";for (int val : result) cout << val << " ";//內存釋放,自底向上delete root->left->left;delete root->left->right;delete root->left;delete root->right;delete root;return 0;
}

Java

Java中定義二叉樹節點類class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } },遍歷方式與C++類似,但無需手動管理內存。

import java.util.ArrayList;
import java.util.List;class TreeNode{int val; //節點存儲的整數值TreeNode left;TreeNode right;TreeNode(int val){this.val = val;}//節點構造函數
}public class BinaryTreeTraversal {private static void preorderTraversal(TreeNode root, List<Integer> res){if(root == null) return;//遞歸終止條件,當前節點為空res.add(root.val); //訪問根節點preorderTraversal(root.left, res);  //遍歷左子樹preorderTraversal(root.right, res); //遍歷右子樹}public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);List<Integer> result = new ArrayList<>(); //存儲遍歷結果動態數組preorderTraversal(root,result); //執行前序遍歷、System.out.println("前序遍歷結果:");for(int val:result){System.out.print(val+" ");}//自動回收所有對象}
}

7、堆(Heap/PriorityQueue)

堆是堆是分為大頂堆和小頂堆的完全二叉樹。

大頂堆:每個父節點的值大于等于對應的子節點的值

小頂堆:每個父節點的值小于等于對應的子節點的值

C++

std::priority_queue,默認大頂堆

#include <iostream>
#include <queue>
using namespace std;int main() {//默認大頂堆priority_queue<int> maxHeap;maxHeap.push(20);maxHeap.push(7);maxHeap.push(2025);while (!maxHeap.empty()) {cout << maxHeap.top() << " "; //2025 20 7maxHeap.pop();}return 0;
}

Java

java.util.PriorityQueue,默認小頂堆

import java.util.PriorityQueue;public class HeapDemo {public static void main(String[] args) {//默認小頂堆PriorityQueue<Integer> minHeap = new PriorityQueue<>();minHeap.offer(2025);minHeap.offer(7);minHeap.offer(20);while (!minHeap.isEmpty()) {System.out.print(minHeap.poll() + " ");//7 20 2025}}
}

8、排序(Sorting)

C++

<algorithm>里的sort

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;int main()
{vector<int> v = { 2,0,5,7,3 };sort(v.begin(), v.end());  //升序排列for (int n : v) cout << n << " ";//0 2 3 5 7return 0;
}

Java

使用Collection.sort

import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class SortDemo {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(2, 0, 5, 7, 3);Collections.sort(numbers); // 升序排序System.out.println(numbers);//[0, 2, 3, 5, 7]}
}

使用Arrays.sort

import java.util.Arrays;public class SortDemo {public static void main(String[] args) {int[] arr = {2,0,5,7,3};Arrays.sort(arr);  //升序排列for(int n:arr) System.out.print(n+" ");//0 2 3 5 7}
}

9、映射(Map)

鍵值對(Key-Value?Pair)結構,支持快速查找。
鍵值對本質上就是一個名稱(Key)對應一個內容(Value)。名稱作為唯一標識,用于快速定位和訪問對應的內容。

C++

std::unordered_map(哈希表)/std::map(紅黑樹)

#include <iostream>
#include <unordered_map>using namespace std;int main() {unordered_map<string, int> score;//哈希表score["Emma"] = 7;score["Ida"] = 25;cout << "Emma:" << score["Emma"] << endl;//Emma:7
}

Java

HashMap(哈希表)/TreeMap(紅黑樹)

import java.util.HashMap;public class MapDemo {public static void main(String[] args) {HashMap<String,Integer> score = new HashMap<>();score.put("Emma",7);score.put("Ida",25);System.out.println("Emma:"+score.get("Emma"));//Emma:7}
}

10、集合(Set)

只保存唯一元素,支持快速判重。

C++

std::unordered_set(哈希表)/std::set(紅黑樹)

#include <iostream>
#include <unordered_set>using namespace std;int main() {unordered_set<int> s; //哈希集合s.insert(7);s.insert(25);s.insert(7); //重復的7將會被忽略for (int n : s)cout << n << " "; //7 25return 0;
}

Java

HashSet(哈希表)/TreeSet(紅黑樹)

import java.util.HashSet;public class SetDemo {public static void main(String[] args) {HashSet<Integer> set = new HashSet<>();set.add(7);set.add(25);set.add(7); //重復的7將會被忽略for(int n:set) System.out.print(n+" "); //7 25}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/97940.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/97940.shtml
英文地址,請注明出處:http://en.pswp.cn/web/97940.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

長連接和短連接

在網絡通信中&#xff0c;長連接&#xff08;Long Connection&#xff09;和短連接&#xff08;Short Connection&#xff09;是兩種核心的連接管理策略&#xff0c;其區別主要體現在連接生命周期、資源占用和適用場景上。以下是兩者的詳細解析&#xff1a;一、核心概念對比特性…

Java:使用spring-cloud-gateway的應用報DnsNameResolverTimeoutException原因和解決方法

使用spring-cloud-gateway時&#xff0c;有時會報DnsNameResolverTimeoutException異常。堆棧信息類似&#xff1a;Caused by: java.net.UnknownHostException: Failed to resolve cloudconnector.linkup-sage.comat io.netty.resolver.dns.DnsResolveContext.finishResolve(Dn…

SpringCloud概述

目錄 一、概念 1.1 微服務架構 1.2 SpringCloud概念 1.3 核心價值 1.4 能力邊界 1.5 微服務總體架構圖 二、生態圈 2.1 不同生態圈組件對比 2.2 組件介紹 2.2.1 服務發現與注冊 2.2.2 配置管理 2.2.3 API網關 2.2.4 容錯與熔斷 2.2.5 客戶端負載均衡 2.2.6 服務…

光伏電站環境監測儀—專為光伏電站設計的氣象監測設備

光伏電站環境監測儀是專為光伏電站設計的氣象監測設備&#xff0c;通過實時采集關鍵環境參數&#xff0c;為光伏系統的發電效率評估、運維決策和安全預警提供數據支撐。監測參數太陽輻射采用高精度總輻射表&#xff0c;測量水平面總輻射和傾斜面輻射&#xff0c;精度達 2% 以內…

Node.js ≥ 18 安裝教程

Windows 安裝 下載安裝包&#xff1a;訪問 Node.js官網&#xff0c;下載最新的 LTS 版本&#xff08;確保版本 ≥ 18&#xff09;運行安裝程序&#xff1a;雙擊下載的安裝文件&#xff0c;按照向導完成安裝驗證安裝&#xff1a;打開命令提示符或PowerShell&#xff0c;輸入以下…

電腦 hdmi 沒有聲音問題解決

問題現象&#xff1a;電腦耳機聲音正常輸出&#xff0c;使用hdmi連接電視后&#xff0c;沒有聲音輸出。&#xff08;正常會通過hdmi 在電視上播放視頻和聲音&#xff09;解決方案:出現該情況很可能原因是 顯卡的驅動不對。網上找了各種方法都沒有解決&#xff0c;最后系統升級后…

學習日記-XML-day55-9.14

1.xml基本介紹知識點核心內容重點XML定義可擴展標記語言&#xff0c;用于數據存儲和傳輸與HTML的區別&#xff08;HTML用于展示&#xff0c;XML用于結構化數據&#xff09;XML用途1. 配置文件&#xff08;Spring的beans.xml、Tomcat的server.xml&#xff09;;2. 數據交換&#…

【系統架構設計(27)】信息安全技術集成

文章目錄一、本文知識覆蓋范圍二、信息安全基礎要素詳解1、機密性保障技術2、完整性驗證技術3、可用性保障技術4、可控性管理技術5、可審查性追溯技術三、網絡安全威脅與防護策略1、非授權訪問防護2、拒絕服務攻擊防護3、惡意軟件傳播防護四、加密技術體系與應用1、對稱加密技術…

什么是 SaaS 安全?

什么是 SaaS 安全&#xff1f; SaaS 安全專注于保護云中的數據、應用程序和用戶身份。它旨在應對基于云的軟件所面臨的挑戰&#xff0c;以確保信息的安全性和可用性。SaaS 安全致力于降低未授權訪問、數據泄露等風險&#xff0c;同時增強 SaaS 應用程序的安全性。 SaaS 安全不僅…

mysql和postgresql如何選擇

h5打開以查看 簡單來說&#xff1a; MySQL&#xff1a;更像是一個“快速、可靠的工匠”&#xff0c;注重速度、簡單和穩定性&#xff0c;尤其在讀操作密集的Web應用中是經典選擇。 PostgreSQL&#xff1a;更像是一個“功能強大的學者”&#xff0c;追求功能的完備性、標準的符…

Redis最佳實踐——安全與穩定性保障之數據持久化詳解

Redis 在電商應用的安全與穩定性保障之數據持久化全面詳解一、持久化機制深度解析 1. 持久化策略矩陣策略觸發方式數據完整性恢復速度適用場景RDB定時快照分鐘級快容災備份/快速恢復AOF實時追加日志秒級慢金融交易/訂單關鍵操作混合模式RDBAOF同時啟用秒級中等高安全要求場景無…

Data Augmentation數據增強

目錄 數據增強是什么 為什么數據增強 數組增強分類 有監督數據增強 無監督數據增強 數據增強是什么 數據增強又稱數據擴增&#xff0c;是一種通過應用合理且隨機的變換&#xff08;例如圖像位移、旋轉&#xff09;來增加訓練集多樣性的技術。讓有限的數據產生等價于更多數…

OpenCV:特征提取

目錄 一、特征提取核心概念&#xff1a;什么是圖像特征&#xff1f; 二、實戰 1&#xff1a;Harris 角點檢測 1.1 角點的物理意義 1.2 Harris 算法原理 1.3 OpenCV 實戰代碼與解析 1.4 結果分析 三、實戰 2&#xff1a;SIFT 特征提取 3.1 SIFT 算法核心優勢 3.2 SIFT…

MySQL的查找加速器——索引

文章目錄 目錄 前言 一、基礎概念&#xff1a;什么是 MySQL 索引&#xff1f; 二、底層數據結構&#xff1a;為什么 InnoDB 偏愛 B 樹&#xff1f; B 樹的結構特點&#xff08;以短鏈接表short_link的short_code索引為例&#xff09;&#xff1a; B 樹的優勢&#xff1a…

【Vue2手錄11】Vue腳手架(@vue_cli)詳解(環境搭建+項目開發示例)

一、前言&#xff1a;為什么需要 Vue 腳手架&#xff1f; 手動搭建 Vue 項目存在諸多痛點&#xff08;原筆記提及&#xff09;&#xff1a; 依賴管理復雜&#xff1a;需手動下載 Vue、Babel、Webpack 等工具&#xff0c;處理版本兼容性。配置繁瑣&#xff1a;Webpack 配置、E…

自簽發、CA機構簽發、SSH、SCP、RSYNC,SUDO詳解

一、為什么&#xff1f; 1. 自建CA為什么比Lets Encrypt強&#xff1f; 不能把CA放公網&#xff01;Lets Encrypt是給公網服務用的&#xff08;比如10.0.0.30的Web服務&#xff09;&#xff0c;但內網服務&#xff08;比如OpenVPN&#xff09;必須用自簽CA。 CA私鑰必須物理隔…

【Python】Python解決阿里云DataWorks導出數據1萬條限制的問題

【Python】Python解決阿里云DataWorks導出數據1萬條限制的問題一、前言二、腳本功能概述三、核心代碼解析**1. 環境配置與安全設置****2. 用戶配置區****3. 數據清洗函數****4. 核心邏輯**四、完整代碼演示五、總結一、前言 在日常數據分析工作中&#xff0c;團隊經常需要從阿…

計算機網絡(一)基礎概念

本篇文章為計算機網絡相關知識點整理及擴展 基于B站計算機網絡課程&#xff1a;https://www.bilibili.com/video/BV1p69tYZEvN/?spm_id_from333.1007.top_right_bar_window_history.content.click 如有錯誤&#xff0c;還望大家不吝指正 URL&#xff08;統一資源定位符&…

Git的工作區域和文件結構

Git的工作區域和文件結構 1. Git的工作區域2. Git的文件結構 打開.git文件&#xff0c;.git的文件結構如下&#xff1a; objects 存放已經提交的文件&#xff0c;也就是使用 git commit 進行操作后的文件。 index 存放已暫存的文件&#xff0c;也就是使用了 git add 進行操作后…

前端開發易錯易忽略的 HTML 的 lang 屬性

前言本文主要記錄&#xff1a;前端開發中&#xff0c;一個本人錯了好幾年&#xff0c;看似無關緊要的小錯誤&#xff1a;HTML 的 lang 屬性設置。正文HTML 的 lang 屬性在HTML中&#xff0c;lang屬性用于指定文檔的語言。這對于搜索引擎優化&#xff08;SEO&#xff09;、屏幕閱…