String a = "test";
String b = "whatever";
String c= "test";
System.out.println(a == c); //true
我认为这打印为true,因为字符串是不可变的,因此这些字符串是相同的,因此Java会将c
指向a
在内存中的位置。
String a = "test";
String b = "whatever";
String c= new String("test");
System.out.println(a == c); //false
我假设通过调用new
运算符,Java必须分配新的内存,因此它不能选择指向a
。
我的问题是:
String d="a";
d="rbf";
d="ergfbrhfb";
d="erhfb3ewdbr";
d="rgfb";
//...
d
的中间分配的内存分配情况如何? d="abc"; d="rfb";
)d
的每次更改分配了新内存? 答案 0 :(得分:3)
在上一个示例中,没有内存分配或释放内存,字符串常量永久保留在字符串池的内存中,变量d
将被赋予对这些字符串的不同引用。
答案 1 :(得分:3)
关于d?
的中间分配的内存分配情况如何?
由于赋值都是String文字,因此这些文字被编译到类中。基本上,文字字符串的处理方式与动态字符串(如用户输入)略有不同。
如果后续作业的字符数相同,此答案是否会改变? (即,d =“abc”; d =“rfb”;)
没有。在加载类时,字符串文字全部作为单独的对象实现。即使分配来自用户输入,答案仍然是否定的。 String
的实例是不可变的。意味着不允许更改String的封装表示。因此,如果String例如是char[]
,则不允许任何操作更改char[]
的元素。
是否为d?
的每次更改分配了新内存
不,再次,因为赋值是字符串文字,而不是字符串或任意输入数据的new
个实例。
如果是这样,为每个作业分配的内存何时再次空闲?
理论上,如果要通过销毁ClassLoader来“卸载”Class,那么也许可以对被加入的文字进行GCed。