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

当使用存储在Java内存中的tostring方法创建字符串对象时,字符串对象在哪里?

锺离明煦
2023-03-14

我在做一个作业,我得到了下面这个问题。

使用toString()方法创建的字符串对象存储在内存中的哪里?

String a = Integer.toString(10);
  1. 在恒定池中
  2. 在堆上(新操作员对象的区域)

共有3个答案

杨骏
2023-03-14

这是一个奇怪的(我认为是糟糕的)面试问题,因为这个问题的答案取决于JDK的实现。这个实现是可以改变的,一般人是不会知道的,因为要确定答案,你需要询问实现者或者阅读他们的源代码。此外,从Java7开始,字符串池(我假设它的意思是“常量池”)就在堆上。所以即使它在字符串池中,它仍然在堆中。

目前(OpenJDK 8u40-b25),该字符串将是在堆内存中创建的新对象:

public static String toString(int i) {
    if (i == Integer.MIN_VALUE)
        return "-2147483648";
    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
    char[] buf = new char[size];
    getChars(i, size, buf);
    return new String(buf, true);
}

因为您传递的是10,而不是整数。MIN_VALUE,将创建一个新的String对象。这个字符串的内容是一个char数组,它是用new创建的,所以存在于堆中。intern()没有被调用,所以它没有被放入字符串池中。

您可以通过使用==String测试它们是否是相同的对象而不是相同的值来测试这是否是您所获得的行为。下面将评估为False,因为静态Integer.toString()方法在每次调用堆时都会在堆上创建一个新的String对象:

Integer.toString(10) == Integer.toString(10)

如果它们被插入字符串池,它们将是同一个对象(因为这就是插入时每个字符串只有一个对象的意义)。以下计算结果为True

Integer.toString(10).intern() == Integer.toString(10).intern()

请注意,这是一个专门针对静态Integer.toString()方法的答案,而不是针对所有的toString()方法。例如,Boolean.toString()从字符串返回字符串游泳池。

松正阳
2023-03-14

这取决于所调用的toString()方法的实现。

toString()方法创建String对象,因此取决于它如何创建(以及是否插入字符串),返回的String将是否在字符串池中。

请注意,toString()只是一个类似于任何其他方法的方法。不存在以任何特殊方式处理toString()方法的返回值的魔法。(例如,由toString()返回的字符串不会自动驻留)。它的工作方式与返回String的任何其他方法完全相同。

秦凯旋
2023-03-14

它们都进入了内存堆。只有字符串文字和插入的字符串才能进入字符串常量池。

唯一的例外是String

public String toString() {
    return this;
}

它只是返回当前字符串(如果它在堆上,它从堆返回/如果它在字符串常量池上,它从字符串常量池返回)

注意:如果toString()未被覆盖以显式返回String Litial,则始终在堆上创建String表示形式(ClassName@hexValueOfHashCode)。

 类似资料:
  • 问题内容: 我有一个接受File作为参数的函数。我不想创建/写入新文件(我没有对文件系统的写访问权)以便将字符串数据传递给该函数。我应该补充说字符串数据在文件中不存在(所以我无法从文件中读取数据)。 我可以使用流并将其“广播”到文件对象吗? 问题答案: 没有; 类的实例表示文件系统中的路径。因此,您只能将该功能与文件一起使用。但是,也许有一个过载需要替代?

  • 在Java当我们写作的时候 然后与进行比较,我们得到true作为布尔结果。对相同的解释是字符串常量是在字符串池中创建的,因此这里由S1和s2引用的字符串常量是相同的。还有,如果我们写一些 然后与,我们得到false。原因是S1和S2的引用不同,因为字符串文字是在堆中创建的。 我的问题是,在构造函数中传递的字符串文字“TestString”是在哪里创建的?它与字符串文字/常量相同吗?因此应该在池中创

  • 问题内容: Object o1 = new Object(); Object o2 = new Object(); //o1=o2; System.out.println(o1.equals(o2)); 它返回。如果删除了注释,则可以返回。 为什么同一件事不适用于该班级? 它返回。为什么?(因为使用实习生或其他涉及的东西?) 问题答案: 因为 String的equals() 比较内容,而不是对象本

  • 当我们使用 String 文字创建字符串对象时,会调用字符串类的哪个构造函数。 示例: 在这种情况下,string类的哪个构造函数get?

  • 我知道这可能是非常基本的,也可能是非常直接的,但我无法清楚地理解在这种情况下会发生什么,所以,就这样吧。 在以下代码中: 我知道str1和str2将在字符串常量池中分别创建一个对象“Hello”和“World”。而对于str3,将在字符串常量池外部创建一个新对象,该对象指向在字符串常量池内部创建的“HelloWorld”。 我的问题是,如果我concat 2个或更多字符串(使用“”或concat(

  • 我知道字符串文字和新字符串对象之间的区别,也知道它在内部是如何工作的。但我的问题是,这有点超前。当我们使用new关键字as创建字符串对象时 在本例中,我们传递的是字符串类型的参数。我的问题是这个字符串是在哪里生成的-堆还是字符串常量池还是其他地方? 据我所知,这个参数是一个字符串文字,所以它应该在字符串常量池中。如果是这样的话,那么intern方法的用途是什么?只需将变量str链接到常量池?因为“