-2

情况:女朋友的 Java 老师说以下语句是等价的。同时,一本 Java 书籍推荐后一种形式。

String a = new String("Hi");

String b = "Hi";

然后a.equals(b),世界就好了。

但是,我的 Java 文本和 C 知识严重地告诉我,因为a==b以及a.equals(b), ifa已更改(不太可能在 a 中String,但如果它无论如何都会发生突变怎么办,因为它可能以某种方式传递地址,即使 JVM 也不会' t stop) 然后b也将被更改。因此,假设b.equals("Hi").

有什么见解吗?声明是否b真的安全,或者只是在 RAM 上轻了很多?

我不是在问有什么区别。我知道这b可能引用了在a.

4

3 回答 3

3

当您使用字符串时,可以对字符串进行实习,即:-

 String b = "Hi"; 

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

所以

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

b 的声明真的安全吗

正如我所说,当你使用字符串时,字符串可以被实习

驻留字符串使某些字符串处理任务更节省时间或空间,但代价是创建或驻留字符串时需要更多时间。不同的值存储在字符串实习池中。

于 2013-10-22T22:16:29.790 回答
2

但是,我的 Java 文本和 C 知识严重地告诉我,由于 a==b 以及 a.equals(b),如果 a 被更改(不太可能在字符串中,但如果它无论如何都会发生突变,因为它可能是可能以某种方式传递地址,即使 JVM 也不会停止)然后 b 也将被更改。因此,假设 b.equals("Hi") 可能很危险。

绝对是安全的,因为 Strings 不能被变异。如果不使用 JNI 或一些特别标记为“不安全”的 API,就不可能“以某种方式传递地址,即使 JVM 也不会停止”,在这种情况下,您可能会破坏所有内容,并且无论如何,所有的赌注都没有了,这就是为什么那些API 很少使用并且非常小心。(简而言之,这不是 99.99% 的 Java 程序关心的问题。)

如果a == bandab是对可变对象的引用,那么改变引用的对象a也绝对会产生影响b。但是Strings 不是可变的,这就是为什么像 interned literals 这样的东西对于Strings 是安全的。

于 2013-10-22T22:22:09.387 回答
0

这些陈述并不真正等同。a引用了除 b 之外的另一个对象,因为您要求它(又名您调用new)。a==b将评估为false

但是aequals和b引用的对象不能更改。ab

你永远不能在 Java 中改变字符串。尝试这样做(使用 JNI 或其他方式)会给您带来严重的麻烦。

于 2013-10-22T22:23:13.287 回答