0

考虑以下代码:

public static void main( String args[] ) throws Exception{

        String  a = "sharmaji";

        String b = args[0];

        System.out.println(a==b);

}

现在,如果我将命令行参数作为“sharmaji”传递,那么 a==b 返回 false。这表明 java 使用 new String(...) 参数来创建字符串。

是因为java必须将用户输入读取为字节,然后将其转换为字符串吗?

4

2 回答 2

1

这是因为从命令行参数创建的字符串是在其中创建的runtime,编译器对它们一无所知(哪些值将传递给程序)。

考虑示例 3.10.5-1。JLS 的字符串文字,用于更好地理解 Java 如何使用其内部字符串“缓存”。

于 2013-06-06T09:02:41.513 回答
0

您传递的参数是一个运行时值,并在堆中创建为 new Object ,但是

String a = "sharmaji"; 是一个编译时间常数,并被放入字符串字面量池中。

想想每当你通过命令行传递任何字符串时,它就会像这样发生 -

String args[]={"sharmaji","namaste"};

然后它会像 -

args[0]=new String("sharmaji");

args[1]=new String("namaste");

因此创建了新对象,因此它的引用不能与您使用==运算符检查的相同。

但是看到这个案例

public class TestEx {

    public static void main(String... args) {

        String s="asd";
        String s1[]={"asd","asd1"};
        if(s1[0]==s)
        {
                   System.out.println("true");
                }
                else
                   System.out.println("false");

        }
}

由于这里数组的值是在编译时初始化的,所以“asd”的引用是相同的s1[0] and s,打印TRUE

于 2013-06-06T09:10:28.247 回答