「C Pointer Concepts in Java」一文提到 Java 沒有指標型別 (pointer type) ,但有參照型別 (reference type) 的設計。在遇到須要處理鏈結清單 (linked list)、圖形 (graph) 等資料結構時,Java 如何透過參照型別,仍能達成類似的效果。本文將以「鏈結清單」為例,分別用 C 與 Java 實作,說明兩者的差異與對應。
🔹 C 語言:使用指標建立鏈結清單
/*
1 -> 2 -> 3 NULL
*/
#include <stdio.h>
#include <stdlib.h>
// 定義節點結構
typedef struct Node {
int data; // 資料
struct Node* next; // 下一節點指標
} Node;
int main() {
// 建立三個節點
Node* head = (Node*)malloc(sizeof(Node));
Node* second = (Node*)malloc(sizeof(Node));
Node* third = (Node*)malloc(sizeof(Node));
// 給值與連結
head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;
// 印出鏈結清單
Node* current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
return 0;
}
- 其中,
Node*
是指標變數,指向記憶體中的節點。- 使用
malloc
配置記憶體,並用->
操作指標指向的內容。 - 每個節點透過
next
指向下一個節點,形成鏈結。
🔹 Java 語言:使用參照建立鏈結清單
/*
1 -> 2 -> 3 null
*/
// 定義節點結構
class Node {
int data; // 資料
Node next; // 下一節點參照
Node(int data) {
this.data = data;
this.next = null;
}
}
public class LinkedListDemo {
public static void main(String[] args) {
// 建立三個節點
Node head = new Node(1);
Node second = new Node(2);
Node third = new Node(3);
// 給值與連結
head.next = second;
second.next = third;
// 印出鏈結清單
Node current = head;
while (current != null) {
System.out.print(current.data + " -> ");
current = current.next;
}
System.out.println("null");
}
}
- 其中,
Node
是一個類別,變數如head
、second
是參照變數,指向物件。- 使用
new
建立物件,並透過.
操作物件的屬性。 - 雖然語法上沒有
*
或&
,但物件的參照本質上就像 C 的指標。
🔄 對照總結:C 指標 vs Java 參照
概念 | C 語言 | Java 語言 |
---|---|---|
記憶體操作 | 明確使用 * 和 & | 隱含於物件參照 |
記憶體配置 | malloc | new |
節點連結 | 指標指向下一節點 | 物件參照指向下一節點 |
安全性 | 容易出現記憶體錯誤 | 自動垃圾回收記憶體管理 (GC) |
以上說明 Java 雖然沒有指標型別,但仍能透過「參照型別」的設計,實現如鏈結清單這類需要動態記憶體與節點連結的資料結構。希望對於從 C 過渡到 Java 的學習者有幫助。
沒有留言:
張貼留言