【问题标题】:Memory Allocation to String Objects? [duplicate]字符串对象的内存分配? [复制]
【发布时间】:2016-03-10 11:41:02
【问题描述】:

因为,在 Java 中,字符串被实现为 Object 类型的引用。此外,字符串 constants 被实现为对象。

例如:

System.out.println("This is a String");

在上面的语句中,“This is a String”也被实现为Object类型。这意味着它将被分配与

相同的内存
String str = "This is a String";

我的问题是,如果我在同一个 System.out 语句中使用 + 运算符打印多个字符串会怎样,

System.out.println("This is a String" + "This is another String");

现在,我基本上要问的是,我想知道"This is a String""This is another String" 是否会占用不同的内存空间或相同的内存空间??

另外,在println() 语句中的字符串之间添加一个变量会产生影响吗?

例如:

int i = 10;
System.out.println("This is a String" + i + "This is another String");

本站其他与字符串相关的问题没有具体回答我的问题,请多多指教^_^

任何帮助将不胜感激

【问题讨论】:

    标签: java string memory memory-management string-concatenation


    【解决方案1】:

    我基本上要问的是我想知道"This is a String""This is another String"是否会占用不同的内存空间或相同的内存空间??

    这里String 都是常量,因此在编译时它们将连接起来,并且单个 String "This is a StringThis is another String" 将在字符串池中创建。

    System.out.println("这是一个字符串" + i + "这是另一个字符串");

    实际输出String是在运行时确定的,所以会在Heap区创建不同的Strings。

    来自 Java 文档:String

    Java 语言为字符串连接运算符 (+) 以及将其他对象转换为字符串提供了特殊支持。字符串连接是通过StringBuilder(或StringBuffer)类及其append方法实现的。字符串转换通过toString方法实现,由Object定义,Java中所有类都继承。

    【讨论】:

      【解决方案2】:

      因为,在 Java 中,字符串被实现为 Object 类型的引用。此外,字符串常量也被实现为对象。

      不,在 Java 中,字符串是作为字符串对象实现的。当然,它们是对象。内部对象通过引用进行操作。并且字符串常量再次实现为字符串。

      关于 "This is a String" + "This is another String",我不确定 Java 语言规范是否要求编译器必须以特定方式处理此问题,但您可以放心地期待任何中途的编译器在此期间评估此问题编译时间,这意味着它很可能等于"This is a StringThis is another String"

      在字符串常量之间添加一个变量当然会产生影响,因为现在无法在编译期间评估表达式,因此编译器必须生成两个单独的字符串对象,一个用于"This is a String" 和另一个"This is another String"。 (当然,除非i 恰好是一个常量,在这种情况下,它仍然可以在编译期间进行评估。)

      但我建议所有这些都是微不足道的技术细节,对性能的影响可以忽略不计,所以即使想知道它们是如何工作的是一件好事,但让这些知识强迫你去了解它们并不是一件好事与您最自然地编写和理解您的代码的程序不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-29
        • 2011-03-22
        • 2021-07-27
        • 2020-02-16
        • 2019-07-25
        相关资源
        最近更新 更多