因为,在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");
本网站上与字符串相关的其他问题并没有具体回答我的问题。请注意这个问题^ _ ^
任何帮助将不胜感激
答案 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"
恰好是一个常量,在这种情况下,它可以在编译期间仍然进行评估。)
但我建议所有这些都是微不足道的技术问题,对性能的影响可以忽略不计,所以即使想知道它们如何工作也是一件好事,让这些知识迫使你去做是不是一件好事。编程与编写和理解代码最自然的程序不同。