Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java是否使用新字符串(…)来创建动态字符串/命令行参数/文件IO_Java_String_Constructor_Command Line Arguments - Fatal编程技术网

java是否使用新字符串(…)来创建动态字符串/命令行参数/文件IO

java是否使用新字符串(…)来创建动态字符串/命令行参数/文件IO,java,string,constructor,command-line-arguments,Java,String,Constructor,Command Line Arguments,考虑以下代码: public static void main( String args[] ) throws Exception{ String a = "sharmaji"; String b = args[0]; System.out.println(a==b); } 现在,如果我将a命令行参数作为“sharmaji”传递,那么a==b返回false。这表明java使用新的字符串(…)参数来创建字符串 这是因为java必须将用户输

考虑以下代码:

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

        String  a = "sharmaji";

        String b = args[0];

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

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


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

这是因为从命令行参数创建的字符串是在
运行时创建的,而编译器对这些字符串一无所知(哪些值将传递到程序中)


考虑JLS,以便更好地理解Java如何使用其内部字符串“cache”。

您传递的参数是一个运行时值,并作为新对象在堆中创建,但是

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]和s
是相同的,所以打印
TRUE

a==b
在这里永远不会返回TRUE,因为它们显然是不同的对象引用,因为您刚刚为
a
分配了字符串文本。这表明java使用了新的字符串(…)”