line = reader.readline() 结果与文字 "F" 的行为不同

line = reader.readline() result does not behave same as a literal "F"

我试图首先使用 Jeff Langr 的敏捷一书中描述的技术开发命令行界面测试 Java,但我不明白为什么:

行=reader.readline();结果与我代码中的文字 "F" 不同。

这行得通...漫游车前进到 1:

private void goForward() {
        rover.move("F");
    }

这不起作用...流动站保持在 0:

private void goForward() throws IOException {
    StringBuffer input = new StringBuffer();
    input.append(line("F"));
    byte[] buffer = input.toString().getBytes();
    InputStream inputStream = new ByteArrayInputStream(buffer);
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
    BufferedReader reader = new BufferedReader(inputStreamReader);  
    String line = reader.readLine();
    rover.move(line);
}

private String line(String str) {
    return String.format("%s%n", str);
}

我能想到的都做了:

我加了几个

System.out.println(line);

查看前后行的值,一切正常。

但外表可能会骗人,所以我添加了一个

if(line.equals("F"))

认为这会证明它们实际上是不同的,但它的计算结果为 True

并花了几个小时使用我的调试器、Java文档和搜索 Internet。一路上我学到了很多东西,但无法解释正在发生的事情。

如有任何帮助,我们将不胜感激。我确信我遗漏了一些像我这样的新手会遇到的细微差别。谢谢。

好的,看完你的评论,我有一个更好的答案......(第一个完全错误,抱歉):

永远不要通过 == 比较字符串,因为只有当它是相同的 OBJECT(而不是相同的 STRING)时才会如此。使用 equals().

它只适用于常量 "F",因为编译器采用所有常量 "F" 并为它们使用相同的字符串。但是一旦你有一个动态字符串,在运行时来自 "outside",它将是一个完全不同的对象,== 将为 FALSE,而 equals 将为 TRUE。

String x = "F";
// Might be true, because the compiler will use ONE object 
// for both instances of "F". It's still bad and should not be done.
boolean isF = x == "F";

String y = new Scanner(System.in).nextLine();
// Will NEVER be true, even if you entered "F", because
//  y will always be a NEW String object...
isF = y == "F"; 
// Will be true, if you entered "F"
isF = "F".equals(y);