剑非刀 2016-12-06 01:23 采纳率: 0%
浏览 5074
已采纳

为什么StringBuilder的效率要比String高?

StringBuilder 中的append方法,很多资料上写之所以建议使用StringBuilder是因为它可变,不会一直创建对象。可是append方法的源码却是每一次都调用了System.arraycopy方法,也就意味着每次执行append都在内存中创建了一个数组对象。既然都与String一样,每次都创建对象,那么这效率从何而来的啊?请老师指教

  • 写回答

3条回答 默认 最新

  • Readiay 2016-12-06 08:03
    关注

    你说的挺对的,StringBuilder在每次append的时候都会发生System.arrayCopy。给你看个效果,然后再给你分析下:
    图片说明

    从上面可以看出,for循环10万次,最后的结果使用StringBuilder的时间大概是String的千分之一,相差了3个数量级。

    为什么会出现这个情况呢?

    第一点:关于每次调用append创建一个char【】的说法:
    图片说明
    你看,getChars这个方法,是将当前的String对象,变成char【】,但是这个内容是放到那个value的char【】里面的,也就是说,
    他并不是每次都创建一个char【】对象的。(但是System.arrayCopy这个方法是本地方法,看不到源码)

    第二点:String这种对象,每次都会创建一个对象,你改了一点点也会创建一个新的对象,
    但是StringBuilder就不是,他只是替换了char【】某个位置上的那个char而已。

    第三点:创建对象多了,垃圾回收就多了,垃圾回收也涉及到一部分时间。

    第四点:StringBuilder还有个哥哥,StringBuffer,他两几乎双胞胎。
    String与StringBuffer的区别
    简单地说,就是一个变量和常量的关系。StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。
    StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。
    String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个Java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。
    StringBuffer:StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料