Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用';进行字符串连接后创建了多少个对象+';操作人员_Java_String_String Concatenation - Fatal编程技术网

Java 使用';进行字符串连接后创建了多少个对象+';操作人员

Java 使用';进行字符串连接后创建了多少个对象+';操作人员,java,string,string-concatenation,Java,String,String Concatenation,我想问一下,在java中执行以下语句后,会创建多少个对象 String str = "a"+"b"+"c"+"d" 在我看来,只有一个对象应该被创建,而StringBuilder的对象应该被创建。请纠正我并解释其背后的逻辑。提前谢谢。简单的答案是零对象。这是一个编译时常量表达式,字节码编译器将其计算为“abcd”。。。在创建“.class”文件之前 实际上,在现代JVM中,与文本和编译时常量表达式关联的String对象的实例化是惰性的,因此第一次执行该语句时可能会创建一个String对象。但这

我想问一下,在java中执行以下语句后,会创建多少个对象

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用于实例化文本字符串对象的策略。