2013-10-22 18 views
-2

情况:女朋友的Java老师说以下陈述是相同的。与此同时,一本Java书推荐了后一种形式。字符串对象地址可能的问题?

String a = new String("Hi"); 

String b = "Hi"; 

然后a.equals(b),和世界很好。

然而,我的Java文本和C知识严肃告诉我,因为a==b以及a.equals(b),如果a改变(不太可能在String,但如果它得到无论如何突变,因为它可能是能够通过以某种方式解决即使JVM不会停止)然后b也将被改变。因此,假设b.equals("Hi")可能是危险的。

任何见解? b的声明是否真的很安全,或者只是在RAM上轻很多?

我不是在问有什么不同。我知道b可能引用了在a中创建的相同对象。

+1

不要担心RAM。理解这两个声明之间的区别。 –

+0

十六进制,我指的是列出的问题没有的东西:如果字符串以某种方式发生变异,那么该怎么办?字符串是不可改变的,但是核心字符串可能会以某种方式被覆盖... – Aviator45003

+2

@ T.C .:也可能有宇宙射线穿过你的内存并改变一点,最好得到ECC内存。 /秒。但严重的是,您不必担心字符串在内存中发生变化 – Craig

回答

2

然而,我的Java文本和C知识严肃告诉我,因为== B中以及a.equals(b),如果被改变(不太可能在一个字符串,但如果它无论如何都会发生变异,因为它可能以某种方式传递地址,即使JVM不会停止),那么b也会被更改。因此,假设b.equals(“Hi”)可能是危险的。

这是绝对这是安全的,因为String s不能被突变的情况。如果不使用JNI或者某些特殊标记的“不安全”API,不可能“以某种方式传递地址,即使JVM不会停止”,在这种情况下,您可以破坏所有内容,所有投注都无法使用,这就是为什么那些API很少使用,并且非常谨慎。 (简而言之,对于99.99%的Java程序来说这不是一个问题。)

如果a == bab可变对象的引用,然后通过突变a称为绝对影响b以及该对象。但String s不可变,这就是为什么像interned literals这样的东西对于String s是安全的。

3

当您使用字符串文本字符串可以interned即这样的: -

String b = "Hi"; 

但是当你用new String("Hi")你得到一个新的字符串对象。

所以

String s1 = new String("hi"); 
String s2 = new String("hi"); 
System.out.println(s1 == s2); // False 

是声明对于B真的安全

至于我,当你使用字符串表示的文字串可以interned

实习串品牌一些字符串处理任务更多时间 - 或 节省空间,但需要更多时间创建或实施字符串 。不同的值存储在字符串实习生 池中。

+0

如果实习生发生突变,该怎么办? – Aviator45003

+2

@ T.C .:字符串是不可变的。我们不要谈论我们对实习生所做的事情...... – StriplingWarrior

+0

@StriplingWarrior +1值得 – Craig

0

这些陈述并不完全等同。 a引用了另一个对象,因为您询问它(又名new)。 a==b将评估为false

但是a等于b,并且ab引用的对象不能更改。

你不能在Java中改变字符串。尝试(使用JNI或其他)会让你陷入严重的麻烦。

相关问题