gpt4 book ai didi

java - 当在Java中使用StringBuilder时仍然创建String时,String builder如何创建可变对象?

转载 作者:行者123 更新时间:2023-12-01 16:54:43 25 4
gpt4 key购买 nike

由于创建大量字符串来记录应用程序状态,我们的应用程序面临着非常糟糕的性能影响。我们计划至少为记录器迁移到字符串构建器。我的一个困惑是:

字符串生成器的调用方式如下:

StringBuilder sb = new StringBuilder();
sb.append("Very big String object....");

如果我是对的,“非常大的字符串对象......”仍然是一个构造函数,在内存中创建非常大的字符串对象(不可变),该对象保留在字符串池中。

那么,在这种情况下,字符串构建器还有什么用呢?因为它肯定会再创建一个对象,而该对象将被垃圾收集。

但是使用 String 构造函数(双 qoutes)“非常大的 String 对象......”创建的 String 仍在内存池中。

最佳答案

你说得不对。 “非常大的String对象....”是一个编译时常量,而不是构造函数,代表它的String对象将进入常量池被重用每次需要的时候。将创建的对象是实际的构建器、其支持字符数组以及添加日志信息后生成的String - 所有这些都将随每个输出语句而变化。

如果您只使用固定的输出字符串,那么使用 StringBuilder 没有意义,但构建器的重点是针对变化的部分。

总而言之,如果日志记录是一个真正的性能问题,那么 String 创建不是真正的瓶颈(日志消息的实际 I/O 才是),或者您正在构建日志消息,即使它们没有输出(例如,对于 DEBUG 级别的日志语句)。在后一种情况下,如果禁用了记录器,您应该完全避免构建它们;现代日志框架(例如 slf4j)会自动执行此操作(如果 DEBUG 日志记录关闭,slf4j 中的 log.debug() 会立即退出)。

关于java - 当在Java中使用StringBuilder时仍然创建String时,String builder如何创建可变对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34720112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com