当前位置: 首页 > 知识库问答 >
问题:

堆行为中的Java新字符串和新StringBuilder

曾新
2023-03-14
  1. 字符串池是否驻留在堆上?如果是,字符串文字是否符合垃圾回收机制?

当使用new String("abc")时,我们知道它会在堆上创建一个对象,并将String文字放在String池中。所以我的第二个问题是:

共有2个答案

钱德海
2023-03-14

首先,是的,字符串池及其包含的字符串位于堆上。一旦字符串文本在字符串池中,它将永远不会被删除。因此,在程序终止之前,字符串池中的所有字符串文本都是可访问的,因此不符合垃圾收集的条件。(通过其他方式添加到字符串池的字符串可能符合垃圾收集的条件。)

如果我们通过new String("abc")创建一个新的String对象,那么会发生两件事:首先,由于String文字"abc",一个内容为"abc"的新String对象被创建并添加到字符串池(如果不是已经有了)。然后,由于new String(...)构造函数,将创建一个新的String对象,该对象是字符串文本的副本。这个新字符串没有放在字符串池中。因此,new String("abc") == "abc"不成立。

代码new StringBuilder(“abc”)new StringBuilder(“abc”)的作用不同,因为它创建的是StringBuilder对象,而不是字符串。但是,由于字符串文字“abc”,它确实可以确保字符串池中有一个内容为“abc”的字符串对象。

路和悌
2023-03-14

您混淆了编译时、加载时和运行时。

在类加载时,字符串文本被添加到常量池中。只要在类代码的任何地方提到一个文字就足够了;您甚至不必在该类中执行任何代码行。

另一方面,表达式new String(“literal”)每次求值时都会生成一个新的String实例。该实例与常量池中的实例不同,并且具有字符串值的副本。

StringBuilder在这方面的行为方式与String完全相同:它是用字符串文字值的副本初始化的。

 类似资料:
  • 问题内容: 字符串池是否驻留在堆上?如果是,字符串文字是否可以进行垃圾回收? 使用时,我们知道它会在堆上创建一个对象,并将String文字放置在String池中。所以我的第二个问题是: 是否表现方法一样?如果是,StringBuilder如何处理字符串池中的字符串文字? 问题答案: 您会混淆编译时间,加载时间和运行时。 在类加载时,将字符串文字添加到常量池中。只需在类代码中的任何地方 提及 文字即

  • 问题内容: 我正在尝试JTextArea使用正则表达式将文本拆分为,但是,这是行不通的,我也尝试了正则表达式的许多其他组合。码: 问题答案: 这应该覆盖你: 你实际上只需要担心两个换行符(UNIX和Windows)。

  • 问题内容: 假设我有两个陈述。 哪个是堆栈内存,哪个存储在堆中? 两者之间有什么区别? 创建了多少个对象,内存中的引用如何? 最佳做法是什么? 问题答案: 所有对象都存储在堆中(包括其字段的值)。1个 局部变量(包括参数)始终包含原始值或引用,并存储在堆栈中。1个 因此,对于您的两行: 您将在堆上有两个对象(两个包含的String对象)和两个引用(每个对象一个)在堆栈上(提供且是局部变量)。 (实

  • 问题内容: 我知道问题的标题不是很清楚,对此感到抱歉,不知道如何提出。我有一个非常基本的Java实现问题,我想着重于应用程序性能,但是它也涉及Java中的String创建模式。 我了解Java中字符串的不变性概念。我不确定的是,我在某处读到以下内容不会创建两个不同的String对象: 我想知道Java是怎么做到的?它实际上是否在程序存储器中寻找一个String值并检查其是否存在,如果不存在则创建一

  • 因此,我试图创建一个新的SQLite表,其名称由我的应用程序中创建的字符串设置。字符串是从int userID和curret date(到字符串)创建的 和错误指向我的PreparedStatement,我敢打赌‘?’有问题,但如何用其他方法呢?

  • 问题内容: 有没有办法从Java中的String变量创建新类? 另外,如果可能,生成的对象是否必须为Object类型? 也许有更好的方法,但是我希望能够从XML文件中检索值,然后实例化以这些字符串命名的类。这些类中的每一个都实现相同的接口,并从相同的父类派生,因此我将能够在该类中调用特定的方法。 问题答案: 这是你想做的: 请注意,newInstance方法不允许使用参数化的构造函数。(请参阅Cl