你必须搞清楚的String,StringBuilder,StringBuffer

String,StringBuilder 以及 StringBuffer 这三个类的关系与区别一直是 Java 的经典问题,这次就来讲一下关于这三个类的一些知识

一. 简单对比

  • String : 字符常量
  • StringBuilder : 字符变量
  • StringBuffer : 字符变量

String 属于常量类型,被声明为 final class,所有的属性也都是 final 类型,因此 String 对象一旦创建,便不可更改;
StringBuilder / StringBuffer 两个类属于变量类型,是可以更改的,它们都是为了解决字符串由于拼接产生太多中间对象的问题而提供的类。

  • 运行速度 StringBuilder > StringBuffer > String

  • 线程安全: StringBuffer
  • 非线程安全 : StringBuilder

StringBuilder 在本质上和 StringBuffer 没有太大区别,但是由于 StringBuilder 去掉了 StringBuffer 拥有的线程安全部分,因此有效减少了开销。因此,StringBuilder 是大部分情况下字符串拼接操作的首选

二. String 处理字符串

例一:

String s = "abcd";
s = s + "fgh";

很多人作这样的字符串处理的时候会误认为 String 类型是可变的。

但其实 JVM 处理这段代码的过程是这样的:首先创建 s 对象,赋值“abcd” ,然后处理第二行代码时,再创建一个 s 对象,赋值 “abcdfgh”,然后将第一个 s 对象垃圾回收。

所以相当于第一个 s 没更改过,第二个 s 是新的对象

例二:

String str = “This is only a” + “simple” + “test”;

这段代码相当于 String str = “This is only a simple test”;

例三:

String str2 = "This is only a";
String str3 = "simple";
String str4 = "test";
String str1 = str2 +str3 + str4;

这段代码同样会按照例一的过程来处理

三. StringBuilder / StringBuffer 构造特性

这两个对象在构造的过程中,首先按照默认大小申请一个字符数组(char[]), 默认容量为 16 个字符,但如果超出,会使用 Arrays.copyOf() 成倍扩容 16,32,64, 128...,当然这样会影响性能,因此可以在创建对象时按照需要自定义其容量

源代码:
//默认 16 个字符
public StringBuilder() {super(16);
}
//构造函数定义容量
public StringBuilder(int capacity) {super(capacity);
}

四. String 与 StringBuilder 处理字符串拼接对比

我们都知道,进行字符串拼接操作时推荐使用 StringBuilder,但是是不是什么时候都推荐使用 StringBuilder 来代替 String 进行字符串拼接?显然不是的。

例一:

String str = "123";
String str1 = str + "456";
String str2 = new StringBuilder().append(str).append("def").toString();

在这种情况下,两种处理方式效率差别不大

JDK 8 中, String 的字符串拼接操作会被编译器自动转换为 StringBuilder 并调用 append 方法,由于这样的优化方案,使得两个类在这种情况下的处理效率差别不大;而在 JDK 9 中,为了更加统一字符串操作优化,提供了 StringConcatFactory,作为一个统一的入口,更加优化了字符串拼接操作。

例二:

String str = "";
for (int i = 0; i < 1000; i++) {str += "12345";
}StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {stringBuilder.append("12345");
}

这种情况下,StringBuilder 更快

在循环中,每执行一次 “+”,都会创建一个 String 对象,因此会有大量对象创建和回收的消耗。

简单来说,在循环中对同一个字符串对象做字符串拼接,优先选择 StringBuilder

例三

String str1 = "123" + "456" + "789";String str2 = new StringBuilder("123").append("456").append("789").toString();

这种情况下,String 更快

我们都知道 String str1 = "123" + "456" + "789"; 其实是等同于 String str1 = "123456789";的,而 StringBuilder 反而需要多次调用 append 方法。

转载于:https://www.cnblogs.com/HowieYuan/p/9337181.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020年中国智慧城市发展值得关注的技术

文章来源&#xff1a;Gartner图片来源&#xff1a;网络每年Gartner发布的技术成熟度曲线&#xff08;The Hype Cycle&#xff09;报告都备受市场瞩目&#xff0c;也成为政府及企业做出重大投资决策的风向标。其原因在于&#xff0c;它不仅能够让CIO了解到年度最备受瞩目和极具商…

序列化,反序列化

今天看ArrayList的源代码&#xff0c;发现了里面的一个关键字transient 然后查了一下&#xff0c;发现这个关键字是用来防止序列化的 那什么是序列化呢&#xff1f;我又懵逼了 为什么需要序列化&#xff1f; 在当今的网络社会&#xff0c;我们需要在网络上传输各种类型的数…

腾讯研究院发布《2021数字科技前沿应用趋势》

来源 &#xff1a;腾讯研究院编辑&#xff1a; 陈近梅2021年1月9日&#xff0c;在腾讯研究院举办的“腾讯科技向善暨数字未来大会2021”上&#xff0c;《变量&#xff1a;2021数字科技前沿应用趋势》报告正式发布。该报告由腾讯研究院发起&#xff0c;先后访谈业界权威专家&…

linux导入pgsql日志目录,Centos下PostgreSQL安装及修改数据目录

记录下在Centos7.6 安装PostgreSQL数据库&#xff0c;版本10.12的过程&#xff0c;第一次装&#xff0c;遇到的坑太多了&#xff0c;网上教程坑也多&#xff0c;有的版本不一样方法不一样。花了半天时间…背景&#xff1a;内网服务器&#xff0c;搭了个sonarqube代码审计系统&a…

ArrayList的容量

ArrayList当容量放不下元素时&#xff0c;容量会自动扩大 那么如果把元素移除&#xff0c;容量会自动减小吗&#xff1f; package zhousai; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class test { public static void …

H3 BPM之流程包(流程Demo)导入导出

流程包是什么&#xff1f; 流程包指的是工作流从表单设计到流程设计产生的数据包&#xff0c;所有的表单逻辑和流程模型逻辑数据都包含在里面。由于各种厂商工作流软件运行机制不一样&#xff0c;流程包不支持在不同产品之间导入导出&#xff0c;只支持在同一款工作流软件里面导…

11大改革举措!国家自然科学基金2021年项目指南发布

来源&#xff1a;国家自然科学基金委员会网站编辑&#xff1a;宗华排版&#xff1a;李言1月15日&#xff0c;国家自然科学基金委员会网站更新了2021年度项目指南。点击链接进入&#xff1a;2021年项目指南未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&…

服务器win和linux系统安装教程,Win+linux双系统安装

导读如果你要安装linux系统&#xff0c;但是又不想换掉Win7的操作习惯&#xff0c;建议安装WinLinux双系统&#xff0c;随你个人喜好。下面介绍的是用U盘安装的方法。笔者使用的是华硕FX50J装的双系统&#xff0c;之前使用过Dell的游闸安装过&#xff0c;但是没有碰到那么多问题…

Servlet API

Servlet API:由两个软件包组成&#xff1a;对应于HTTP协议的软件包&#xff0c;对应于除HTTP协议以外的软件包 即Servlet API 可以适用于任何通信协议 我们学习的Servlet&#xff0c;是位于javax.servlet.http包中的类和接口&#xff0c;是基础HTTP协议 Servlet继承关系&…

hibernate框架学习之使用SQLQuery查询数据

SQLQuery对象的获取  Hibernate支持使用原生SQL语句进行查询&#xff0c;通过session对象获得SQLQuery对象进行&#xff0c;需要传入SQL语句  SQLQuery createSQLQuery(String sqlStr)  SQLQuery query session.createSQLQuery(“select * from tbl_user");sqlStr是…

Leetcode--135. 发糖果

老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻的孩子中&#xff0c;评分高的…

Linux下载cfg命令,Linux安装详解-配置ks.cfg实现自动安装过程

之前发过一篇关于通过PXE实现Linux批量无人值守自动安装的文章(可以参考http://www.linuxidc.com/Linux/2011-08/39949.htm)&#xff0c;不过写的只是具体的配置和操作&#xff0c;对于原理部分没有说明&#xff0c;最近通过一段时间的学习&#xff0c;把linux的启动安装过程深…

人类如何接近“宇宙无限”?微积分的力量无处不在

来源&#xff1a;遇见数学距离2021年高考还有不到两百天&#xff0c;当无数高中生还在为千军万马过独木桥儿紧锣密鼓准备之时&#xff0c;有部分初中生却已经一只脚踏入了清华大学的校门。2020年的最后一天&#xff0c;清华大学发布官方通知&#xff0c;将启动“丘成桐数学科学…

linux如何运行synaptic,Linux_Ubuntu 7.04 Synaptic软件包管理器功能,Ubuntu的新立得软件包管理器(Syn - phpStudy...

Ubuntu 7.04 Synaptic软件包管理器功能Ubuntu的新立得软件包管理器(Synaptic Package Manager)是APT(Advanced Package Tool)的图形界面&#xff0c;非常直观易用。但有时候是用文字模式远程登录到Ubuntu&#xff0c;或者安装的是Server版的Ubuntu&#xff0c;再或者有什么其它…

三层架构

1.三层架构 与MVC设计模式的目标一致&#xff0c;都是为了 解耦合&#xff0c;提高代码复用 区别&#xff1a;二者对项目理解的角度不同 2.三层组成&#xff1a; 表示层(USL,User Show Layer;视图层) 业务逻辑层(BLL,Business Logic Layer;Service层) 数据访问层(DAL,Dat…

这10个著名的思想实验,竟然是物理学家完成的

来源 &#xff1a; 知更社区在物理学中&#xff0c;有一类特殊的实验&#xff1a;它们不需要购置昂贵的仪器&#xff0c;不需要大量的人力物力&#xff0c;需要的只是有逻辑的大脑&#xff1b;而这种实验却可以挑战前人的结论&#xff0c;建立新的理论&#xff0c;甚至引发人们…

怎样查看Jdk是32位还是64位

怎样查看Jdk是32位还是64位、、 ------------- --------------- ------------- 其实还可以这样看哦、、 --------------- ------------- ---------------转载于:https://www.cnblogs.com/GaoNa/p/9352283.html

交叉编译及linux简单程序设计,嵌入式实验6交叉编译及Linux简单程序设计实验

实验六交叉编译及Linux简单程序设计实验的实验报告一实验目的1、了解和掌握交叉编译模式和方法&#xff1b;2、熟悉和掌握Linux简单程序设计。二实验环境预装Fedora10_A8_Linux的pc机一台&#xff0c;CVT-A8嵌入式实验箱一台(已构建嵌入式Linux系统)&#xff0c;以太网线一根&a…

计算机网络概念

计算机网络&#xff1a;将独立的&#xff0c;分散的计算机系统(手机&#xff0c;电脑)通过线路&#xff0c;通信设备(路由器&#xff0c;交换机)连接起来&#xff0c;由软件来实在资源共享&#xff0c;信息传递的系统 计算机网络的功能&#xff1a; 1. 数据通信 eg&#xff…

【创新应用】5AloT(5G+AI+物联网)深度研究报告:下一轮科技红利

来源&#xff1a;智能研究院当前正处于两轮科技红利之间&#xff0c;5AIoT(5GAI物联网)将成继移动互联网后&#xff0c;下一轮科技红利最大的机遇。智能手机和移动互联网连接数趋于饱和&#xff0c;但伴随 5G、wifi、AI 等技术发展、成本下降&#xff0c;以及场景逐渐成熟&…