Java 为字符串对象分配内存?

Java 为字符串对象分配内存?,java,string,memory,memory-management,string-concatenation,Java,String,Memory,Memory Management,String Concatenation,因为在Java中,字符串被实现为Object类型的引用。此外,字符串常量被实现为对象 例如: System.out.println("This is a String"); 在上面的语句中,“thisastring”也被实现为type对象。这意味着它将被分配与相同的内存 String str = "This is a String"; 我的问题是,如果我在同一个系统中使用+运算符打印多个字符串。out语句如下所示 System.out.println("This is a String" +

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

例如:

System.out.println("This is a String");
在上面的语句中,“thisastring”也被实现为type对象。这意味着它将被分配与相同的内存

String str = "This is a String";
我的问题是,如果我在同一个
系统中使用
+
运算符打印多个字符串。out
语句如下所示

System.out.println("This is a String" + "This is another String");
现在,我要问的是,我想知道
“这是一个字符串”
“这是另一个字符串”
是否会占用不同的内存空间或相同的内存空间

另外,在
println()
语句中的字符串之间添加变量是否会产生差异

例如:

int i = 10;
System.out.println("This is a String" + i + "This is another String");
本网站上与字符串相关的其他问题没有明确回答我的问题。请对此问题进行说明^_^

任何帮助都将不胜感激

我基本上是想知道
“这是一个字符串”
“这是另一个字符串”
是否会占用不同的内存空间或相同的内存空间

这里的
字符串
都是常量,因此在编译时它们将被连接起来,并且将在字符串池中创建一个单个
字符串
“这是一个字符串这是另一个字符串”

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

实际输出
String
是在运行时确定的,因此它将在堆区域中创建不同的
String
s

从Java文档中:

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

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

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

关于
“这是一个字符串”+“这是另一个字符串”
,我不确定Java语言规范是否要求编译器必须以特定的方式处理此问题,但您可以放心地期望任何一个中等水平的编译器在编译期间对此进行评估,这意味着它很可能相当于
“这是一个字符串这是另一个字符串”

在字符串常量之间添加一个变量当然会有所不同,因为现在表达式在编译期间无法计算,因此编译器必须生成两个单独的字符串对象,一个用于
“这是一个字符串”
,另一个用于
“这是另一个字符串”
。(当然,除非,
i
恰好是一个常量,在这种情况下,它仍然可以在编译期间进行计算。)

但我认为,所有这些都是微不足道的技术细节,对性能的影响可以忽略不计,因此,尽管想知道它们是如何工作的是件好事,但允许这些知识迫使您以不同于您编写代码和理解代码最自然的方式进行编程并不是件好事