gpt4 book ai didi

java - 池和堆中的字符串创建

转载 作者:行者123 更新时间:2023-12-01 18:10:08 25 4
gpt4 key购买 nike

对字符串有一些疑问,

我是根据网上各种文章的理解来写这篇文章的,某些说法可能有误,请多多包涵。

  1. 当我们这样做时字符串str1 = new String(“newStr1”);。这将创建 2 个字符串对象。一个在常规堆中,另一个在字符串池中。为什么是 2 个对象及其用途?为什么不在泳池里只放一个呢?

  2. 如果我们创建对象为String str2 = new String("newStr2").intern();。这会检查池中是否存在类似(有意义的相等)对象,并提供对它的引用。如果没有,它会在池中创建一个而不是在堆中吗?如果是这样,那么我们应该大多数时候使用 intern 来节省内存?虽然这会影响性能一点。所以基本上它是 String str2 = "newStr2"; (字符串文字的实习是隐式的)

  3. Java-6 之后字符串池从永久代空间移至堆区域?所以基本上我们现在只有一个区域作为堆,还是字符串池现在作为堆中的一个单独部分?如果它不是一个单独的部分,那么仍然会创建 2 个对象?

最佳答案

在java中,如果JVM识别出literal("xyz"),它会立即在字符串常量池中创建一个对象,同时如果它识别出new,那么它就会将在 heap.now 中创建一个对象,然后继续查询:

1.String str1 = new String("newStr1");这里对于JVM来说“newStr1”是文字,所以它会遵循文字对应的规则,因此它在字符串常量池中创建一个对象。new String("newStr1")--这里对于new运算符,它遵循new运算符对应的规则,因此它也会在堆中创建一个对象。

2.intern():此处 intern 不会在 pool 中创建对象。interno 用于更改字符串对象以引用字符串池而不是堆。string s1 = new String("newStr1") -- 这里 s1 将指向堆区域而不是字符串常量池。String s1 = new String("newStr1").intern() 将使 s1 指向字符串常量池,因为 newStr1 是在堆和字符串常量池中创建的。intern() 不会处理字符串对象的创建。

3.permgen :为了使垃圾收集有效,堆被分为不同的区域,其中permgen也是一个区域,但它仍然只是在堆内部,它是堆内部的一个区域。请引用这个http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/堆区域的链接。

关于java - 池和堆中的字符串创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com