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

avatar
作者
筋斗云
阅读量:0

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

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

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());     }

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

#输入 tokens=["2","1","+","3","*"] #输出 9

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

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方法。

于是我将代码修改成

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?

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!