4-12 拼接字符串实现方式
在很多语言里对字符串的性能优化变成一个很麻烦的问题。对字符串的引用做了优化,但是对字符串的写操作怎么做,对字符串的修改究竟怎么样去优化,很多语言里都会有这样的一些规则。
字符串对象既然是只读的不可变的,那么需要修改这个字符串有几种做法?
有种做法把字符串内容复制到字节数组里面去,比如有个字符串对象头信息指向一个字节数组,修改字符串简单做法把这个字节数组复制到buffer里面,buffer修改完之后再去重新生成字符串。这样一来面临的问题是在buffer时候分配一次内存,然后把它转换为字符串的时候有得分配一次内存,这样一来性能就会很差。
为什么要重新复制内存呢?因为要从不可变类型变成可变类型。不可变类型情况下不能直接修改,不能保证有多少人引用它,在不能保证有多少引用它的情况下修改它的内容的话实际上会带来一些安全风险。最好做法是把它复制一遍然后去生成,这样确保你的修改不会影响多人的引用。
很多语言里要求拼接字符串的时候有这样的说法,比如说尽可能避免对多字符串进行加号。为什么使用加号方式比用函数方式性能差呢?
以Go