java在以下声明中有所不同
我无法识别以下Java中字符串声明的区别
假设我有两根绳子
String str1="one";
String str2="two";
两者的区别是什么
String str3=new String(str1+str2);
及
String str3=str1+str2;
在上述两个声明中,str3
的内容将是onetwo
假设我创建了一个新字符串
String str4="onetwo";
那么在上述声明中
if(str4==str3) {
System.out.println("This is not executed");
}
为什么str3
和str4
不是指同一个对象
# 1 楼答案
因为Java中的
String
是不可变的,所以编译器将优化和重用String
文本。因此有关参考资料,请参见http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5
# 2 楼答案
Java没有“这个变量如何得到值”的内存,因此,如果结果相同,那么使用哪种方法并不重要
关于比较,如果将字符串与
==
进行比较,则是在比较内存中对象的地址,因为字符串不是基本数据类型,也不是值。你必须使用if(str4.equals(str3))
# 3 楼答案
字符串有点棘手,因为需要一些努力来共享它们的表示。而且它们是不可变的。 简单的回答是:除非你真的在低级别工作,否则你永远不应该使用“==”来比较字符串 即使它对你有用,但对你的队友来说,维持它也是一场噩梦
要获得更长的答案和一点乐趣,请尝试以下方法:
您会注意到,由于编译器努力共享,s1==s2。 然而s2!=s3,因为您明确要求输入一个新字符串。 你不太可能用它做任何聪明的事情,因为它是不变的
# 4 楼答案
str1 + str2
对于非编译常量字符串,将编译成new StringBuilder(str1).append(str2).toString()
。这个结果不会被放入字符串池,也不会从字符串池中获取(插入字符串的位置)在
"foo"+"bar"
的情况下,情况就不同了,编译器知道使用哪些值,所以他可以将这个字符串连接一次,以避免在运行时使用它。这种字符串文字也将被拘留所以
String str3 = str1+str2;
与和
String str3 = new String(str1+str2);
相同同样,作为方法(比如
substring
,replace
,toString
)的结果生成的字符串不会被占用这意味着您正在比较两个不同的实例(存储相同的字符),这就是为什么
==
返回false