坑爹代码 | 这样使用 StringBuffer 的方法有什么坑?

码云Gitee
 码云Gitee
发布于 2019年05月28日
收藏 18

你是否曾经这样使用过 Java 的 StringBuffer 类?

/**
 * Create Time 2019/5/24
 * StringBuffer追加 如痴如醉的写法
 * @author cailong
 **/
public class Append {
    public static void main(String[] ares){

        StringBuffer sb = new StringBuffer();
        //这里都能理解
        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT>");
        for (int i = 0; i < 10; i++) {
            //为什么到这里就要这样写???既然都用StringBuffer了    (这里省略集合遍历用i代替 意思能懂就行)
            sb.append("<NSRXX>" +
                    "<NSRSBH>"+i+"</NSRSBH>" +
                    "<NSRMC>"+i+"</NSRMC>" +
                    "<DJXH>"+i+"</DJXH>" +
                    "<ZGSWJ_DM>"+i+"</ZGSWJ_DM>" +
                    "<ZGSWJ_MC>"+i+"</ZGSWJ_MC>" +
                    "<SJLY>sjzs</SJLY>" +
                    "<YWSX_DM>"+i+"</YWSX_DM>" +
                    "</NSRXX>");
        }
        sb.append("</ROOT>");
        System.out.println(sb.toString());
    }
}

你觉得这个代码存在什么问题呢?请前往

https://gitee.com/oschina/bullshit-codes/blob/master/java/Append.java

发表你的意见。

码云 6 周年,我们正在征集各种坑爹代码,很多奖品等你来拿

详细的参与方法请看  https://gitee.com/oschina/bullshit-codes

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:坑爹代码 | 这样使用 StringBuffer 的方法有什么坑?
加载中

精彩评论

cyper
cyper

引用来自“dwingo”的评论

为什么还在用StringBuffer? 难道不该常用StringBuilder?

引用来自“kppom”的评论

考虑到多线程安全性,StringBuffer是有存在的必要的

引用来自“dwingo”的评论

不常用不代表不用, 只是多线程共享一个buffer去append这种情况太少见了. 像文章中这种只在栈上引用StringBuffer是最明显更适合用StringBuilder的.
大家都在说S(tring)B(uilder)的问题.

但是我注意到作者是在操作XML, 用字符串拼接XML一时爽, 但日后会带来诸多问题.

这里是用数字作例子, 真实场景可能是个字符串, 那么问题来了. 字符串中有& !等等特殊字符怎么办 你得把& 转成 & 诸如此类, 字符串拼接极易破坏XML文档结构, 各种BUG接踵而来.

正确的方式是用各种库, 比如spring boot自带的com.fasterxml.jackson.dataformat.xml.XmlMapper
可以直接将pojo转成xml字符串

XmlMapper xmlMapper = new XmlMapper();

Nsrxx bean = new Nsrxx();
bean.set(..);
bean.set(..);
bean.set(..);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
xmlMapper.writeValue(bos, bean);

String xmlString = bos.toString();

或者高效的话用 Java StAX API, (SAX, DOM之类的还是不用为好)

我是不是跑题了.
FungSaikit
FungSaikit
NSRXX 纳税人信息,NSRSBH 纳税人识别号。这个项目我好像参与过……某ERP 😩
dwingo
dwingo
为什么还在用StringBuffer? 难道不该常用StringBuilder?

最新评论(31

Sky__
Sky__
我觉得还好啊,有些功能补封装成屎了, 我觉的此时此刻,这就是我要的
FungSaikit
FungSaikit
NSRXX 纳税人信息,NSRSBH 纳税人识别号。这个项目我好像参与过……某ERP 😩
一个大土豆
一个大土豆
局部变量不需要用stringbuffer,而且,既然用了stringbuffer或者stringbuilder,那么就是所有元素都用append,不要后面一直用+。。等于没有什么优化。。
比如sb.append("<NSRXX>" +
"<NSRSBH>"+i+"</NSRSBH>" +
应该改成sb.append("<NSRXX>").append("<NSRSBH>").append(i).append("</NSRSBH>")
哈库纳
哈库纳
可以不用非得写成append形式的, java 编译优化会自动处理的。
疏影横斜
疏影横斜
方法内的变量本来就是线程安全的 StringBuilder 足以~~另外这里的主要问题是 for循环中使用sb.append(,然后append内部仍然使用+
kakai
kakai
从来不这么写,但就你这种代码场景而言,根本不会出现多线程问题,用StringBuilder就足够了。
ygxan8
ygxan8
用了StringBuffer中间还用那么多拼接符,直接全用append。,
开源中国首席睡不够
开源中国首席睡不够
看到纳税人识别号的节点了
tupolev
tupolev
str和sbf结合的不错
jason-he
jason-he

引用来自“dwingo”的评论

为什么还在用StringBuffer? 难道不该常用StringBuilder?

引用来自“kppom”的评论

考虑到多线程安全性,StringBuffer是有存在的必要的

引用来自“dwingo”的评论

不常用不代表不用, 只是多线程共享一个buffer去append这种情况太少见了. 像文章中这种只在栈上引用StringBuffer是最明显更适合用StringBuilder的.

引用来自“cyper”的评论

大家都在说S(tring)B(uilder)的问题.

但是我注意到作者是在操作XML, 用字符串拼接XML一时爽, 但日后会带来诸多问题.

这里是用数字作例子, 真实场景可能是个字符串, 那么问题来了. 字符串中有& !等等特殊字符怎么办 你得把& 转成 & 诸如此类, 字符串拼接极易破坏XML文档结构, 各种BUG接踵而来.

正确的方式是用各种库, 比如spring boot自带的com.fasterxml.jackson.dataformat.xml.XmlMapper
可以直接将pojo转成xml字符串

XmlMapper xmlMapper = new XmlMapper();

Nsrxx bean = new Nsrxx();
bean.set(..);
bean.set(..);
bean.set(..);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
xmlMapper.writeValue(bos, bean);

String xmlString = bos.toString();

或者高效的话用 Java StAX API, (SAX, DOM之类的还是不用为好)

我是不是跑题了.
我觉着你是对的
cyper
cyper

引用来自“dwingo”的评论

为什么还在用StringBuffer? 难道不该常用StringBuilder?

引用来自“kppom”的评论

考虑到多线程安全性,StringBuffer是有存在的必要的

引用来自“dwingo”的评论

不常用不代表不用, 只是多线程共享一个buffer去append这种情况太少见了. 像文章中这种只在栈上引用StringBuffer是最明显更适合用StringBuilder的.
大家都在说S(tring)B(uilder)的问题.

但是我注意到作者是在操作XML, 用字符串拼接XML一时爽, 但日后会带来诸多问题.

这里是用数字作例子, 真实场景可能是个字符串, 那么问题来了. 字符串中有& !等等特殊字符怎么办 你得把& 转成 & 诸如此类, 字符串拼接极易破坏XML文档结构, 各种BUG接踵而来.

正确的方式是用各种库, 比如spring boot自带的com.fasterxml.jackson.dataformat.xml.XmlMapper
可以直接将pojo转成xml字符串

XmlMapper xmlMapper = new XmlMapper();

Nsrxx bean = new Nsrxx();
bean.set(..);
bean.set(..);
bean.set(..);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
xmlMapper.writeValue(bos, bean);

String xmlString = bos.toString();

或者高效的话用 Java StAX API, (SAX, DOM之类的还是不用为好)

我是不是跑题了.
冰霜之卅ya
冰霜之卅ya
你这才是正解。
返回顶部
顶部