小编use*_*368的帖子

在Java中比较两个原语和两个对象时,==实际工作是相同还是不同?

在寻找有关逻辑相等如何==在Java中工作的解释时,答案总是类似于以下内容:

  • 对于图元,它返回图元是否具有相同的值(这包括将图元与其WrapperObject进行比较,因为WrapperObject会自动取消装箱到图元)。
  • 对于对象,它返回它们是否代表堆上的相同对象。

但是这些解释似乎都暗示着这是两个不同的事物,它们的==行为根据您是否要比较对象还是原始而有所不同。在我看来,它们实际上必须是完全相同的东西:从堆栈中获取两个变量并比较它们的值。

变化的不是==它的行为,而是它所比较的​​值所代表的含义。如果您要比较的东西是基元,那么堆栈上的值就是基元本身的值。如果要比较对象,则堆栈上的值就是引用的值(因此就是堆上对象的地址)。

我是否误解了某些东西,或者==在所有情况下实际上都表现相同?奖励积分是,如果您可以指向我了解如何在幕后真正发挥作用的文档。

java primitive object equals-operator

21
推荐指数
1
解决办法
761
查看次数

如果 Java 的分代垃圾收集器遍历活动对象图,它们如何知道要对哪些对象调用 finalize()?

我的理解是像 ParallelGC 和 G1 这样的 GC 是“分代”收集器。垃圾收集几乎是作为副产品发生的,因为您将所有活动对象移动到新的堆区域,而旧区域中剩余的任何内容都将被简单地覆盖。这种“副产品”的解释很有意义,除了 Java 需要在死对象上调用 finalize() 的部分。Java 是否还保留每个堆区域中所有对象的单独列表,以便与活动对象进行比较?

java garbage-collection heap-memory finalize g1gc

5
推荐指数
1
解决办法
123
查看次数