[奇葩代码] - StringBuffer 的用法

/**
 * [奇葩代码] - StringBuffer 的用法</br>
 * https://gitee.com/oschina/bullshit-codes/blob/master/java/Append.java
 * @author cailong
 */
public class B002_StringBuffer {

	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++) {
			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());
	}

}

/*
----- 分析:
@hengheng8848
1、append方法里面用+号进行字符串拼接,等于没有使用StringBuffer一样,与直接字符串拼接差别不大;
2、对象作用域仅仅在方法体内(非类成员变量或静态变量),可以使用StringBuidler带来更大的效率提升,
因为StringBuilder不是线程安全,可减少多线程同步开销。事实上需要线程同步的字符串拼接在实际开发中的场景并不多;
3、极致点可以预估字符串长度,预先申请例如512、1024这样相对大一点的空间,可以减少动态扩容的性能消耗,用空间换时间;
4、再极致点可以同享StringBuilder实例,使用前清空缓冲区就好;多线程情况下可以用ThreadLocal缓存StringBuilder实例;
5、再再极致点可以借鉴Netty的FastThreadLocal实现的ThreadLocal方法缓存实例

@cyper
大家都在说S(tring)B(uilder)的问题.
但是我注意到作者是在操作XML, 用字符串拼接XML一时爽, 但日后会带来诸多问题.
这里是用数字作例子, 真实场景可能是个字符串.
那么问题来了. 字符串中有 & 等等特殊字符怎么办 你得把 & 转成 &amp; 诸如此类, 字符串拼接极易破坏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之类的还是不用为好)
我是不是跑题了.


*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值