关于String,StringBuffer和StringBuilder之间的区别和联系
本文来说下关于String,StringBuffer和StringBuilder之间的区别和联系
文章目录
- 概述
- String 和 StringBuffer
- StringBuilder
- 本文小结
概述
用来处理字符串常用的类有3种:String、StringBuffer和StringBuilder。
三者之间的区别
- 都是final类,都不允许被继承;
- String类长度是不可变的,StringBuffer和StringBuilder类长度是可以改变的;
- StringBuffer类是线程安全的,StringBuilder不是线程安全的;
String 和 StringBuffer
String类型和StringBuffer类型的主要性能区别:String是不可变的对象,因此每次在对String类进行改变的时候都会生成一个新的string对象,然后将指针指向新的string对象,所以经常要改变字符串长度的话不要使用string,因为每次生成对象都会对系统性能产生影响,特别是当内存中引用的对象多了以后,JVM的GC就会开始工作,性能就会降低;
使用StringBuffer类时,每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用,所以多数情况下推荐使用StringBuffer,特别是字符串对象经常要改变的情况;
在某些情况下,String对象的字符串拼接其实是被Java Compiler编译成了StringBuffer对象的拼接,所以这些时候String对象的速度并不会比StringBuffer对象慢,例如:
String s1 = “This is only a” + “ simple” + “ test”;StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
生成 String s1对象的速度并不比 StringBuffer慢。其实在Java Compiler里,自动做了如下转换:
Java Compiler直接把上述第一条语句编译为:String s2 = “This is only a”;String s3 = “ simple”;String s4 = “ test”;String s1 = s2 + s3 + s4;
这时候,Java Compiler会规规矩矩的按照原来的方式去做,String的concatenation(即+)操作利用了StringBuilder(或StringBuffer)的append方法实现,此时,对于上述情况,若s2,s3,s4采用String定义,拼接时需要额外创建一个StringBuffer(或StringBuilder),之后将StringBuffer转换为String;若采用StringBuffer(或StringBuilder),则不需额外创建StringBuffer。
StringBuilder
StringBuilder是5.0新增的,此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
使用策略
1、基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。
2、不要使用String类的”+”来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则,例如:
String result = "";for (String s : hugeArray) {result = result + s;
}// 使用StringBuilder
StringBuilder sb = new StringBuilder();for (String s : hugeArray) {sb.append(s);
}String result = sb.toString();
当出现上面的情况时,显然我们要采用第二种方法,因为第一种方法,每次循环都会创建一个String result用于保存结果,除此之外二者基本相同
3、 StringBuilder一般使用在方法内部来完成类似”+”功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中
4、相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer
本文小结
本文详细介绍了关于String,StringBuffer和StringBuilder之间的区别和联系。
关于String,StringBuffer和StringBuilder之间的区别和联系相关推荐
- String、StringBuffer、StringBuilder之间的区别 简明介绍
主要区别: ① String会消耗更多的内存空间,加重JVM的负担: ②StringBuffer和StringBuilder在声明和操作时只会占用一个空间节约内存空间: ③StringBuffer和S ...
- StringBuffer类,StringBuffer类和String的区别、String,StringBuffer,StringBuilder之间的区别
1.概述 StringBuffer是一个线程安全的可变序列. 2.StringBuffer与String区别 (1)StringBuffer的长度和内容都可以发生改变,String却不行 (2)Str ...
- String, StringBuffer, StringBuilder之间的区别
String与StringBuffer/StringBuilder之间的主要区别 1.String对象不可变, 如果修改会重新创建一个对象, 然后把值保存进去. StringBuffer/String ...
- String,StringBuffer与StringBuilder的区别
String,StringBuffer与StringBuilder的区别 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全 ...
- String与StringBuffer和StringBuilder的根本区别
*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...
- String String.valueof() toString三者之间的区别~
String String.valueof() toString三者之间的区别~ (String )强制类型转换,使用这种方法时,需要注意的是类型必须能转成String类型.因此最好用instan ...
- Java中String StringBuffer和StringBuilder的区别是什么
String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的? 可变性 简单的来说:String 类中使用 final 关键字修饰字符数组来保存 ...
- String、StringBuffer与StringBuilder之间区别
String StringBuffer StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...
- [转]String、StringBuffer与StringBuilder之间区别
String是一个不可变对象,每次对String对象操作时都是产生新的对象,然后将指向新的String对象,故如果涉及大量对String的操作时会造成资源的浪费. 一.Java String 类--S ...
最新文章
- 《Linux 命令行大全》. pdf 正式发布啦!
- DWZ与KindEditor编辑器的整合
- 1.10 对象序列化控制输入输出
- vs2019使用webview2开发web浏览器
- oracle between and monday,oracle——时间
- 三问(why?what?how?)金融领域的机器学习
- 如何通过索引说数据库优化能力
- 重设域控还原模式密码
- LeetCode每日一题——剑指 Offer 10- I. 斐波那契数列
- 排序算法积累(3)-----快速排序
- apt安装openjdk8
- (String)、toString()、String.valueOf区别
- 光通信仿真软件Optisystem 15.0 学习版
- eclipse 版本 发行版本
- 安利一些电子图书下载网站
- 检查服务器端口占用,服务器中如何检查端口是否开放
- angular写的移动端模板《一》
- Leetcode笔记 每日一题 824. 山羊拉丁文 (22.04.21)
- keep-alive 是什么?
- win10+AV1+VS2017 编译器内部错误