在Java开发者中,字符串的拼接占用资源高往往是热议的话题.

让我们深入讨论一下为什么会占用高资源。

在Java中,字符串对象是不可变的,意思是它一旦创建,你就无法再改变它。所以在我们拼接字符串的时候,创建了一个新的字符串,旧的被垃圾回收器所标记。

如果我们处理上百万的字符串,然后,我们就会生成百万的额外字符串被垃圾回收器处理。

虚拟机底层在拼接字符串时执行了众多操作。拼接字符串最直接的点操作(dot operator)就是String#concat(String)操作。

public String concat(String str) {

int otherLen = str.length();

if (otherLen == 0) {

return this;

}

int len = value.length;

char buf[] = Arrays.copyOf(value, len + otherLen);

str.getChars(buf, len);

return new String(buf, true);

}

public static char[] copyOf(char[] original, int newLength) {

char[] copy = new char[newLength];

System.arraycopy(original, 0, copy, 0,

Math.min(original.length, newLength));

return copy;

}

void getChars(char dst[], int dstBegin) {

System.arraycopy(value, 0, dst, dstBegin, value.length);

}

你可以看到一个字符数组被创建,长度则是已有字符和拼接的字符长度之和。然后,它们的值复制到新的字符数组中。最后,用这个字符数组创建一个String对象并返回。

所以这些操作繁多,如果你计算一下,会发现是O(n^2)的复杂度。

为了解决这个问题,我们使用StringBuilder类。它就像可变的String类。拼接方法帮助我们避免不必要的复制。它拥有O(n)的复杂度,远远优于O(n^2)。

然而Java 8默认使用StringBuilder拼接字符串。

Java 8的文档说明:

为了提高字字符串拼接的性能,Java编译器可以使用StringBuffer类或类似技术,在使用求值表达式时,减少中间String对象的创建。

Java编译器处理这种情况:

public class StringConcatenateDemo {

public static void main(String[] args) {

String str = "Hello ";

str += "world";

}

}

上面的代码会被编译成如下字节码:

public class StringConcatenateDemo {

public StringConcatenateDemo();

Code:

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

public static void main(java.lang.String[]);

Code:

0: ldc #2 // String Hello

2: astore_1

3: new #3 // class java/lang/StringBuilder

6: dup

7: invokespecial #4 // Method java/lang/StringBuilder."":()V

10: aload_1

11: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

14: ldc #6 // String world

16: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

19: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

22: astore_1

23: return

}

你可以在这些字节码中看到,使用了StringBuilder。所以我们在Java 8中不再需要使用StringBuilder类。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java8 stringbuilder_为什么 Java 8 中不需要 StringBuilder 拼接字符串相关推荐

  1. java8 stringbuilder_为什么 Java 8 中不再需要 StringBuilder 拼接字符串

    在Java开发者中,字符串的拼接占用资源高往往是热议的话题. 让我们深入讨论一下为什么会占用高资源. 在Java中,字符串对象是不可变的,意思是它一旦创建,你就无法再改变它.所以在我们拼接字符串的时候 ...

  2. 为什么Java 8中不再需要StringBuilder拼接字符串

    在Java开发者中,字符串的拼接占用资源高往往是热议的话题. 让我们深入讨论一下为什么会占用高资源. 在Java中,字符串对象是不可变的,意思是它一旦创建,你就无法再改变它.所以在我们拼接字符串的时候 ...

  3. c++ 字符串拼接_源码上看 .NET 中 StringBuilder 拼接字符串的实现

    专注分享C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协 ...

  4. 站长在线python精讲:在Python中使用“+”运算符来拼接字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用"+"运算符来拼接字符串详解>.本知识点主要内容有:在Python中,我们可以使用& ...

  5. java8 bigdecimal_在java 8中并行使用BigDecimal进行分组和求和

    我有一个产品列表,其中包含其中一个属性.并且列表可以包含公共产品名称,其他属性不同.所以我想按产品和使用分组和求和在java 8中共享公用名的产品数量的总和对列表进行分组. Example: [ { ...

  6. JAVA语言中数字、字符和字符串处理

    前言: JAVA语言中针对数字.数学运算.字符.字符串有专门的类,分别是Number.Math.Character和String. 1.数字: JAVA对数字处理的相关方法被封装在java.lang包 ...

  7. Java中如何高效的拼接字符串

    目录 写在前面 常规的字符串拼接方法 写在前面 这是一篇非常基础的文章,将会演示如何使用Java正确高效的拼接字符串. 这些问题也是我们应该注意的基础的性能优化技巧. 常规的字符串拼接方法 使用'+' ...

  8. java addslashes_PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例

    本文实例讲述了PHP中addslashes()和stripslashes()实现字符串转义和还原用法.分享给大家供大家参考,具体如下: PHP中addslashes() 函数返回在预定义字符之前添加反 ...

  9. java8收集器,Java 8中的收集器collectionAndThen()方法

    collectingAndThen()Java Collectors类中的方法使Collector适应于执行其他完成转换.它返回执行下游收集器动作的收集器,然后执行附加的结束步骤. 语法如下.stat ...

最新文章

  1. Java GC 日志详解
  2. Hadoop集群搭建(二:集群主机间免密登录配置)
  3. android电源驱动程序,[转]Android虚拟电源管理驱动
  4. Android中Fragment+ViewPager的配合使用
  5. 用数据可视化解读:为何2亿国人爱钓鱼
  6. 个人对北理工2020级硕士研究生张××一篇学术论文涉嫌抄袭的看法
  7. React系列---Babel
  8. vue 组件 全局组件和局部组件component
  9. python病毒usb文件自动安装_将文件自动复制到USB上
  10. 技术迭代快速。PyTorch 真的优于Tensorflow吗?
  11. 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大
  12. php网页文件在,php是网页文件吗
  13. 六爻:占卜记录(By eof)
  14. App Ratings and Reviews
  15. STM32之DAC音频播放
  16. html5 打字机效果,使用JavaScript制作打字机文本效果
  17. 404错误代码页面 调用自动获取小姐姐图片
  18. 树莓派离线语音唤醒snowboy
  19. 微信小程序有哪些?401~500
  20. 前序遍历、中序遍历、后序遍历层序遍历详解附代码(数据结构C语言)

热门文章

  1. android sd卡不可写,Android检查SD卡是否可读写
  2. MySQL 删除用户
  3. Java三种随机数生成方法
  4. Android Studio 创建第一个项目应用
  5. simpledateformat格式_如何使用SimpleDateFormat?
  6. mysql数据库(4): 创建并选择数据库
  7. 【youcans 的 OpenCV 例程 200 篇】102. 陷波带阻滤波器的传递函数
  8. C++纯虚函数与抽象类
  9. fetch用英语解释_fetch的意思在线翻译,解释fetch中文英文含义,短语词组,音标读音,例句,词源,同义词【澳典网ODict.Net】...
  10. c语言竞赛成绩排序,吧内编程竞赛:成绩公布