java中String、StringBuffer和StringBuilder的区别(简单介绍)
java中String、StringBuffer和StringBuilder的区别(简单介绍)
简单介绍
java中用于处理字符串常用的有三个类:
1、java.lang.String
2、java.lang.StringBuffer
3、java.lang.StrungBuilder
三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。
StringBuffer是线程安全,可以不需要额外的同步用于多线程中;
StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;
StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。
String实现了三个接口:Serializable、Comparable<String>、CarSequence
StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。
1、首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:
1 String str="abc"; 2 System.out.println(str); 3 str=str+"de"; 4 System.out.println(str);
运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
另外,有时候我们会这样对字符串进行赋值
1 String str="abc"+"de"; 2 StringBuilder stringBuilder=new StringBuilder().append("abc").append("de"); 3 System.out.println(str); 4 System.out.println(stringBuilder.toString());
这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和String str="abcde";是完全一样的,所以会很快,而如果写成下面这种形式
1 String str1="abc"; 2 String str2="de"; 3 String str=str1+str2;
那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。
public static void main(String[] args) {long a=new Date().getTime();String cc="";int n=10000;for (int i = 0; i < n; i++) {cc+="."+i;}System.out.println("String使用的时间"+(System.currentTimeMillis()-a)/1000.0+"s");long s1=System.currentTimeMillis();StringBuilder sb=new StringBuilder();for (int i = 0; i < n; i++) {sb.append("."+i);}System.out.println("StringBuilder使用的时间"+(System.currentTimeMillis()-s1)/1000.0+"s");long s2=System.currentTimeMillis();StringBuffer sbf=new StringBuffer();for (int i = 0; i < n; i++) {sbf.append("."+i);}System.out.println("StringBuffer使用的时间"+(System.currentTimeMillis()-s2)/1000.0+"s");}
2. 再来说线程安全
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
(一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞)
3. 总结一下
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
java中String、StringBuffer和StringBuilder的区别(简单介绍)相关推荐
- Java中String StringBuffer和StringBuilder的区别是什么
String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的? 可变性 简单的来说:String 类中使用 final 关键字修饰字符数组来保存 ...
- 【翻译】Java中String, StringBuffer, StringBuilder的区别
2019独角兽企业重金招聘Python工程师标准>>> String 是 Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会 用String定义一些内容,然后通过著 ...
- Java中string拼接,StringBuilder,StringBuffer和+
Java中string拼接,StringBuilder,StringBuffer和+,到底哪个更合适? StringBuilder线程不安全,效率较线程安全的StringBuffer高.jdk1.5之 ...
- String,StringBuffer与StringBuilder的区别
String,StringBuffer与StringBuilder的区别 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全 ...
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- String,StringBuffer与StringBuilder的区别??
2019独角兽企业重金招聘Python工程师标准>>> String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全 ...
- String,StringBuffer与StringBuilder的区别?
http://blog.csdn.net/rmn190/article/details/1492013 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuil ...
- Java中的StringBuffer、StringBuilder和包装器类型
1.如何使用StringBuffer类? 答:1).StringBuffer类用于表示可以修改的字符串,称为字符串缓冲对象: 2).使用运算符的字符串将自动创建字符串缓冲对象: 例:str1 + st ...
- String,StringBuffer与StringBuilder的区别以及String为什么是不可变的?
String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要 ...
- String,StringBuffer和StringBuilder的区别
一.可变性 不同于String类的不可变性,StringBuffer和StringBuilder都继承了抽象类AbstractStringBuilder,这个类用一个char数组来存储value. a ...
最新文章
- 2021年大数据Spark(十一):应用开发基于IDEA集成环境
- LeetCode 42. Trapping Rain Water--算法题--c++解法
- 消除ubuntu16.04自带的alt快捷键
- C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)
- MATLAB学习笔记(七)
- HashMap + 软引用进行缓存
- JAVA大数据习题Week2
- 在windows下把txt文件改为utf8格式
- Deepin使用苹果主题
- linux快速迁移超大文件,Linux下快速迁移海量文件的操作记录
- 上班工作压力太大?来玩个游戏解压下
- 优矿python开源_PythonStock(8):使用优矿web学习python入门
- pvr.ccz 与 png 格式 互转的解决方案
- Android 发送短信
- 基于4G工业路由器的智慧厕所管理方案
- 回归学习算法---偏最小二乘回归、PCA降维与理论
- 前端集成解决方案(webpack、gulp)
- WIN10系统下运行地下管线数据处理系统
- 中科创达怎么样-融合智能工业视觉平台再获奖项
- 猿团君分析-程序员如何成功的提高影响力2.0
热门文章
- Mxnet框架学习笔记(二):Kaggle房价预测实战分析
- python k线合成_在VNPY中策略中,使用分钟线合成日K线
- Docker设置容器CPU、memory、磁盘IO资源限制
- Kubernetes 小白学习笔记(33)--kubernetes云原生应用开发-总结
- linux启动hbase_HBase集群环境配置
- 基于springboot的鲜花商城系统
- java图片工具类_Java 下载图片下载文件 工具类
- oracle的解析器,Oracle中sql量化分析工具
- mysql 主从 外部连接_集群之MYsql主从服务之引伸出Mysql互为主从(环形结构)外加简单实现自己个人的负载均衡器(3)-阿里云开发者社区...
- mysql handbook_MySQL 8 Administrator’s Guide