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

esyap4oy  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(454)

考虑以下代码:

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使用new string(…)参数来创建字符串。
是因为java必须将用户输入读取为字节,然后将其转换为字符串吗?

2nbm6dog

2nbm6dog1#

您传递的参数是一个运行时值,在堆中作为新对象创建,但是 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

xnifntxz

xnifntxz2#

这是因为从命令行参数创建的字符串是在 runtime 编译器对它们一无所知(什么值会被传递到程序中)。
考虑示例3.10.5-1。jls的字符串文本,以便更好地理解java如何使用其内部字符串“cache”。

相关问题