JSE -->深入剖析 Object 中的 equals(),==,以及对象的比较

本文详细解释了Java中Object类的equals方法与==运算符的区别。默认情况下,两者都比较对象引用;但当equals被重写后,可以用于比较对象的内容而非引用。文章通过实例对比了未重写与重写equals方法的行为。

1:Object 中的equals()是比较的两个对象的句柄也就是指针的一种,也就是说它其实说的就是equals() 与 ==是同一回事!

     JDK中的源码为证:

 

2:为什么会有: equals 比较的是对象,而== 比较的是引用的地址一说呢?

     其实这个的说法是针对于那些继承至Object 的类然后又重写了equals()方法了类而言的。那么我们来看一下到底人家是怎么从写这个

equals()的呢? 下面一String 来说明一下啊

  JDK中的源码为证:

    

从上面我们可以很明显的知道,那些重写了Object 的equals的一些类中已经把equals作为了比较对象来使用了!这里就有一个误区了:其实

并不是所有的对象的equals 方法都被从写了的。所以在那些没有被重写的类中equals方法其实是比较的句柄 。这里举个例子说明一下!

   

 

如果在自定义类中要进行重写equals()其实挺简单的,只需要在自定义类中加入

   

在自定义类中加入了equals后的

结果为:

true

false

true

 

总结: object 中的equals是比较的句柄 ,如果没有从写的话equals 比较句柄是无疑的! 如果重写了的话那么equals是比较的两个对象。

          而== 对于主类型而言是比较的值,对于引用类型的话是比较的内存地址这个没有什么疑问的!

 

 

### 关于VSCopilot中出现的'No lowest priority node found'错误 在解决“VSCopilot No lowest priority node found”错误时,需要从以下几个方面进行分析和排查。尽管引用内容并未直接提及此问题,但可以结合相关背景知识和技术细节来提供解决方案。 #### 1. 错误原因分析 此错误通常出现在基于图或树结构的优先级队列算法中,例如A*搜索、Dijkstra算法或其他路径规划算法。可能的原因包括: - **优先级队列为空**:在尝试提取最低优先级节点时,优先级队列中没有任何元素[^3]。 - **初始化问题**:未正确初始化优先级队列或其内部数据结构。 - **逻辑错误**:算法逻辑中可能存在缺陷,导致某些节点未被正确插入或更新。 #### 2. 解决方案 以下是几种可能的解决方案: ##### (1) 检查优先级队列的状态 确保在执行提取操作之前,优先级队列中至少包含一个节点。可以通过以下代码片段验证队列状态: ```python if not priority_queue: raise ValueError("Priority queue is empty") ``` ##### (2) 初始化检查 确认优先级队列是否已正确初始化,并且所有必要的节点均已插入。例如,在使用`heapq`库时,确保初始列表为空或包含有效元素: ```python import heapq priority_queue = [] heapq.heappush(priority_queue, (priority, node)) ``` ##### (3) 调试路径规划逻辑 如果错误发生在路径规划算法中,需仔细检查以下部分: - **启发式函数**:确保启发式函数返回的值合理且非负。 - **节点更新逻辑**:验证是否正确更新了节点的优先级和父节点信息。 ##### (4) 日志记录与调试 通过日志记录工具跟踪优先级队列的状态变化,以便定位问题根源。例如: ```python import logging logging.basicConfig(level=logging.DEBUG) logging.debug(f"Current priority queue: {priority_queue}") ``` #### 3. 示例代码 以下是一个简单的A*算法实现,展示了如何避免“No lowest priority node found”错误: ```python import heapq def a_star(start, goal, neighbors_fn, heuristic_fn): open_set = [] heapq.heappush(open_set, (0, start)) # 初始节点入队 came_from = {} g_score = {start: 0} while open_set: current_priority, current_node = heapq.heappop(open_set) if current_node == goal: return reconstruct_path(came_from, current_node) for neighbor in neighbors_fn(current_node): tentative_g_score = g_score[current_node] + 1 # 假设每步代价为1 if neighbor not in g_score or tentative_g_score < g_score[neighbor]: came_from[neighbor] = current_node g_score[neighbor] = tentative_g_score f_score = tentative_g_score + heuristic_fn(neighbor, goal) heapq.heappush(open_set, (f_score, neighbor)) raise ValueError("No path found") # 如果无解,则抛出异常 def reconstruct_path(came_from, current): total_path = [current] while current in came_from: current = came_from[current] total_path.append(current) return total_path[::-1] ``` #### 4. 结合引用内容的思考 虽然引用内容主要涉及模仿学习和硬件系统设计,但可以从算法优化的角度借鉴其思想。例如,通过动作分块减少任务的有效视界[^2],类似地,在路径规划中可以将复杂问题分解为多个子问题,从而降低错误发生的概率。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值