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

Prakruti Pathik:

我正在做一个作业,而我遇到了以下问题。

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

String a = Integer.toString(10);
  1. 在恒定池中
  2. 在堆上(新运算符对象的区域)
和盖茨:

这是一个奇怪的(我会说很差)的面试问题,因为该问题的答案取决于JDK的实现。这种实现可能会发生变化,这不是普通人应该知道的,因为要确定这一点,您需要询问实现者或阅读其源代码。另外,从Java 7开始,字符串池(我假设这是“常量池”的意思)在堆上。因此,即使它在字符串池中,它仍然在堆中。

当前(OpenJDK 8u40-b25String将是在堆内存中创建的新对象:

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不是Integer.MIN_VALUEString所以创建了一个新对象。该字符串的内容是一个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()例如,从字符串池返回字符串。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

字符串数据存储在哪里?

Java源代码中的字符串在哪里实现`+`?

建议在哪里存储Azure存储连接字符串

从Java中的字符串在内存中创建File对象

对象的功能在哪里存储在内存中?

字符串文字将存储在哪里

.NET的内部资源字符串存储在哪里

与char *对应的字符串存储在哪里?

使用Java 8将对象列表转换为从toString()方法获得的字符串

Java的内部类在哪里存储在内存中

Java中的split()方法在哪里开始将正则表达式与字符串匹配?

在Java中的Enum对象中存储字符串

如何在Java中创建和存储字符串?

数组在哪里存储在内存中?

在Java 8中,字符串使用多少内存?

如何从Java脚本中的字符串创建对象树

从Java中的字符串创建新对象

java使用值字符串创建日期对象

使用 Java Stream 创建基于字符串的新对象

字符串是Java中的对象,那么为什么不使用'new'创建它们呢?

字符串如何/在哪里实现?

MySQL在整数与字符串在哪里

我们如何使用javascript对象中的字符串名称存储创建Backbone视图的实例?

如何使用Java中的字符数组创建字符串?

Number的toString存储在哪里?

创建字符串对象的最佳方法

如果类具有`__toString`方法,是否可以将类对象嵌入字符串中?

Java中的串联字符串是否总是导致在内存中创建新字符串?

使用toString()方法来打印字符串数组对象的编号列表