字符串实习生是否在运行之间共享?

时间:2017-02-09 03:42:20

标签: 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(foo2.hashCode()));

    foo = "a";
    foo2 = "a";
    System.out.println(System.identityHashCode(foo));
    System.out.println(System.identityHashCode(foo2));

    Thread.sleep(1000000);
}

这样做的目的是我在Streams和Imperative风格之间进行一些性能测试。所以我想知道这个值是否为缓存,并确定我是否应该重启我的电脑或通过JConsole / JvisualVm手动运行垃圾收集。

2 个答案:

答案 0 :(得分:-1)

String foo2 = "a"; 可以重用字符串常量池中的实例(如果有)。

可以证明这一点
System.out.println(foo==foo2);
两个引用类型上的

==是引用标识比较。两个等于的对象不一定是==

输出true表示 foo foo2 引用相同的内存。

相关问题
How do I compare strings in Java?
What is the difference between “text” and new String(“text”)?

答案 1 :(得分:-1)

如果要查找对象的内存位置,可以使用 sun.misc.Unsafe 。但我不会在现实生活中使用这种方法。只是出于好奇:)

此处说明如何执行此操作:How can I get the memory location of a object in java?

顺便说一句。 Object.hashCode()返回随机数。默认情况下,它将使用Lehmer随机数生成器。