Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 字符串foo=";酒吧;vs.String foo=Android中的新字符串(“bar”)?_Java_Variables - Fatal编程技术网

Java 字符串foo=";酒吧;vs.String foo=Android中的新字符串(“bar”)?

Java 字符串foo=";酒吧;vs.String foo=Android中的新字符串(“bar”)?,java,variables,Java,Variables,我确实搜索过这个,但关键词必须太过通用,无法缩小相关的范围。为什么在android中声明字符串的两种方法都是有效的?有什么区别吗 使用new关键字创建一个新的字符串对象,其中使用foo=“bar”将被优化,以指向应用程序中不同位置使用的相同字符串对象 对于instacne: String foo = "bar"; String foo2 = "bar"; 编译器将优化上述代码,使其成为相同的精确对象[foo==foo2,并将其转换为foo.equals(foo2)] 编辑:经过一些搜索,@Su

我确实搜索过这个,但关键词必须太过通用,无法缩小相关的范围。为什么在android中声明字符串的两种方法都是有效的?有什么区别吗

使用
new
关键字创建一个新的字符串对象,其中使用
foo=“bar”
将被优化,以指向应用程序中不同位置使用的相同字符串对象

对于instacne:

String foo = "bar";
String foo2 = "bar";
编译器将优化上述代码,使其成为相同的精确对象[
foo==foo2
,并将其转换为
foo.equals(foo2)
]

编辑:经过一些搜索,@Sulthan是对的。这不是编译器依赖的问题,而是:

字符串文字总是指类的同一实例(§4.3.1) 绳子


这是java语法,不仅仅针对Android。下面是关于这一点的讨论

这不仅仅是关于安卓的,也是关于Java的

当您编写
“xxxx”
时,它是一个文本字符串。这是一个字符串实例。请注意,具有相同值的所有文字字符串都是相同的实例。有关详细信息,请参见方法
String.intern()

例如:


String s1 = "abc";
String s2 = "abc";

String s1 = "abc";
String s2 = new String("abc");
在本例中,
s1==s2
为真

新字符串(“xxx”)
是一个复制构造函数。获取一个字符串(文本)并从中创建一个新实例。因为所有字符串都是不可变的,所以这通常是您不想做的事情

例如:


String s1 = "abc";
String s2 = "abc";

String s1 = "abc";
String s2 = new String("abc");
s1.等于(s2)
为真
s1==s2
为false

String x = new String( "x" )
有效地创建2个字符串。一个用于文本(这是一个没有变量名的表达式),另一个保留为x。这与:

String x;
{
  String a = "x";
  x = new String( a );
}

它们是一样的。我建议检查一下:我们基本上是在实例化String对象的一个新实例。字符串是不可变的,所以我怀疑这没有什么区别。您可以检查每个生成的字节码,看看是否有任何差异。可能应该作为感谢链接的副本关闭,并为重复问题道歉。我花了10分钟试图在投稿前找到类似的Q,但是有太多的结果要滚动,很多都是C++和iOS相关的。这就是我想要的:“您很少会想使用新的字符串(另一个字符串)构造函数。从API…”这不是由编译器决定的。这种行为是严格定义的。@Sulthan:你能为这句话提供一些参考吗?我在规范中没有看到它,但是如果可以提供的话,我很乐意修改我的答案。
String.intern()的文档。
所有的文字字符串和字符串值常量表达式都被替换了
@Sulthan:你说得对,我在规范中找到了它。编辑了我的答案。谢谢你的评论。