Java中字符串连接的复杂性

Java中字符串连接的复杂性,java,big-o,complexity-theory,Java,Big O,Complexity Theory,我不明白为什么Java中的字符串连接有一个O(N)运行时。有人能解释为什么会这样,以及使用StringBuilder类是否具有相同的复杂性吗?因为在Java中连接两个字符串所需的时间(平均)与两个字符串中的字符数成线性比例。由于像“a”+“b”那样执行的String连接已经使用了StringBuilder,我认为可以肯定地说,这也是O(N)。请记住,JavaString是不可变的。每次创建一个字符串时,都会创建一个新的缓冲区并复制内容。字符串在Java中是不可变的 StringBuilder/S

我不明白为什么Java中的字符串连接有一个O(N)运行时。有人能解释为什么会这样,以及使用StringBuilder类是否具有相同的复杂性吗?

因为在Java中连接两个字符串所需的时间(平均)与两个字符串中的字符数成线性比例。由于像
“a”+“b”
那样执行的
String
连接已经使用了
StringBuilder
,我认为可以肯定地说,这也是O(N)。请记住,Java
String
是不可变的。

每次创建一个字符串时,都会创建一个新的缓冲区并复制内容。字符串在Java中是不可变的

StringBuilder/StringBuffer使用内部缓冲区,仅在调用toString()时创建不可变字符串。更少的复制和分配导致更快的代码。复制和分配的唯一时间是内部缓冲区用完时;您还可以控制缓冲区大小

现在,让事情变得更混乱的是,一些基于Java的语言知道字符串是否可以优化,并在幕后创建字符串缓冲区,因此使用基于缓冲区的类并不能真正受益