String的特性

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

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

对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

如以下代码: Java代码

        String s1 = "china"; String ss1 = new String("china"); 

这里解释一下,对于通过 new 产生一个字符串(假设为 ”china” )时,会先去常量池中查找是否已经有了 ”china” 对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此 ”china” 对象的拷贝对象。

也就是有道面试题: String s = new String(“xyz”); 产生几个对象?

一个或两个。如果常量池中原来没有 ”xyz”, 就是两个。如果原来的常量池中存在“xyz”时,就是一个。

对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。

StringBuffer/StringBuilder

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

字符串缓冲区容量默认值是16,达到最大容量的时候,它会将自身容量增加到当前的2倍再加2。而初始化长度=默认值+参数长度。看下面一个例子:

String,StringBuffer和StringBuilder比较

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。

1.首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

  String最慢的原因:

  String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

2. 再来说线程安全

  在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。

  如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

3. 总结

  String:适用于少量的字符串操作的情况

  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

【Java】String,StringBuffer和StringBuilder区别相关推荐

  1. String,StringBuffer和StringBuilder区别?

    String是字符串常量,final修饰;StringBuffer字符串变量(线程安全);StringBuilder 字符串变量(线程不安全).此外StringBuilder和StringBuffer ...

  2. String,StringBuffer与StringBuilder的区别

    String,StringBuffer与StringBuilder的区别 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全 ...

  3. String、StringBuffer、StringBuilder区别

    无论是做Java或是Android,都避免不了遇到这个问题,其实开发过程中一般情况下是不会纠结,这个问题是面试必选经典题,今天有时间,就总结一下. String.StringBuffer.String ...

  4. `java`学习笔记(十二)`Java`--`String``StringBuffer``StringBuilder`

    Java–String&&StringBuffer&&StringBuilder 文章目录 `Java`--`String`&&`StringBuffe ...

  5. Java中String StringBuffer和StringBuilder的区别是什么

    String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的? 可变性 简单的来说:String 类中使用 final 关键字修饰字符数组来保存 ...

  6. String、String Buffer、StringBuilder区别与比较

    类型 常量/变量 适用场景 性能 String 字符串常量 操作少量的数据   String Buffer 字符串变量(线程安全) 多线程操作大量数据 低 String Builder 字符串变量(非 ...

  7. String,StringBuffer与StringBuilder的区别??

    2019独角兽企业重金招聘Python工程师标准>>> String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全 ...

  8. String , StringBuffer 和 StringBuilder 区别

    转载:http://www.blogjava.net/chenpengyi/archive/2006/05/04/44492.html 相信大家对 String 和 StringBuffer 的区别也 ...

  9. String,StringBuffer与StringBuilder的区别?

    http://blog.csdn.net/rmn190/article/details/1492013 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuil ...

最新文章

  1. 推荐一个 Python 手绘图形库(附代码)
  2. 登录和oauth机制
  3. ​灾备,让世界早有准备
  4. centos llvm安装_在CentOS上编译安装llvm-3.8.1详细教程
  5. C++ STL中set底层实现方式
  6. 543. 二叉树的直径 golang
  7. docker的简单操作和端口映射
  8. LNMP3.0一键安装
  9. 灯塔浮标行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  10. tbschedule
  11. java jdom 类_JDOM 介绍及使用指南
  12. Java容器Treeset的两种排序方法
  13. ARM开发板编译----MYS-6ULX
  14. Sqlmap全参数详解
  15. 惠普m154a状态页_惠普M154a说明书
  16. 用lombok插件,驼峰属性第一个是一个字母的,属性没有接收到值,使用@JsonProperty解决(工作遇到的坑)
  17. 百度文库如何申请个人认证?需要什么资质?
  18. 2007年中国邮政贺年(有奖)明信片开奖了~~
  19. 计算机毕业设计django基于python企业资产管理系统
  20. 主动外观模型(AAM)

热门文章

  1. 看看一个朋友写的代码,大家发表发表意见,比较简单的代码
  2. Python垃圾回收(gc)拖累了程序执行性能?
  3. [Java] 蓝桥杯ALGO-119 算法训练 寂寞的数
  4. 西安电子科技计算机专业,2020西安电子科技大学计算机专业课改考
  5. this.$set 更新整个数组_学点算法(二)——有序数组二分搜索算法
  6. python线性回归实例_线性回归的几个例子
  7. php之include的使用
  8. 光线如何从宇宙黑暗时代逃逸:黑洞让宇宙变光明
  9. SQL语句执行效率及分析
  10. Ecstore中的微信支付怎么样配置