將 C++ 代碼移植到 Java 時,核心難點在於 STL 容器與 Java Collections Framework 的語義映射。本文針對典型 C++ 數據結構提供完整的 Java 對應實現。
| C++ STL | Java 對應 | 關鍵差異 |
|---|---|---|
std::map<K, V> | TreeMap<K, V> | 有序、紅黑樹實現、O(log n) |
std::unordered_map<K, V> | HashMap<K, V> | 無序、哈希表、O(1) 平均 |
std::vector<T> | ArrayList<T> | 動態數組、隨機訪問快 |
std::list<T> | LinkedList<T> | 雙向鏈表、插入刪除快 |
std::set<T> | TreeSet<T> | 有序、唯一、紅黑樹 |
std::unordered_set<T> | HashSet<T> | 無序、唯一、哈希表 |
std::pair<T1, T2> | AbstractMap.SimpleEntry<T1, T2> 或自定義 Record | Java 無內置 Pair,Java 16+ 可用 record Pair<T1,T2>(T1 first, T2 second) |
// C++
std::map<int, int> Map;
// Java
Map<Integer, Integer> map = new TreeMap<>(); // 有序
// 或
Map<Integer, Integer> map = new HashMap<>(); // 無序,性能更好
// C++ 結構體
struct Point2d { int x; int y; float SWT; };
// Java 類(使用 Record,Java 16+)
public record Point2d(int x, int y, float SWT) {}
// 或傳統 POJO(兼容性更好)
public class Point2d {
private int x, y;
private float SWT;
// 構造器、getter/setter、toString、equals/hashCode
}
// Java
List<List<Point2d>> components = new ArrayList<>();
// 使用方式
components.add(new ArrayList<>()); // 添加一行
components.get(0).add(new Point2d(1, 2, 3.0f)); // 添加元素
// Java
List<Set<Integer>> graph = new ArrayList<>();
// 圖的鄰接表表示
graph.add(new TreeSet<>()); // 有序集合
graph.add(new HashSet<>()); // 無序集合
graph.get(0).add(1); // 添加邊 0->1
package com.example.model;
public class Point2d {
private int x;
private int y;
private float swt;
public Point2d() {}
public Point2d(int x, int y, float swt) {
this.x = x; this.y = y; this.swt = swt;
}
// Getter/Setter
public int getX() { return x; }
public void setX(int x) { this.x = x; }
public int getY() { return y; }
public void setY(int y) { this.y = y; }
public float getSWT() { return swt; }
public void setSWT(float swt) { this.swt = swt; }
@Override
public String toString() {
return String.format("Point2d[x=%d, y=%d, SWT=%.2f]", x, y, swt);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*, com.example.model.Point2d" %>
<html>
<head><title>Java Map 對應 C++ std::map 演示</title></head>
<body>
<h2>Map<Integer, Point2d> 數據展示</h2>
<%
// 創建並填充 Map(對應 C++ revmap)
Map<Integer, Point2d> myMap = new TreeMap<>(); // 有序,對應 std::map
myMap.put(1, new Point2d(100, 100, 100.0f));
myMap.put(2, new Point2d(200, 200, 200.0f));
myMap.put(3, new Point2d(300, 300, 300.0f));
// 遍歷輸出(對應 C++ 迭代器遍歷)
int i = 1;
for (Map.Entry<Integer, Point2d> entry : myMap.entrySet()) {
Integer key = entry.getKey();
Point2d point = entry.getValue();
%>
<div style="margin: 10px; padding: 10px; border: 1px solid #ccc;">
<strong>第 <%=i%> 個元素</strong><br/>
Key: <%=key%><br/>
Value: <%=point%>
</div>
<%
i++;
}
%>
</body>
</html>
public class Graph {
private final List<Set<Integer>> adjacencyList;
public Graph(int vertexCount) {
adjacencyList = new ArrayList<>(vertexCount);
for (int i = 0; i < vertexCount; i++) {
adjacencyList.add(new HashSet<>());
}
}
public void addEdge(int u, int v) {
adjacencyList.get(u).add(v);
adjacencyList.get(v).add(u); // 無向圖
}
public Set<Integer> getNeighbors(int v) {
return adjacencyList.get(v);
}
}
C++ STL 到 Java 集合的映射核心在於:
掌握這些映射規律,C++ 到 Java 的移植將事半功倍。