Java字符串拼接选择的三种方式

简介: Java字符串拼接选择的三种方式

Java全能学习+面试指南:https://javaxiaobear.cn

一般我们拼接字符串的方式有三种:

  • 加号
  • concat方法
  • StringBuilder的append()方法
//加号 str += "xiaobear"     //concat方法 str = str.concat("xiaobear")

测试性能

分别对上面三种方式循环5w次

public class StringTest {     public static void main(String[] args) {         doWithAdd();         doWithConcat();         doWithStringBuilder();    }     public static void doWithAdd(){         StopWatch stopWatch = new StopWatch();         String s = null;         stopWatch.start("add");         for (int i = 0; i < 50000; i++) {             s += "xiaobear";        }         stopWatch.stop();         System.out.println("add耗时:" + (stopWatch.getTotalTimeMillis()) + "ms");    }     public static void doWithConcat(){         StopWatch stopWatch = new StopWatch();         String s = "1";         stopWatch.start("concat");         for (int i = 0; i < 50000; i++) {             s = s.concat("xiaobear") ;        }         stopWatch.stop();         System.out.println("concat耗时:" + (stopWatch.getTotalTimeMillis()) + "ms");    }     public static void doWithStringBuilder(){         StopWatch stopWatch = new StopWatch();         StringBuilder s = new StringBuilder("1");         stopWatch.start("StringBuilder");         for (int i = 0; i < 50000; i++) {             s.append("xiaobear");        }         stopWatch.stop();         System.out.println("StringBuilder耗时:" + (stopWatch.getTotalTimeMillis()) + "ms");    } }
add耗时:7320msconcat耗时:2001msStringBuilder耗时:1ms

加号的执行时间为7320ms,concat方法的执行时间为2001ms,而StringBuilder几乎接近0,时间非常短;

说明在拼接字符串上,append()方法最快,concat 方法次之,加号最慢;

“+” 方法拼接字符串

虽然编译器对子­符串的加号做了优化,它会使用StringBuilderd的append方法进行追加,按道理来说, 其执行时间也应该是 0 毫秒,最终是通过toString()转换为字符串的

示例中的“+”拼接的代码与如下代码相同

str += "xiaobear" str = new StringBuilder(str).append("xiaobear").toString();

它与StringBuilder的append()是不同的:

  • 每次循环都会创建一个StringBuilder对象
  • 拼接完成后,会调用toString()转换为字符串

所以耗时就消耗在这里了

concat方法拼接字符串

//源码 public String concat(String str) {     //如果拼接的字符串为0,则返回字符串本身     if (str.isEmpty()) {         return this;    }     //获取原字符数组的长度     int len = value.length;     //获取拼接字符串的长度     int otherLen = str.length();     //数组拷贝     char buf[] = Arrays.copyOf(value, len + otherLen);     //拼接字符串转化为字符数组,添加到buf     str.getChars(buf, len);     //返回一个新的字符串     return new String(buf, true); }

整体看上去是一个数组拷贝,内存中处理的也是原子操作,速度很快,但是最后返回的,都会创建一个新的String对象,循环5w次,就创建了5w个String对象

append方法拼接字符串

public AbstractStringBuilder append(String str) {     //拼接字符串为空,返回空字符串     if (str == null)         return appendNull();     //获取字符串长度     int len = str.length();     //加长,并进行数组拷贝     ensureCapacityInternal(count + len);     //字符串复制到目标数组     str.getChars(0, len, value, count);     //count长度增加     count += len;     return this; }

append()方法都在做字符串数组处理,加长,数组拷贝,没有新建任何对象,所以速度是最快的!

三者的实现不同,性能也就不同,并不是我们一定要使用StringBuilder,对于简单的拼接,“+”号更能简化代码,符合我们日常的使用习惯,阅读性也好一点;

在性能层面上,才去考虑使用concat()方法或append()方法;

相关文章
|
3月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
64 1
|
21天前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
95 60
|
11天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
33 6
|
1月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
46 15
|
1月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
50 4
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
51 3
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
18 2
|
2月前
|
存储 移动开发 Java
java核心之字符串与编码
java核心之字符串与编码
22 2
|
2月前
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
727 4