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
的可能性。
我有以下代码,除了命令行参数外,它可以工作,每次我写 "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
的可能性。