为什么他们决定在Java和.NET(以及其他一些语言)中使字符串不可变?他们为什么不让它变得可变?
在Java中,您可以按如下方式创建枚举:
public enum Letter {
A, B, C, D, E, F, G;
static {
for(Letter letter : values()) {
// do something with letter
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题涉及"values()"方法.具体来说,它是如何实现的?通常,我可以在Eclipse中使用F3或CTRL + Click跳转到Java类的源代码(即使对于String,Character,Integer甚至Enum这样的类).可以查看其他枚举方法的来源(例如,valueOf(String)).
"values()"每次调用时都会创建一个新数组吗?如果我将它分配给局部变量然后修改其中一个元素,会发生什么(显然这不会影响values()返回的值,这意味着每次都会分配一个新数组).
它的代码是原生的吗?或者JVM /编译器是否专门处理它,只有当它无法证明它不会被修改时才从values()返回一个新实例.
String abc[]={"abc"};
String def[]={};
def=abc;
def[0]=def[0]+"changed";
System.out.println(abc[0]);
Run Code Online (Sandbox Code Playgroud)
通过更改"def"对象,我的abc对象也会被更改.String []数组旁边有哪些其他java对象具有相似特性的特性?可以解释一下吗?为了防止在我改变def时改变abc,我将不得不做def = abc.clone();