为什么他们决定在Java和.NET(以及其他一些语言)中使字符串不可变?他们为什么不让它变得可变?
我正在审查Sun认证研究指南,并且有一篇描述最终修饰符的段落.它说
"如果程序员可以自由扩展String类文明,因为我们知道它可能会崩溃"
他什么意思 ?如果可以扩展String Class ...我只是没有一个名为MyString的类继承了所有的Strings属性.如何通过仅扩展它来以任何方式更改实际的String类?
非常感谢您的回答
如果在不使用"new"关键字的情况下声明它们,则对同一对象的字符串引用,如下所示:
String s1 = "Some string";
String s2 = "Some string";
System.out.println(s1 == s2);
//prints true because
//they reference to the same object
Run Code Online (Sandbox Code Playgroud)
但是,与我的预期相反,这与数组不起作用:
char[] anArray = {'A', 'r', 'r', 'a', 'y'};
char[] oneArray = {'A', 'r', 'r', 'a', 'y'};
System.out.println("anArray == oneArray : " + (anArray == oneArray));
//prints false
Run Code Online (Sandbox Code Playgroud)
我们没有明确提到它们是"新"数组,为什么它们不引用堆上的同一个对象呢?
我希望我写这篇文章,但我只是遇到过它.它有一行代码可以读取System.out.println("meep");并打印,令人抓狂Nutn.
import java.lang.reflect.*;
import java.util.*;
public class SomethingFun {
public static void main(String[] args) throws java.lang.Exception {
doSomething("meep");
System.out.println("meep");
}
public static void doSomething(String s) throws java.lang.Exception {
Field privateStringField = String.class.getDeclaredField("value");
privateStringField.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
// This line is where the trouble is:
modifiersField.setInt(privateStringField, privateStringField.getModifiers() & ~Modifier.FINAL);
privateStringField.set(s, new char[] {'N', 'u', 't', 'n'});
}
}
Run Code Online (Sandbox Code Playgroud)
我已经收集了一些关于反思课程的内容 - 我怀疑它是以某种方式搞乱实习.有人能否了解这里发生的事情?
特别是,这条线
modifiersField.setInt(privateStringField, privateStringField.getModifiers() & ~Modifier.FINAL);
是如此令人困惑.
java ×4
.net ×1
arrays ×1
final ×1
inheritance ×1
mutable ×1
reference ×1
reflection ×1
string ×1