当前位置: 首页 > 面试题库 >

字符串是不可变的-这意味着我不应该使用+ =,而只能使用StringBuffer?

艾自强
2023-03-14
问题内容

字符串是不可变的,这意味着一旦创建它们就无法更改。

那么,这是否意味着如果使用+ =附加内容,则比创建StringBuffer并在其上附加文本会占用更多的内存?

如果使用+ =,则每次必须将其保存在内存中时都会创建一个新的“对象”,不是吗?


问题答案:

是的,您每次都会使用+ =创建一个新对象。但这并不意味着总是做错事。这取决于您是否要将该值作为字符串,还是要使用它来进一步构建字符串。

如果您实际上 希望 将结果x + y作为字符串,那么不妨只使用字符串串联。但是,如果您真的要循环(循环)并附加另一个字符串,另一个,等等-
只需要在最后将结果作为字符串,则可以使用StringBuffer /
StringBuilder。确实,循环确实是StringBuilder在字符串连接上获得回报的地方-5个或什至10个直接连接的性能差异将很小,但成千上万个性能差异将变得更糟-
基本上是因为您获得了O(N 2)复杂度与StringBuilder的串联vs O(N)复杂性。


在Java 5及更高版本中,您基本上应该使用StringBuilder-它是不同步的,但这几乎总是可以的;很少在线程之间共享一个线程。

我有一篇关于所有这些的文章,您可能会觉得有用。



 类似资料:
  • 问题内容: 我现在已经实现了一些Java应用程序,到目前为止仅实现了桌面应用程序。我更喜欢使用不可变对象在应用程序中传递数据,而不是使用带有变量(setter 和getter )的对象,也称为JavaBeans。 但是在Java世界中,使用JavaBeans似乎更为常见,而且我不明白为什么应该使用JavaBeans。就个人而言,如果代码仅处理不可变的对象而不是始终改变状态,则代码看起来会更好。 在

  • 为什么这是“良好的编码实践”?例如,当我制作一个石头剪刀游戏机时,大多数人建议使用枚举而不是字符串。有什么区别?

  • 通读ANSI C Yacc语法规范后,我注意到以下内容都是有效的: 这对我来说似乎很奇怪,因为我对类型的理解表明这些变量都没有类型。这些是什么意思?如何检查它们的类型?分配了多少内存?

  • 我正在阅读在进入SQL查询之前是否需要转义$_session['username']?它说“您需要转义传递给sql查询的每个字符串,而不管它的来源是什么”。现在我知道像这样的东西是非常基本的。谷歌搜索结果超过2万个。仅Stackoverflow就有20页的结果,但没有人真正解释什么是转义字符串,或者如何转义字符串。这只是假设。你能帮帮我吗?我想学习,因为我一直在用PHP制作一个web应用程序。 我

  • 我试图使这个printf工作,但我不断得到一个异常抱怨第一个'%'运算符。我像这样多次使用printf,从来没有出现过问题。我正在使用Eclipse。 为什么我的陈述不起作用,我如何让它起作用? 在第18行,第二个用于表示文本 (不一定是程序中的实际代码) 免责声明:这是一个家庭作业,但我已经为它写好了完整的代码。我只需要克服这个错误,并得到我的老师的许可,就可以发布这样的问题。

  • 问题内容: 从log.go(执行日志包): 只是一个函数包装器,为什么我应该用它代替or ? 有实际原因吗? 问题答案: 两件事不同: 通过包日志进行打印对于并发goroutine是安全的(而普通的则不是) 日志可以自动添加计时信息。 因此,这是两件完全不同的事情。log用于记录和格式化。(好吧,log使用相同的动词和标志,但这很方便)。