Java args和==行为混淆[重复]

tvmytwxo  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(91)

此问题已在此处有答案

How do I compare strings in Java?(23答案)
What is Java String interning?(8个回答)
String comparison and String interning in Java(3个答案)
3天前关闭。
此帖子已于2天前编辑并提交审核,未能重新打开帖子:
原始关闭原因未解决
我是Java新手。我理解我们应该使用.equals来进行字符串比较,而不是==运算符。我无法理解下面的argskey在比较方面的行为。这两个变量都是String数组,第一个元素是qwerty

class Main {
    public static void main(String[] args) {
        String[] key = {"qwerty"};
        String obj = "qwerty";
        System.out.println(args[0] == "qwerty"); // false, why?
        System.out.println(args[0] == key[0]); // false, why
        System.out.println(key[0] == "qwerty"); // true, okay
        System.out.println(obj == "qwerty"); // true, okay
        System.out.println(obj == key[0]); // true, okay
        System.out.println(obj == args[0]); // false, why?
    }
}

如果将qwerty作为参数传递给程序,我希望所有qwerty检查都为真
注意:在我理解了原因之后,我编辑了这个问题,以更多地关注 * 实习 * 方面,而不是==equal比较的细微差别。我们在其他问题中的大多数答案都强调了后者,很少有地方讨论实习是关键概念。所以这个问题并不是关于如何在Java中进行字符串比较。它涉及到一个不同的概念。

pkwftd7m

pkwftd7m1#

不是所有条件都返回true的原因如下。
在Java中,需要使用String.equals方法来比较两个字符串的内容。
==运算符不用于String比较,除非您要确定两个String对象是否相同,这并不常见。
Comparing Strings and Portions of Strings (The Java™ Tutorials > Learning the Java Language > Numbers and Strings)
我相信,对于某些局部值,您获得true的原因是因为在Java中,通俗地称为interning
这里有一个相关的StackOverflow问题。
我想象实习是为了减少内存消耗,因为从统计学上讲,String值有很高的概率是相同的。
因此,从本质上讲,JVM只是返回堆中String的引用,而String恰好具有相同的值。
而不是用相同的值存储一个新的String值。
也就是说,您与args的比较产生false的原因很可能是因为JVM不再访问该池。
因此,尽管String的值相同,但实际对象却不同。

acruukt9

acruukt92#

在java中,文字字符串和变量字符串是不同的。
示例:

class HelloWorld {
    public static void main(String[] args) {
        String x = "a";
        String y = "a";
        String z = new String("a");  
        System.out.println(x == y);   // true
        System.out.println(z == y);   // false
    }
}

编译器为xy分配相同的地址;为z分配新地址。因此,当您使用==比较两个对象时,会比较地址。为了避免灾难,开发团队将避免对String使用比较运算符。有很多方法可以进行比较。请跟随他们。Good Read

相关问题