java8 stringbuilder_为什么 Java 8 中不需要 StringBuilder 拼接字符串
在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 拼接字符串相关推荐
- java8 stringbuilder_为什么 Java 8 中不再需要 StringBuilder 拼接字符串
在Java开发者中,字符串的拼接占用资源高往往是热议的话题. 让我们深入讨论一下为什么会占用高资源. 在Java中,字符串对象是不可变的,意思是它一旦创建,你就无法再改变它.所以在我们拼接字符串的时候 ...
- 为什么Java 8中不再需要StringBuilder拼接字符串
在Java开发者中,字符串的拼接占用资源高往往是热议的话题. 让我们深入讨论一下为什么会占用高资源. 在Java中,字符串对象是不可变的,意思是它一旦创建,你就无法再改变它.所以在我们拼接字符串的时候 ...
- c++ 字符串拼接_源码上看 .NET 中 StringBuilder 拼接字符串的实现
专注分享C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协 ...
- 站长在线python精讲:在Python中使用“+”运算符来拼接字符串详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用"+"运算符来拼接字符串详解>.本知识点主要内容有:在Python中,我们可以使用& ...
- java8 bigdecimal_在java 8中并行使用BigDecimal进行分组和求和
我有一个产品列表,其中包含其中一个属性.并且列表可以包含公共产品名称,其他属性不同.所以我想按产品和使用分组和求和在java 8中共享公用名的产品数量的总和对列表进行分组. Example: [ { ...
- JAVA语言中数字、字符和字符串处理
前言: JAVA语言中针对数字.数学运算.字符.字符串有专门的类,分别是Number.Math.Character和String. 1.数字: JAVA对数字处理的相关方法被封装在java.lang包 ...
- Java中如何高效的拼接字符串
目录 写在前面 常规的字符串拼接方法 写在前面 这是一篇非常基础的文章,将会演示如何使用Java正确高效的拼接字符串. 这些问题也是我们应该注意的基础的性能优化技巧. 常规的字符串拼接方法 使用'+' ...
- java addslashes_PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
本文实例讲述了PHP中addslashes()和stripslashes()实现字符串转义和还原用法.分享给大家供大家参考,具体如下: PHP中addslashes() 函数返回在预定义字符之前添加反 ...
- java8收集器,Java 8中的收集器collectionAndThen()方法
collectingAndThen()Java Collectors类中的方法使Collector适应于执行其他完成转换.它返回执行下游收集器动作的收集器,然后执行附加的结束步骤. 语法如下.stat ...
最新文章
- Java GC 日志详解
- Hadoop集群搭建(二:集群主机间免密登录配置)
- android电源驱动程序,[转]Android虚拟电源管理驱动
- Android中Fragment+ViewPager的配合使用
- 用数据可视化解读:为何2亿国人爱钓鱼
- 个人对北理工2020级硕士研究生张××一篇学术论文涉嫌抄袭的看法
- React系列---Babel
- vue 组件 全局组件和局部组件component
- python病毒usb文件自动安装_将文件自动复制到USB上
- 技术迭代快速。PyTorch 真的优于Tensorflow吗?
- 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大
- php网页文件在,php是网页文件吗
- 六爻:占卜记录(By eof)
- App Ratings and Reviews
- STM32之DAC音频播放
- html5 打字机效果,使用JavaScript制作打字机文本效果
- 404错误代码页面 调用自动获取小姐姐图片
- 树莓派离线语音唤醒snowboy
- 微信小程序有哪些?401~500
- 前序遍历、中序遍历、后序遍历层序遍历详解附代码(数据结构C语言)
热门文章
- android sd卡不可写,Android检查SD卡是否可读写
- MySQL 删除用户
- Java三种随机数生成方法
- Android Studio 创建第一个项目应用
- simpledateformat格式_如何使用SimpleDateFormat?
- mysql数据库(4): 创建并选择数据库
- 【youcans 的 OpenCV 例程 200 篇】102. 陷波带阻滤波器的传递函数
- C++纯虚函数与抽象类
- fetch用英语解释_fetch的意思在线翻译,解释fetch中文英文含义,短语词组,音标读音,例句,词源,同义词【澳典网ODict.Net】...
- c语言竞赛成绩排序,吧内编程竞赛:成绩公布