Java 使用';进行字符串连接后创建了多少个对象+';操作人员
我想问一下,在java中执行以下语句后,会创建多少个对象Java 使用';进行字符串连接后创建了多少个对象+';操作人员,java,string,string-concatenation,Java,String,String Concatenation,我想问一下,在java中执行以下语句后,会创建多少个对象 String str = "a"+"b"+"c"+"d" 在我看来,只有一个对象应该被创建,而StringBuilder的对象应该被创建。请纠正我并解释其背后的逻辑。提前谢谢。简单的答案是零对象。这是一个编译时常量表达式,字节码编译器将其计算为“abcd”。。。在创建“.class”文件之前 实际上,在现代JVM中,与文本和编译时常量表达式关联的String对象的实例化是惰性的,因此第一次执行该语句时可能会创建一个String对象。但这
String str = "a"+"b"+"c"+"d"
在我看来,只有一个对象应该被创建,而StringBuilder的对象应该被创建。请纠正我并解释其背后的逻辑。提前谢谢。简单的答案是零对象。这是一个编译时常量表达式,字节码编译器将其计算为
“abcd”
。。。在创建“.class”文件之前
实际上,在现代JVM中,与文本和编译时常量表达式关联的String
对象的实例化是惰性的,因此第一次执行该语句时可能会创建一个String
对象。但这只是第一次
因此,更正确的答案是零或一个String
对象,具体取决于:
- 字符串文字实习的JVM实现(惰性或渴望),以及
- 这是否是使用
文本或编译时常量的任何语句的第一次执行“abcd”
str
,那么JIT编译器可能会优化语句
并且如果您考虑类卸载的可能性会更复杂。
您正在创建一个类型为“代码>字符串的单个对象。您的代码行中没有StringBuilder
,我知道这段代码会在内部进行更改,例如new StringBuilder().append(“a”).append(“b”).append(“c”).append(“d”)…这就是为什么我认为答案应该是1@deHaar如果字符串引用的赋值为literal
string,对象将不会被创建。因为所有的都将是字符串池。@TheScientificMethod谢谢,我不知道这一点,只是对代码,而不是内部进行了注释…如果对“abcd”进行了计算..编译器不会将其作为对象吗?在执行语句时,它不会作为对象!你能举一个现代JVM的例子吗?所以这个问题的确切答案是0或1,对吗?@Maxim-严格地说,答案是“0或,或0或1,取决于Java版本”。这取决于JVM用于实例化文本字符串对象的策略。