创建新的字符串作为文字/新对象时的内存分配

问题描述 投票:4回答:1

注意:在将其标记为重复之前,请阅读问题。这不是关于常量池存储在哪里,实习生如何工作,创建了多少个对象或使用不同的创建技术/使用实习生如何影响==结果的问题。!!

String s1 = "Hello";
String s2 = new String("Hello");

Field declaredField = String.class.getDeclaredField("value");
declaredField.setAccessible(true);

byte[] arr1 = (byte[])declaredField.get(s1);
byte[] arr2 = (byte[])declaredField.get(s2);

现在,s1 == s2 = False,arr1 == arr2 = True。

我的问题是对象如何存储在内存中。

第一行的确在池上创建了一个新的String类型的对象。第二行确实将其作为常规对象在堆上创建]

但是底层字节[] arr相同。这让我想到,JVM会以某种方式执行此检查以检查是否存在这样的现有byte []并将所有引用指向相同的arr。这是否意味着无论我们使用文字还是new关键字,底层数组都将缓存在池中?

So s =“ something”在池上创建一个新的String类型对象,以及保存数据的基础数组-这也在池上创建。

s = new String(“ something”)->在堆上创建String类型对象,但是仍存储在池中的基础数组/如果已经存在,则仅创建引用。

我的理解是否正确?

任何有好的文章指针的人也会很高兴,因为这困扰了我很长时间:(

java string string-literals
1个回答
2
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.