目录
代码回显
为什么键盘录入和String直接赋值比较为false?
这里先写一串代码
package learning;
import java.util.Scanner;
public class Compare {
public static void main(String[] args) {
Scanner a = new Scanner(System.in);
String aa = a.next();
String bb = "qwer";
System.out.println(aa == bb);
}
}
我输入qwer回显为
false
这样就有一些疑惑了,这是为什么呢?
一步步寻找解释
这里我们一步步寻找答案
首先选择a.next()的next Ctrl+b
发现他是返回一个token,然后token是由getCompleteTokenInBuffer方法返回的,继续Ctrl+b跟进
发现他返回一个s,s是通过group返回的,这里继续跟进
继续跟进
选择getSubSequence继续跟进
选择subSequence继续跟进
来到了这里,但是这里没有方法体所以我们返回到上一个
选择getSubSequence右键
选择我们使用
然后选择substring继续跟进
选择newString继续跟进
好了来到最后
知道了,使用键盘录入这里他是通过new出来的
因为使用new他会在堆里面生成一个空间使用的是堆的地址值
然而我们直接赋值,他会在串池中直接生成一个字符串,返回的是串池的地址值
所以两个比较为false (这里都是自己的理解,有什么不对,希望可以提醒一下)
解决方法
使用equals
package learning;
import java.util.Objects;
import java.util.Scanner;
public class Compare {
public static void main(String[] args) {
Scanner a = new Scanner(System.in);
String aa = a.next();
String bb = "qwer";
System.out.println(aa == bb);
System.out.println(Objects.equals(aa, bb));
boolean rsu = aa.equals(bb);
System.out.println(rsu);
}
}
这里输入qwer返回
false true true