Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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字符串变量_Java_String - Fatal编程技术网

Java字符串变量

Java字符串变量,java,string,Java,String,以下字符串s1、s2、s3和s3的区别是什么: A类{ 字符串s1; 字符串s2=null; 字符串s3=“”; 字符串s4=新字符串(); … } 我已经检查了A1类包含s1,A2类包含s2等的内存分配。我发现它们消耗内存的方式不同。 而s4样式比s3占用更多内存是可以理解的。 但是s2(显式设置为null)和s1(依靠智能编译器设置为默认值)也不同! s2消耗0内存,而s1消耗一些非零内存。 为什么?每个人都说s1和s2是一样的。让我们看看 String s1; 声明一个新的字符串变量,但

以下字符串s1、s2、s3和s3的区别是什么:

A类{
字符串s1;
字符串s2=null;
字符串s3=“”;
字符串s4=新字符串();

}

我已经检查了A1类包含s1,A2类包含s2等的内存分配。我发现它们消耗内存的方式不同。 而s4样式比s3占用更多内存是可以理解的。 但是s2(显式设置为null)和s1(依靠智能编译器设置为默认值)也不同! s2消耗0内存,而s1消耗一些非零内存。 为什么?每个人都说s1和s2是一样的。

让我们看看

String s1;
声明一个新的字符串变量,但不初始化它。如果这是一个实例变量,它将被初始化为
null
,如果它是一个局部变量,编译器确保在每次使用之前至少分配一次

String s2 = null;
声明一个新的字符串变量,并使用
null
对其进行初始化。对于实例变量,这与之前的情况相同(但人类读者不必记住默认值)

声明一个新的字符串变量,并使用规范的空字符串对其进行初始化。所有此类变量将包含(例如指向)相同的字符串对象

String s4 = new String();
声明一个新的字符串变量,并用一个新的空字符串初始化它。这是一个新对象,与以前存在的任何对象都不相同。这样做几乎从来都不是一个好主意-对于所有实际使用,
s3
的情况是等效的,这会占用更多内存。如果您依赖于拥有不同的字符串对象(具有相同的内容),那么您就做错了。(我认为这个构造函数的存在也是错误的。)


通常情况下,实例变量要么在构造函数中获得合适的值(这样您就不需要在初始化它们之前进行初始化),要么获得默认值(如果这些值对于对象的使用是可接受的)。然后使用
s2
s3
(但我认为最常见的是
s2


对于局部变量,不初始化它们,或者立即使用它真正应该具有的值来初始化它们,而不是像
null
这样的伪值,通常是有用的。然后,
s1
变量将更合理。

对于您最后的观察,您可以使用“abc”.equals(s4)来避免空检查。这是一个问题社区,希望能够得到答案。这看起来更像一个博客条目,你应该运行自己的博客,而不是在这里乱扔垃圾。。。顺便说一句,对于你问的其他五个问题,你没有标记一个答案作为你问题的答案,你也没有回答其他人的一个问题。贡献多少?
String s4 = new String();