Java 来自终端的奇怪行为输入

Java input from terminal strange behavior

我有以下代码,除了命令行参数外,它可以工作,每次我写 "Insertion" 它都不会进入 if 语句,所以输出将是 "Algorithm not found. Use: [ Insertion | Merge ]"

  public static void main(String[] args) throws IOException, InsertionAndMergeException, Exception {
    if( args.length < 2 ) {
      System.out.println("Use: <path> <algorithm> ");
      System.exit(1);
    }

    if(args[1] == "Insertion" || args[1] == "Merge"){

      testWithComparisonFunction(args[0], args[1], new RecordComparatorIntField());

    }else
      System.out.println("Algorithm not found. Use: [ Insertion | Merge ]");
  }  

我在命令行输入这个,我做错了什么?

java insertionandmergeusagejava/InsertionAndMer
geUsage "/home/zenoraiser/Scrivania/Università/Secondo Anno/Algoritmi/1718/LAB/Progetto/Integers.txt" "Insertion"

如果您将 if 语句更改为

,您会将 ==.equals 混淆
if ("Insertion".equals(args[1]) || "Merge".equals(args[1])) {

您应该会得到预期的结果。

在Java中,==运算取LHS值并直接与RHS值进行比较,这对于int、[=16=等基本类型是没问题的]] 等。但字符串有点不同。因为 String 实际上是一个字符数组,它存储为 Object,因此 == 运算符会将 指针 与 LHS/RHS 进行比较(在这种情况下不相等)。

您可以使用如下代码观察到看似奇怪的行为:

String a = "Test.";
String b = "Test.";
System.out.println(a == b); // true
System.out.println(a.toLowerCase() == b.toLowerCase()); // false

这是由于一个称为 "String interning" 的过程,它有效地将多个字符串存储在同一个指针下,同时它们具有相同的值。

另请注意,通过将字符串字面量放在比较的第一位,如果 args[1] 为 non-existent,则可以消除 NullPointerException 的可能性。