Java 为什么某个布尔值应该是真的却为假?

Java 为什么某个布尔值应该是真的却为假?,java,Java,我写了一个Java程序,应该支持英语和德语。如果设置了一个参数,且该参数等于英语或英语,则该参数应调用一个执行英语版本的方法;如果没有参数或该参数不等于英语或英语,则该参数应调用德语版本的方法。 但是,无论我的参数是什么,args[0]==english | | args[0]==english都是false,即使它应该是true,我也不明白为什么会这样 这里是主要的方法,其他的方法都不重要,所以我将把它们放在一边 public static void main(String[] args){

我写了一个Java程序,应该支持英语和德语。如果设置了一个参数,且该参数等于英语或英语,则该参数应调用一个执行英语版本的方法;如果没有参数或该参数不等于英语或英语,则该参数应调用德语版本的方法。 但是,无论我的参数是什么,args[0]==english | | args[0]==english都是false,即使它应该是true,我也不明白为什么会这样

这里是主要的方法,其他的方法都不重要,所以我将把它们放在一边

public static void main(String[] args){
boolean input=args.length==1;
System.out.println(input);
boolean mode = false;
if (input) mode=args[0]=="English"||args[0]=="english";
System.out.println(mode);
if(input&&mode) english();
else german();
}
有人知道为什么不管我的参数如何,它都不会为真吗?

使用equals方法进行字符串值比较

args[0].equals("English")||args[0].equals("english")
在这个案子里甚至更好

args[0].equalsIgnoreCase("English")

==用于对象引用比较。不要将其用于比较值。

字符串不应与==进行比较,而应与equals方法进行比较。 使用

它会比较英语和英语

更好的版本是

"English".equalsIgnoreCase(args[0]);
这将确保,如果args[0]为null,即在您的案例中没有参数,它将不会抛出NPE


解释:因为在Java中,==比较没有值的对象,即两个引用是否持有相同的对象。对象内容与对象类的equals方法进行比较,字符串类将覆盖该方法。

在Java中不能用这种方式比较字符串,因为Java机器会比较指向字符串对象的指针。要正确使用函数等于:


println调用是不必要的,我只是把它们放在那里,以了解为什么从不调用english方法。不要将字符串与==进行比较此问题有一个额外维度未包含在:locales中。对于自然语言比较,应使用排序API。
"English".equalsIgnoreCase(args[0]);
if( "english".equalsIgnoreCase( args[0] ) ) {
    // English language
}