在寻找有关逻辑相等如何==在Java中工作的解释时,答案总是类似于以下内容:
但是这些解释似乎都暗示着这是两个不同的事物,它们的==行为根据您是否要比较对象还是原始而有所不同。在我看来,它们实际上必须是完全相同的东西:从堆栈中获取两个变量并比较它们的值。
变化的不是==它的行为,而是它所比较的值所代表的含义。如果您要比较的东西是基元,那么堆栈上的值就是基元本身的值。如果要比较对象,则堆栈上的值就是引用的值(因此就是堆上对象的地址)。
我是否误解了某些东西,或者==在所有情况下实际上都表现相同?奖励积分是,如果您可以指向我了解如何在幕后真正发挥作用的文档。
我的理解是像 ParallelGC 和 G1 这样的 GC 是“分代”收集器。垃圾收集几乎是作为副产品发生的,因为您将所有活动对象移动到新的堆区域,而旧区域中剩余的任何内容都将被简单地覆盖。这种“副产品”的解释很有意义,除了 Java 需要在死对象上调用 finalize() 的部分。Java 是否还保留每个堆区域中所有对象的单独列表,以便与活动对象进行比较?