当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

        在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

58422cbfc4738f98ce1c69c26c5889b7016.jpg

String常用方法:

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

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

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

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

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

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

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

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

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

ed47594e4e2c11e5517952bda15a13663c9.jpg         

注意:

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

2.String的对象不可变

098a46d4ac86b016e570c1d57611c0070b2.jpg

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

451a0f2e887124165318d0910715e875693.jpg

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

2. StringBuffer

76a088b2c78b2725f249d01aaac64a3ab7e.jpg

348c50773408ec456af5f6d0fffd6e286e9.jpg

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

看下面的案例就明白了

0239d47ff547c2f24599d5f0eaf1641803c.jpg

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

StringBuffer常用方法:

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

2.append()          向StringBuffer增加字符

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

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

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

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

StringBuffer的append方法源码解读:

54c519f69db61c95b2c91f73bd06a9880f3.jpg

a248ac03f7a778bf2fc87cbf17d2021e58e.jpg

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

7b91dba0e4a898112cd402ede6671ec7cd7.jpg 

1ce1a2de74d9f9e9a0b5a57c76a4114aa1b.jpg

aee8353c3460f5f9b529e88d0dfb3ba8e03.jpg

6a6e9e77a96a39a33465c7d01135a96b56c.jpg

5e1065447b0410be1883b7cc6cc1b530801.jpg

613de619050047539c30999612b6e4bc08e.jpg

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

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

3. StringBuilder

cf4cab5758d8ef24ed2c20eff57a4cb3a95.jpg     

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

 

转载于:https://my.oschina.net/zss1993/blog/1838615

相关文章:

  • 主题 :学习与自我提升
  • php 向关联数组头部插入key value 保持数组关系不变
  • excel导出 ajax错误判断 数据为空判断
  • 分分钟用上C#中的委托和事件
  • python-day2-06-列表
  • 【短文】为什么我不在PHP的私有变量用下划线了?
  • angular-路由与导航部分梳理
  • C# Web Api一个小例子
  • 数塔-动态规划-ccf
  • 【Matplotlib】利用Python进行绘图
  • 单体架构风格
  • CSS outline和border区别
  • python学习之老男孩python全栈第九期_day009之文件操作总结
  • 复杂性研究相关论文
  • 我与Linux系统的藕断丝连
  • (三)从jvm层面了解线程的启动和停止
  • 【Amaple教程】5. 插件
  • 【前端学习】-粗谈选择器
  • 【刷算法】求1+2+3+...+n
  • Angular 2 DI - IoC DI - 1
  • CSS 三角实现
  • css选择器
  • gulp 教程
  • iOS小技巧之UIImagePickerController实现头像选择
  • Magento 1.x 中文订单打印乱码
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 简单实现一个textarea自适应高度
  • 使用parted解决大于2T的磁盘分区
  • 我建了一个叫Hello World的项目
  • 写代码的正确姿势
  • 应用生命周期终极 DevOps 工具包
  • 用Python写一份独特的元宵节祝福
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Java总结 - String - 这篇请使劲喷我
  • scrapy中间件源码分析及常用中间件大全
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • !!java web学习笔记(一到五)
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #define 用法
  • #大学#套接字
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (二)Linux——Linux常用指令
  • (九)信息融合方式简介
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)编辑寄语:因为爱心,所以美丽
  • ****Linux下Mysql的安装和配置
  • ..回顾17,展望18
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式