Java中字符串的==和equals方法。力扣150题。逆波兰表达式求值。

今天在刷力扣第150题目的时候。使用到了字符串内容的比较。

在IDEA中我编写的代码是这样的。

java 复制代码
public static int evalRPN(String[] tokens) {
        Deque<String> dq=new ArrayDeque<>();
        int len=tokens.length;
        for(int i=0;i<len;i++){
            if(tokens[i]!="+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i]!= "/"){
                dq.push(tokens[i]);
            }else if(tokens[i]=="+"){
                dq.push(String.valueOf(Integer.parseInt(dq.pop())+Integer.parseInt(dq.pop())));
            }else if(tokens[i]=="-"){
                dq.push(String.valueOf(-(Integer.parseInt(dq.pop())-Integer.parseInt(dq.pop()))));
            }else if(tokens[i]=="*"){
                dq.push(String.valueOf(Integer.parseInt(dq.pop())*Integer.parseInt(dq.pop())));
            }else if(tokens[i]=="/"){
                int k=Integer.parseInt(dq.pop());
                int l=Integer.parseInt(dq.pop());
                dq.push(String.valueOf(l/k));
            }
        }
        return Integer.parseInt(dq.pop());
    }

字符串比较的时候使用的是"=="运算符,结果运行通过,测验也能得到正确的结果

java 复制代码
#输入
tokens=["2","1","+","3","*"]
#输出
9

但是我将它复制到力扣中去,编译就不通过了。报以下的错误。

java 复制代码
java.lang.NumberFormatException: For input string: "*"
  at line 67, java.base/java.lang.NumberFormatException.forInputString
  at line 647, java.base/java.lang.Integer.parseInt
  at line 777, java.base/java.lang.Integer.parseInt
  at line 20, Solution.evalRPN
  at line 56, __DriverSolution__.__helper__
  at line 86, __Driver__.main

可以看到错误是,最后将尝试将"*"转换成int类型而报错,这就证明栈顶的元素是"*",整个栈只进行了入栈操作,而并没有出栈。

通过了解,我得知,在Java中,String的"=="运算符是用来**比较两个对象的引用是否相等(对于其他引用对象类型也一样)。**而如果要比较两个String的值是否相同,要使用equals方法。

于是我将代码修改成

java 复制代码
public int evalRPN(String[] tokens) {
        Deque<String> dq=new ArrayDeque<>();
        int len=tokens.length;
        for(int i=0;i<len;i++){
            if(!tokens[i].equals("+") && !tokens[i].equals("-") && !tokens[i].equals("*") && !tokens[i].equals("/")){
                dq.push(tokens[i]);
            }else if(tokens[i].equals("+")){
                dq.push(String.valueOf(Integer.parseInt(dq.pop())+Integer.parseInt(dq.pop())));
            }else if(tokens[i].equals("-")){
                dq.push(String.valueOf(-(Integer.parseInt(dq.pop())-Integer.parseInt(dq.pop()))));
            }else if(tokens[i].equals("*")){
                dq.push(String.valueOf(Integer.parseInt(dq.pop())*Integer.parseInt(dq.pop())));
            }else if(tokens[i].equals("/")){
                int k=Integer.parseInt(dq.pop());
                int l=Integer.parseInt(dq.pop());
                dq.push(String.valueOf(l/k));
            }
        }
        return Integer.parseInt(dq.pop());
    }

这就成功通过运行了。

至于为什么使用"=="在idea中也能实现比较字符串内容的原因,大概是因为idea内置了优化把,自动将它识别成了equals?

相关推荐
AC赳赳老秦15 分钟前
司法公开数据采集应用:OpenClaw 抓取裁判文书公开信息,批量整理同类参考案例
java·大数据·python·数据挖掘·数据分析·php·openclaw
笑小枫21 分钟前
用 Claude Code 推翻重写笑小枫网站
java·人工智能·spring boot·ai编程
霸道流氓气质34 分钟前
ApiPost 中配置自动获取 Token 并调用业务接口完整指南
java·服务器·数据库
独隅1 小时前
IntelliJ IDEA 接入多种AI大模型插件终极指南(2026.1 企业合规版)
java·人工智能·intellij-idea
还是奇怪1 小时前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
zfoo-framework2 小时前
1.ansible安装 2.虚拟机克隆
java
码上解惑2 小时前
从 Dify 工作流说起:常用节点怎么选、怎样组合?
java·人工智能·ai·agent·dify·智能体·spring ai
青山木3 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
程序员-珍3 小时前
报错下载android sdk失败
android·java
糖果店的幽灵3 小时前
langgraph分支之 - 动态分支(Dynamic Branch)
java·前端·javascript·人工智能·langgraph