String StringBuilder StringBuffer三者之间的区别~~~

   String StringBuilder  StringBuffer三者之间的区别~~~

String是字符串常量,它是典型的immutable类,被声明final class,所有的属性都是final,由于它的不变性,类似拼接,剪裁字符串等操作,都会产生新的对象,一旦创建,就不能改变了;

StringBuilder和StringBuffer是字符串变量,可以后期增加或减少;

StringBuilder是线程不安全的,其里面的方法实现并没有使用关键字 synchronized,适合用在单线程;

StringBuffer是线程安全的可修改字符串,它保证了线程安全,也随之带来了额外的性能开销,出给特殊强调,不然其还是推荐使用它的后继者,StringBuilder,StringBuffer里面的方法实现有使用synchronized关键字,适合用于多线程。


运行速度:String < StringBuffer <StringBuilder


eg:StringBuilder sb = new StringBuilder().append("abc").append("bcd");

System.out.println(StringBuilder.toString(sb));



更加详细的分析:



1 String

(1) String的创建机理


       由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。其 运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对象引用;如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。 但是,通过new方法创建的String对象是不检查字符串池的,而是直接在堆区或栈区创建一个新的对象,也不会把对象放入池中。上述原则只适用于通过 直接量给String对象引用赋值的情况


举例:String str1 = "123"; //通过直接量赋值方式, 放入字符串常量池
String str2 = new String(“123”);//通过new方式赋值方式, 不放入字符串常量池


注意: String提供了inter()方法。调用该方法时,如果常量池中包括了一个等于此String对象的字符串(由equals方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并且返回此池中对象的引用。




(2) String的特性
[A] 不可变。是指String对象一旦生成,则不能再对它进行改变。不可变的主要作用在于当一个对象需要被多线程共享,并且访问频繁时,可以省略同步和锁等待的时间,从而大幅度提高系统性能。 不可变模式是一个可以提高多线程程序的性能,降低多线程程序复杂度的设计模式。


[B] 针对常量池的优化。当2个String对象拥有相同的值时,他们 只引用常量池中的同一个拷贝。当同一个字符串反复出现时,这个技术可以大幅度节省内存空间。


2 StringBuffer/StringBuilder


StringBuffer和StringBuilder都实现了 AbstractStringBuilder抽象类,拥有几乎一致对外提供的调用接口; 其底层在内存中的存储方式与String相同,都是以一个有序的字符序列(char类型的数组)进行存储,不同点是StringBuffer/StringBuilder对象的值是可以改变的,并且值改变以后,对象引用不会发生改变;两者对象在构造过程中,首先按照默认大小申请一个字符数组,由于会不断加入新数据,当超过默认大小后,会创建一个更大的数组,并将原先的数组内容复制过来,再丢弃旧的数组。因此,对于较大对象的扩容会涉及大量的内存复制操作,如果能够预先评估大小,可提升性能。


唯一需要注意的是: StringBuffer是线程安全的,但是StringBuilder是线程不安全的。可参看Java标准类库的源代码,StringBuffer类中方法定义前面都会有synchronize关键字。为此,StringBuffer的性能要远低于StringBuilder。




3 应用场景


[A] 在字符串内容不经常发生变化的业务场景优先使用String类。例如:常量声明、少量的字符串拼接操作等。如果有大量的字符串内容拼接,避免使用String与String之间的“+”操作,因为这样会产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。


[B]在 频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程环境下,建议使用StringBuffer,例如XML解析、HTTP参数解析与封装。


[C]在频繁进行字符串的运算(如拼接、替换、删除等),并且 运行在单线程环境下,建议使用StringBuilder,例如SQL语句拼装、JSON封装等。

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

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

相关文章

qq传输文件的软件测试点,超强新功能 QQ传文件夹测试版抢先试用

QQ传文件夹测试版试用(1)中关村在线软件事业部消息 腾讯体验中心今日(7月29日)发布了一个新的体验项目“QQ2009传文件夹测试版”。QQ的传文件功能&#xff0c;相信多数用户都使用过。在之前的版本中&#xff0c;很多用户反馈希望增加传文件夹的功能&#xff0c;方便多文件的传输…

String String.valueof() toString三者之间的区别~

String String.valueof() toString三者之间的区别~&#xff08;String &#xff09;强制类型转换&#xff0c;使用这种方法时&#xff0c;需要注意的是类型必须能转成String类型。因此最好用instanceof做个类型检查&#xff0c;以判断是否可以转换。否则容易抛出CalssCastExc…

SpringBoot学习——@Autowired自动注入报:could not be found问题的理解和解决方案

微服务应用程序中&#xff0c;我们会通过Java后台的方式发送http请求并调用其他注册在Spring Cloud Eureka server上的微服务&#xff0c;之前我们可能会手动封装一个Http发送请求类&#xff0c;然后通过其中的sendGet或者sendPost方法借由java IO的形式发送出去。 但是&#…

黑色玫瑰服务器延迟高,LOL:含金量最高的服务器,黑色玫瑰垫底,最后一个钻石起步!...

原标题&#xff1a;LOL&#xff1a;含金量最高的服务器&#xff0c;黑色玫瑰垫底&#xff0c;最后一个钻石起步&#xff01;黑色玫瑰。它是英雄联盟中非常特别的一个大区。这个大区是中间位置&#xff0c;电十&#xff0c;却是比电二高手还要多的地方。因为这个大区小姐姐特别的…

redis学习与入门~~~

redis学习与入门~~~ 一。 Redis 简介&#xff1a; 通常而言目前的数据库分类有几种&#xff0c;包括 SQL/NSQL,&#xff0c;关系数据库&#xff0c;键值数据库等等&#xff0c;分类的标准也不1&#xff0c;Redis本质上也是一种键值数据库的&#xff0c;但它在保持键值数据库简单…

Java网络编程————UDP实现ThinkPad S5网络唤醒

功能要求&#xff1a;通过Java程序实现ThinkPad S5 笔记本网络唤醒 必备知识&#xff1a; 一、定义&#xff1a;网络唤醒&#xff0c;通过局域网、互联网或通讯网络&#xff0c;以有线网卡的形式&#xff0c;向目标电脑发送魔法包(Magic Packet)&#xff0c;让电脑自动开机。…

FFmpeg在Ubuntu的安装以及教程~~~

FFmpeg在Ubuntu的安装以及教程~~~一、安装 可通过PPA进行安装sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next sudo apt-get update sudo apt-get install ffmpeg 查看是否安装成功&#xff1a; ffmpeg -version二、相关概念比特率比特率&#xff0c;是一个决定音视…

Java学习指导————如何做到基础扎实

原文出处&#xff1a;《一篇文章教会你&#xff0c;如何做到招聘要求中的“要有扎实的Java基础”》 引言 不少同学总会产生这样的疑问&#xff1a; “请问&#xff0c;如何才叫基础扎实&#xff1f;” 答案是&#xff1a;“玩好JDK&#xff01;” JDK学习内容主要包含三部分…

奥特曼系列ol服务器名称带怪兽,《奥特曼系列ol》怪兽图鉴 怪兽阵容

《奥特曼系列ol》这款游戏中的怪兽图鉴也是很多玩家非常关注的问题之一哦&#xff0c;随着游戏的不断的更新&#xff0c;游戏也是加入了不少全新的玩法&#xff0c;一定让很多玩家觉得有些迷惑吧。下面小编为大家带来《奥特曼系列ol》怪兽图鉴以及怪兽阵容&#xff0c;希望大家…

继上一篇博客--javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

通过动态分配地址来提升javaweb文件下载接口的其兼容性和可扩展性&#xff1a; &#xff08;上篇博文地址&#xff1a;https://blog.csdn.net/weixin_37766296/article/details/80044000&#xff09;log4j.properties 文件&#xff1a; log4j.rootLogger debug,stdout,D,Elog4…

服务器主机启动不显示,服务器主机不启动怎么回事

服务器主机不启动怎么回事 内容精选换一换本文介绍了主机迁移服务SMS各特性版本的功能发布和对应的文档动态&#xff0c;新特性将在各个区域(Region)陆续发布&#xff0c;欢迎体验。源端服务器数据收集声明。源端服务器上安装和配置完迁移Agent后&#xff0c;迁移Agent会把源端…

Swagger自动接口文档生成框架————springboot整合swagger总结

swagger简介&#xff1a; swagger是一款开源的api接口文档生成工具。 Swagger的项目主页&#xff1a;https://swagger.io/ 目前比较流行的做法是在代码中加入swagger相关的注释&#xff0c;然后&#xff0c;利用小工具生成swagger.json或者swagger.yaml文件。 springboot…

申请 Let's Encrypt 数字证书,并安装cerbot快速上手教程~~

申请 Lets Encrypt 数字证书&#xff0c;并安装cerbot快速上手教程~~Let‘s Encrypt SSL证书介绍如今&#xff0c;越来越多的网站已经由HTTP迁移到HTTPS安全协议了。HTTPS不但能够避免网站内容在传输过程中被恶意篡改&#xff0c;切实保护访问者的权益&#xff0c;还能够让搜索…

Java常用设计模式————单例模式

单例模式简介 90%以上的设计模式都或多或少的应用了接口和抽象类&#xff0c;而单例比较特殊&#xff0c;并没有接口的应用。 单例Singleton指仅仅被实例化一次的类。通常被用来代表那些本质上唯一的系统组件。————《Effective Java》 数据库连接获取类的对象可以是单例的…

最简明扼要的 Systemd 教程,只需十分钟

systemctl常用命令介绍~~~Systemctl是一个systemd工具&#xff0c;主要负责控制systemd系统和服务管理器。 Systemd是一个系统管理守护进程、工具和库的集合&#xff0c;用于取代System V初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。启动及服务大多数主流发行版要…

Java常用设计模式————工厂模式

简介&#xff1a; 工厂模式&#xff08;Factory Pattern&#xff09;是Java中最常用的设计模式之一&#xff0c;又称多态工厂模式、虚拟构造器模式。属于创建型模式。 在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用一个共同的…

JavaScript新手入门教程大全~~~

JavaScript新手入门教程大全~~~一。 js教程介绍&#xff1a;JavaScript是一种运行在浏览器中的解释型的编程语言。 那么问题来了&#xff0c;为什么我们要学JavaScript&#xff1f;因为你没有选择。在Web世界里&#xff0c;只有JavaScript能跨平台、跨浏览器驱动网页&#xff0…

Java常用设计模式————抽象工厂模式

简介 每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。 与工厂方法模式的区别 工厂方法模式针对的是一个产品等级结构&#xff0c;而抽象工厂模式针对的是多个产品等级结构&#xff0c;因此抽象工厂模式在结构上要比工厂方法模式更加复杂和抽象&#xff0c;也更…

CSS新手入门教程~~~~

CSS新手入门教程~~~~CSS简介&#xff1a;什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中&#xff0c;是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在…

Docker必备知识整理

Docker简介 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 Docker是用Go语言…