【Java基础07】链表

Java的指针和C语言的有些区别

一、创建新节点 vs 创建指针

创建新节点:

复制代码
ListNode newNode = new ListNode(5);  // 创建一个真实的新节点对象

创建指针(引用):

复制代码
ListNode ptr;  // 只是声明一个引用变量,没有创建新对象

这两个不一样!

用例子对比

复制代码
// 方式1:创建新节点
ListNode node1 = new ListNode(5);
// 内存中真的创建了一个节点对象,有 val=5,next=null

// 方式2:只声明引用
ListNode node2;
// 没有创建任何对象,node2 目前是空的(null)
// 如果你现在用 node2,会报错

// 方式3:让 node2 指向已存在的对象
node2 = node1;
// node2 现在指向 node1 指向的同一个对象

C 语言的对比

在 C 中更清楚:

复制代码
// 创建新节点
struct Node* node1 = malloc(sizeof(struct Node));  // 分配内存,创建新对象
node1->val = 5;

// 只声明指针
struct Node* node2;  // 指针变量声明了,但没有指向任何地址

// 让 node2 指向 node1
node2 = node1;  // 两个指针指向同一块内存

Java 的简化

Java 用 new 关键字统一处理:

复制代码
ListNode node = new ListNode(5);  // new = 分配内存 + 创建对象

相当于 C 的:

复制代码
struct Node* node = malloc(sizeof(struct Node));
node->val = 5;

回到之前的代码

复制代码
ListNode preLeftNode = dummyHead;
// 这里没有 new,所以没有创建新节点
// 只是让 preLeftNode 指向 dummyHead 已存在的对象

ListNode dummyHead = new ListNode(0);
// 这里有 new,所以创建了一个新的节点对象

简单说:

  • new ListNode() = 创建新节点(真的在内存中创建对象)

  • ListNode ptr = xxx = 创建指针/引用(指向已存在的对象)

二、引用类型 vs 原始类型

Java 有两种数据类型:

原始类型(基本类型):

复制代码
int x = 5;        // 直接存储值 5
double y = 3.14;  // 直接存储值 3.14
boolean flag = true;  // 直接存储值 true

引用类型:

复制代码
ListNode node = new ListNode(5);  // 存储的是对象的地址/引用
String s = "hello";               // 存储的是字符串对象的地址/引用
ArrayList list = new ArrayList(); // 存储的是对象的地址/引用

关键区别

原始类型 引用类型
直接存储 存储对象的地址(引用)
int x = 5; ListNode node = new ListNode(5);
内存中直接是数字 5 内存中是地址,指向实际对象

图解理解

原始类型:

复制代码
变量 x
┌─────┐
│  5  │  ← 直接存储值
└─────┘

引用类型:

复制代码
变量 node
┌──────────────┐         ┌──────────────┐
│ 地址:0x1234  │ ──────→ │ ListNode对象 │
└──────────────┘         │ val: 5       │
                         │ next: null   │
                         └──────────────┘

用 C 语言类比

复制代码
// 原始类型:直接存储值
int x = 5;      // x 里面就是数字 5

// 引用类型:存储地址(指针)
struct Node* node = malloc(...);  // node 里面存的是内存地址

为什么叫"引用"?

因为这个变量只是**引用(指向)**真实的对象,而不是直接包含对象本身。

复制代码
ListNode node1 = new ListNode(5);
ListNode node2 = node1;

// node1 和 node2 都是引用,都指向同一个对象
// 修改这个对象,两个引用都能看到变化
node1.val = 10;
System.out.println(node2.val);  // 输出 10

简单记住

引用类型 = 指向对象的变量

在你的链表代码中:

复制代码
ListNode pre = null;     // pre 是引用类型,现在是空引用(没指向任何对象)
ListNode cur = head;     // cur 是引用类型,指向 head 对象
ListNode node = new ListNode(5);  // node 是引用类型,指向新创建的对象

所有这些 ListNode 类型的变量都是引用类型

相关推荐
麦麦鸡腿堡2 小时前
Java事件处理机制
java·开发语言·python
小画家~2 小时前
第二十八:golang Time.time 时间格式返回定义结构体
java·前端·golang
西岭千秋雪_2 小时前
Kafka安装和使用
java·分布式·kafka·java-zookeeper
5***79002 小时前
Swift进阶
开发语言·ios·swift
從南走到北3 小时前
JAVA国际版打车APP打车顺风车滴滴车跑腿APP源码Android+IOS+H5
android·java·ios
Java天梯之路3 小时前
如何接收前端参数
java·后端
独自破碎E3 小时前
从括号匹配到字符串解码:递归思想的巧妙应用
android·java·开发语言
Charles_go3 小时前
C#13、什么是部分类
开发语言·c#
忧郁的橙子.3 小时前
二、Rabbit MQ 高级
java·开发语言