内存分配到字符串对象?

时间:2015-12-05 15:06:46

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

因为,在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");

本网站上与字符串相关的其他问题并没有具体回答我的问题。请注意这个问题^ _ ^

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:6)

  

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

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

  

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

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

来自Java文档:String

  

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

答案 1 :(得分:2)

  

因为,在Java中,字符串被实现为Object.Also类型的引用,String常量被实现为Objects。

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

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

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

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