Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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_Pointers - Fatal编程技术网

Java 字符串对象地址可能的问题?

Java 字符串对象地址可能的问题?,java,string,pointers,Java,String,Pointers,情境:女友的Java老师说下面的陈述是等价的。同时,一本Java书籍推荐后一种形式 String a = new String("Hi"); String b = "Hi"; 那么a等于b,世界就好了 然而,我的Java文本和C知识严肃地告诉我,既然a==b以及a.equals(b),如果a发生了变化(不太可能在字符串中发生变化,但是如果它发生了任何变化怎么办,因为它可能以某种方式传递地址,即使JVM也不会停止)然后b也将被更改。因此,假设b.equals(“Hi”)是危险的 有什么见解吗?

情境:女友的Java老师说下面的陈述是等价的。同时,一本Java书籍推荐后一种形式

String a = new String("Hi");

String b = "Hi";
那么a等于b,世界就好了

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

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


我不是问有什么区别。我知道当您使用字符串时,
b
可能引用了在
a

中创建的同一对象文字字符串可以是这样的:-

 String b = "Hi"; 
但是当您使用
newstring(“Hi”)
时,您会得到一个新的String对象

所以

b的声明真的安全吗

正如我所说,当您使用字符串时,文本字符串可以是

保留字符串会使某些字符串处理任务花费更多的时间或时间 节省空间,但在使用字符串时需要更多时间 创建或实习。不同的值存储在字符串intern中 游泳池

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

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


如果
a==b
a
b
是对可变对象的引用,那么对
a
引用的对象进行变异也绝对会影响
b
。但是
String
s是不可变的,这就是为什么像interned literal这样的东西对于
String
s来说是安全的。

这些语句并不是真正等价的<代码>a
引用了b以外的另一个对象,因为您需要它(即您调用的
new
a==b
将计算为
false

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


您永远不能在Java中对字符串进行变异。尝试这样做(使用JNI或任何东西)会给您带来严重的麻烦。

不要担心RAM。理解这两个声明之间的区别是什么。hex,我指的是列出的问题没有提到的东西:如果字符串以某种方式发生变异,该怎么办?字符串是不可变的,但核心字符串可能会以某种方式被覆盖…@T.C.:也可能有宇宙射线穿过你的内存并发生一些变化,最好获得ECC内存/s但是说真的,你不必担心字符串在内存中会被更改。字符串是不可变的。值得注意的是,字符串的插入取决于单个编译器(或JVM?),因此
a==b
不是一种保证的行为。我似乎记得,目前的典型实现是自动插入少于128个字符的字符串。之后,
a!=b
。最好总是习惯使用.equals(),并从一开始就避免麻烦。如果实习生发生变异怎么办?@T.C.:字符串是不可变的。让我们不要谈论我们对实习生做了什么…@StriplingWarrior那是+1worthy@T.C.:-添加到它。事情再简单不过了,你为什么还要自找麻烦呢!
String s1 = new String("hi");
String s2 = new String("hi");
System.out.println(s1 == s2);  // False