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使用了新的字符串(…)”