Java 字符串实习生是否在运行之间共享?
每次我运行这个程序,我想显示内存地址,它总是输出相同的结果:Java 字符串实习生是否在运行之间共享?,java,Java,每次我运行这个程序,我想显示内存地址,它总是输出相同的结果: public static void main(String[] args) throws InterruptedException { String foo = "a"; String foo2 = "a"; System.out.println(Integer.toHexString(foo.hashCode())); System.out.println(Integer.toHexString(f
public static void main(String[] args) throws InterruptedException {
String foo = "a";
String foo2 = "a";
System.out.println(Integer.toHexString(foo.hashCode()));
System.out.println(Integer.toHexString(foo2.hashCode()));
foo = "a";
foo2 = "a";
System.out.println(System.identityHashCode(foo));
System.out.println(System.identityHashCode(foo2));
Thread.sleep(1000000);
}
本文的目的是在Streams和命令式风格之间进行一些性能测试。因此,我想知道该值是否为缓存,并确定是否应该重新启动电脑或通过JConsole/JvisualVm手动运行垃圾收集。String foo2=“a”代码>
可以重用字符串常量池中的实例(如果有)
这一点可以用一个例子来证明
System.out.println(foo==foo2);
两种引用类型上的=
是引用标识比较。两个相等的对象不一定是==
它的输出true
表示foo和foo2引用相同的内存
相关问题
如果要查找对象的内存位置,可以使用sun.misc.Unsafe。但我不会在现实生活中使用这种方法。只是出于好奇:)
以下是您如何做到这一点的说明:
顺便说一句,Object.hashCode()返回随机数。默认情况下,它将使用Lehmer随机数生成器。No.和String
intern(和哈希代码)不返回内存地址。@ElliottFrisch请更正我的问题,如何显示字符串的内存地址?请使用允许寻址内存的语言。可能是C++或C,但它不是缓存的。这是一个新的JVM。您不能“在每次运行中清除垃圾回收”。这个测试毫无意义。重新启动你的电脑是没有意义的。这一切都是毫无意义的。@richersoon当程序退出时JVM终止。没有回答被问到的问题。没有回答被问到的问题。默认情况下。没有关于莱默随机数生成器的任何规定。实际上,生成标识哈希代码的算法可以通过-XX:hashCode JVM选项进行更改。有以下选项:-XX:hashCode=0-global Park Miller RNG(莱默随机数生成器。默认值直到Java 7)-XX:hashCode=1-函数(对象地址,全局状态)-XX:hashCode=2-常数1。所有对象都将具有相同的哈希代码。只是为了测试-XX:hashCode=3-递增计数器-XX:hashCode=4—堆中对象地址的低32位-XX:hashCode=5-线程本地Marsaglia的Xor移位RNG(自Java 8以来的默认值);没错,所以“默认情况下”没有指定它的作用。你可以编辑答案,并将关于随机等的详细信息放在那里。请链接一个参考,这很有趣。好吧,这没有提到选项。我猜你是从这里得到的:或者和那个用户在同一个地方。