Java深究之String、StringBuffer、StringBuilder的区别

Wesley13
• 阅读 859

        在Java学习中,String、StringBuffer、StringBuilder三者是很重要的,在编写代码中经常使用到他们,那么深入的了解他们的异同是非常重要的,接下里我们详细剖析下这三个的异同之处

首先总结下这三者的区别:

1.基本区别

String的对象不可变,StringBuffer和StringBuilder的对象是可变的

2.性能区别

三者中StringBuilder执行速度最佳,StringBuffer次之,String的执行速度最慢(String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,String对象一旦创建后该对象是不可更改的,后两者的对象是变量是可以更改的)

3.安全区别

String、StringBuffer是线程安全的,StringBuilder是线程不安全的(所以如果程序是单线程的使用StringBuilder效率高,如果是多线程使用StringBuffer或者String)

其次总结下这三者的相同:

1.三者在java中都是用来处理字符串的

2.三个类都被final修饰,因此都是不可继承的

3.StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)

接下来我们从源码和案例深入分析这三者:

1.String

Java深究之String、StringBuffer、StringBuilder的区别

String常用方法:

1.length()           获取字符串长度

2.replace()          替换字符串中某些字符

3.equals()            比较两个字符对象内容是否相同

4.substring()       截取一个新的字符串,它是此字符串中的子串

5.trim()               将字符串开头的空白(空格)和尾部的空白去掉

6.indexOf()         求某个字符在字符串中的位置

7.charAt()           求一个字符串中某个位置的值

8.toLowerCase() 将字符串中所有的大写改变成小写

9.toUpperCase() 将字符串中所有的小写改变为大写

Java深究之String、StringBuffer、StringBuilder的区别           

注意:

1.String是final类型,不可被继承;

2.String的对象不可变

Java深究之String、StringBuffer、StringBuilder的区别

从上面这个案例我们发现a对象的内容被改变了,不是说不能改变么,这里我们不能被表面迷惑,我们再看下面的程序

Java深究之String、StringBuffer、StringBuilder的区别

我们发现字符串a被重新赋值后其实已经不是它自己了,从hashCode值可以看出。当a字符串创建赋值maxbill,然后重新赋值时又会创建一个a对象值为:maxbill1993,此时844527467是一已经在等待GC回收了,我们看到的实际上是-1438782163对象。所以我们在程序中对字符串使用+连接时,并不是把内容动态的改变进去,而是每次都会创建一个新的String对象去放新的字符内容,原来的对象会等着GC回收,所以这也是String为啥相比其他两者执行慢的原因了。

2. StringBuffer

Java深究之String、StringBuffer、StringBuilder的区别

Java深究之String、StringBuffer、StringBuilder的区别

从StringBuffer类的源码可以看出,其方法都被同步锁synchronized修饰,因此是线程安全的,因此在多线程编程中操作字符串是推荐使用为什么说StringBuffer比String的执行速度要高,前面说了String的原理,是导致其慢的原因,StringBuffer相比快是因为使用了字符串变量,是可以动态改变的,不必像String一样总是去创建对象赋值新内容,我们

看下面的案例就明白了

Java深究之String、StringBuffer、StringBuilder的区别

由上面的案例可以看出StringBuffer在修改字符串内容时,不会创建新的对象,因此它比String类效率更高

StringBuffer常用方法:

1.length()             获取StringBuffer字符长度

2.append()          向StringBuffer增加字符

3.delete()             删除StringBuffer中的字符

4.replace()           替换StringBuffer中的字符

5.insert()              向StringBuffer中插入字符

6.toString ()         把StringBuffer转成字符串      

StringBuffer的append方法源码解读:

Java深究之String、StringBuffer、StringBuilder的区别

Java深究之String、StringBuffer、StringBuilder的区别

调用了父类的append方法,我们看下父类append的源码

Java深究之String、StringBuffer、StringBuilder的区别   

Java深究之String、StringBuffer、StringBuilder的区别

Java深究之String、StringBuffer、StringBuilder的区别

Java深究之String、StringBuffer、StringBuilder的区别

Java深究之String、StringBuffer、StringBuilder的区别

Java深究之String、StringBuffer、StringBuilder的区别

基本原理:使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容,构建新的存储空间更大的字符串,将旧的数据的复制过去

详细原理:char value[]用来存储数据,int count用来记录字符长度,StringBuffer初始16个字符容量 ,先记录下传进来字符串的长度,然后使用ensureCapacityInternal函数判是否需要扩容,如果容量不够则使用newCapacity进行扩容,新容量扩为原来2倍+2,存储容量够了使用getChars函数复制数据,最后将count更新。

3. StringBuilder

Java深究之String、StringBuffer、StringBuilder的区别       

StringBuilder和StringBuffer的使用方法和原理基本一致的,唯一的区别就是StringBuilder是线程不安全的,执行效率要比StringBuffer高,因此当时单线程的时候推荐使用线程不安全的StringBuilder效率更高一些,如果是多线程推荐使用StringBuffer来保证线程安全

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java中的String,StringBuilder,StringBuffer三者的区别
Java中的String,StringBuilder,StringBuffer三者的区别(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fsufeng%2Fp%2F6659064.html)
Easter79 Easter79
3年前
String
一,String,StringBuffer,StringBuilder三者之间的关系三个类的关系:StringBuffer和StringBuilder都继承自AbstractStringBuilder这个类,而AbstractStringBuilder和String都继承自Object这个类(Object是所有java类的超类)
Easter79 Easter79
3年前
String的相关类和方法
String的相关类和方法一、String,StringBuilder,StringBuffer三者的区别这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面1、运行速度:StringBuilderStringBufferStringString为字符串常量,而StringBuilder和StringBuffe
Stella981 Stella981
3年前
BATJ的常见java面试题
JAVA基础1.JAVA中的几种基本数据类型是什么,各自占用多少字节。2.String类能被继承吗,为什么。不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。3.String,Stringbuffer,StringBuilder的区别。String字符串常量StringBuffer
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。