我在接受采访时被问到为什么String是不可变的
我这样回答:
当我们在java中创建一个字符串时,
String s1="hello";就会在字符串池(hello)中创建一个对象,而s1将指向hello.如果我们再这样做,String s2="hello";那么将不会创建另一个对象但s2将指向,hello因为JVM将首先检查如果字符串池中存在相同的对象. 如果不存在则只创建一个新对象,否则不创建.
现在,如果假设Java允许串可变那么如果我们改变S1到hello world那么S2价值也将hello world因此Java字符串是不可改变的.
如果我的答案是对还是错,请问任何人可以告诉我吗?
我目前正在尝试深入研究Java虚拟机的规范.我一直在网上阅读JVM内容,有一个令人困惑的抽象,我似乎无法理解:Constant Pool.这是本书的摘录:
对于它加载的每种类型,Java虚拟机必须存储常量池.常量池是类型使用的有序常量集,包括文字(字符串,整数和浮点常量)以及对类型,字段和方法的符号引用.常量池中的条目由索引引用,非常类似于数组的元素.因为它包含对类型使用的所有类型,字段和方法的符号引用,所以常量池在Java程序的动态链接中起着核心作用
关于上述内容和CP,我有几个问题:
.class每种类型的文件中?When creating a String in Java, what is the difference between these two:
String test = new String();
test = "foo";
Run Code Online (Sandbox Code Playgroud)
and
String test = "foo";
Run Code Online (Sandbox Code Playgroud)
When do I need to use the keyword new? Or are these two basically the same and they both create a new String object?
我在这篇文章中做了相同的测试: new String()vs literal string performance
意思是我想测试哪一个性能更好.正如我所料,结果是文字的分配更快.我不知道为什么,但我做了测试与一些更多的任务,我发现了一些奇怪:当我让程序做循环分配超过10000次的文字是相对没有那么多比少超过10000级更快的任务.并且在重复1.000.000时,它甚至比创建新对象更慢.
这是我的代码:
double tx = System.nanoTime();
for (int i = 0; i<1; i++){
String s = "test";
}
double ty = System.nanoTime();
double ta = System.nanoTime();
for (int i = 0; i<1; i++){
String s = new String("test");
}
double tb = System.nanoTime();
System.out.println((ty-tx));
System.out.println((tb-ta));
Run Code Online (Sandbox Code Playgroud)
我让它像上面写的那样运行.我只是在学习Java,而我的老板让我做测试,在我提出测试结果后,他让我找到答案,为什么会这样.我在谷歌或stackoverflow上找不到任何东西,所以我希望有人可以帮助我.
factor at 1 repetition 3,811565221
factor at 10 repetitions 4,393570401
factor at 100 repetitions 5,234779103
factor at 1,000 repetitions 7,909884116
factor at 10,000 repetitions 9,395538811
factor at 100,000 …Run Code Online (Sandbox Code Playgroud)