几种拼接字符串的效率与区别

快来打我* 2022-05-14 22:35 426阅读 0赞

程序中拼接字符串是非常常见的操作,一般有直接通过+号拼接,或者使用concat()方法拼接、String.join()、StringUtils.join()、StringBuffer、StringBuilder的append()方法,后两种之前讨论过,不做过多赘述。

+拼接

直接使用“+”拼接字符串,方便简单,代码容易理解,但只适用于需要拼接的字符串比较少的情况,当字符串较多时,效率很低。
可以使用“+”将字符串与数值相拼接。

concat()方法

String类的concat()方法也可以用于拼接字符串,源码如下:

  1. public String concat(String str) {
  2. int otherLen = str.length();
  3. if (otherLen == 0) {
  4. return this;
  5. }
  6. int len = value.length;
  7. char buf[] = Arrays.copyOf(value, len + otherLen);
  8. str.getChars(buf, len);
  9. return new String(buf, true);
  10. }

从源码可以看出:concat()拼接的原理是使用Arrays.copyOf()方法复制了一个新char[]数组,再返回一个新String。因此concat()方法也只适用于字符串比较少的情况,因为当字符串很多时,会创建很多新对象。concat()比“+”效率稍微高点,但只能用于拼接字符串。

StringUtils.join()

使用StringUtils.join()方法需要引入org.apache.commons.lang3包,源码如下:

  1. public static String join(Iterator<?> iterator, String separator) {
  2. if(iterator == null) {
  3. return null;
  4. } else if(!iterator.hasNext()) {
  5. return "";
  6. } else {
  7. Object first = iterator.next();
  8. if(!iterator.hasNext()) {
  9. String buf1 = ObjectUtils.toString(first);
  10. return buf1;
  11. } else {
  12. StringBuilder buf = new StringBuilder(256);
  13. if(first != null) {
  14. buf.append(first);
  15. }
  16. while(iterator.hasNext()) {
  17. if(separator != null) {
  18. buf.append(separator);
  19. }
  20. Object obj = iterator.next();
  21. if(obj != null) {
  22. buf.append(obj);
  23. }
  24. }
  25. return buf.toString();
  26. }
  27. }
  28. }

StringUtils.join()需要传两个参数,第一个参数数组或者集合,第二个参数为拼接符。
有源码可以看出,方法内部使用的是StringBuilder来拼接字符串的,效率很高。

String.join()

String.join()是java8新加的方法,源码如下:

  1. public static String join(CharSequence delimiter,
  2. Iterable<? extends CharSequence> elements) {
  3. Objects.requireNonNull(delimiter);
  4. Objects.requireNonNull(elements);
  5. StringJoiner joiner = new StringJoiner(delimiter);
  6. for (CharSequence cs: elements) {
  7. joiner.add(cs);
  8. }
  9. return joiner.toString();
  10. }

可以看出,拼接时主要是调用了StringJoiner.add()方法,接着往下看;

  1. public StringJoiner add(CharSequence newElement) {
  2. prepareBuilder().append(newElement);
  3. return this;
  4. }

可以看到,add()方法中调用了prepareBuilder(),接着往下看;

  1. private StringBuilder prepareBuilder() {
  2. if (value != null) {
  3. value.append(delimiter);
  4. } else {
  5. value = new StringBuilder().append(prefix);
  6. }
  7. return value;
  8. }

从这里已经可以看出来,String.join()方法内部也是创建了StringBuilder对象,使用了StringBuilder来拼接的字符串。
注意:String.join()与StringUtils.join()方法的区别是:String.join()第一个参数为拼接符,第二个是数据或集合,而且数组或集合必须是继承CharSequence对象才行。

发表评论

表情:
评论列表 (有 0 条评论,426人围观)

还没有评论,来说两句吧...

相关阅读

    相关 字符串拼接方式

    \+ 号拼接 通过`+`拼接是最常见的拼接方式,这个应该算是最简单的一种方式了,但是很遗憾得玩告诉你,阿里巴巴在他们的规范里面之处不建议在 for 循环里面使用 “+”