Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串实习生是否在运行之间共享?_Java - Fatal编程技术网

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以来的默认值);没错,所以“默认情况下”没有指定它的作用。你可以编辑答案,并将关于随机等的详细信息放在那里。请链接一个参考,这很有趣。好吧,这没有提到选项。我猜你是从这里得到的:或者和那个用户在同一个地方。