我在下面这段代码中遇到了麻烦.Values和minStack都是初始化的堆栈,两个堆栈的顶值是相同的.然而,第一个代码片段没有进入if条件,而后者进入了.我无法对此进行调试.

   public void pop() {

        System.out.println(values.peek()); // prints -1024
        System.out.println(minStack.peek()); // prints -1024

        if(values.pop() == minStack.peek()) { 
        // Condition not fulfilled
            minStack.pop();
        }
    }

然而,下面的工作与预期的一样.

    public void pop() {
        int valTop = values.pop();
        int minTop = minStack.peek();

        if(valTop == minTop) { 
             minStack.pop();
        }   

    }

我搞不懂背后的道理,请帮帮忙.

推荐答案

您(可能)将堆栈初始化为Stack<Integer>,这意味着它们存储Integer实例.整数是一个对象(请注意大写的I),使用==比较两个对象实例会比较它们在内存中的地址.不是你想要的.new Integer(1) != new Integer(1),因为您创建的两个对象显然不指向相同的内存地址.

另一方面,使用==比较两个原语时,比较的是它们的值,而不是它们的地址.

您可能希望将堆栈初始化更改为Stack<int>,但(目前)还不能这样做,因为Java中的泛型不能是原始的.

要解决此问题,请在Integer中使用Overriden .equals(Object obj)方法,该方法在两个Integer对象上调用.intValue()并实际比较两个整数.

所以,换掉

if(values.pop() == minStack.peek())

使用

if(values.pop().equals(minStack.peek()))

第二个示例之所以有效,是因为当您将Integer对象赋给int类型的变量时,Integer会自动转换为int.相反的,也可以通过自动装箱的过程来完成.

Java相关问答推荐

如何在返回bigint []值的子查询中使用any?

Java记录的不同序列化/反序列化

关于泛型的覆盖规则

为什么Java Annotation接口覆盖对象类中的方法

为什么S的文档中说常量方法句柄不能在类的常量池中表示?

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

JOOQ中的子查询使用的是默认方言,而不是配置的方言

Spring Boot中的应用程序.properties文件中未使用的属性

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

FETCH类型设置为LAZY,但它仍会发送第二个请求

在应用程序运行时更改LookAndFeel

在线程Java中调用Interrupt()之后调用Join()

Java HashMap保留所有时间复杂性

如何制作回文程序?

为什么没有加载java.se模块?

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

URI构造函数错误?

什么是;u〃;平均值;jdku;在java开发工具包中?

Jackson YAML:支持锚点扩展/覆盖