• String 字符串常量
  • StringBuffer 字符串变量(线程安全)
  • StringBuilder 字符串变量(非线程安全)

运行速度 StringBuilder > StringBuffer > String


String 字符串常量(JVM优化的结果)

错误认识:String可以修改

String z = "入门";
z = z + "小站";

原因

final修饰,不可变

 private final char value[];

JVM 处理这段代码的过程是这样的:首先创建 z 对象,赋值“入门” ,然后处理第二行代码时,再创建一个 z 对象,赋值 “小站”,然后将第一个 z 对象垃圾回收。


StringBuffer 字符串变量(线程安全)

对象在构造的过程中,首先按照默认大小申请一个字符数组(char[]), 默认容量为 16 个字符,但如果超出,会使用 Arrays.copyOf() 成倍扩容 16,32,64, 128…,当然这样会影响性能,因此可以在创建对象时按照需要自定义其容量

没有final修饰,可变,本质是一个字符数组

abstract class AbstractStringBuilder implements Appendable, CharSequence {/*** The value is used for character storage.*/char[] value;// .....
}

synchronized修饰,线程安全

public synchronized StringBuffer append(Object obj) {toStringCache = null;super.append(String.valueOf(obj));return this;
}

StringBuilder 字符串变量(非线程安全)

对象在构造的过程中,首先按照默认大小申请一个字符数组(char[]), 默认容量为 16 个字符,但如果超出,会使用 Arrays.copyOf() 成倍扩容 16,32,64, 128…,当然这样会影响性能,因此可以在创建对象时按照需要自定义其容量.

字符串变量,本质是一个字符数组

abstract class AbstractStringBuilder implements Appendable, CharSequence {/*** The value is used for character storage.*/char[] value;//......
}

线程不安全,没有加锁

 @Override
public StringBuilder append(CharSequence s) {super.append(s);return this;
}

String字符串不能被修改带来的好处

  1. 只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现(译者注:String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。
  2. 如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。
  3. 因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。
  4. 类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。
  5. 因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。

总结

  1. 单线程环境中使用StringBuilder,多线程使用StringBuffer
  2. 大量循环拼接字符串使用StringBuilder或StringBuffer,避免使用"+"拼接(在循环中,每执行一次 “+”,都会创建一个 String 对象,因此会有大量对象创建和回收的消耗)

原文: https://rumenz.com/rumenbiji/Java-String-StringBuffer-StringBuilder.html

Java中String,StringBuffer,StringBuilder的区别相关推荐

  1. 【翻译】Java中String, StringBuffer, StringBuilder的区别

    2019独角兽企业重金招聘Python工程师标准>>> String 是  Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会 用String定义一些内容,然后通过著 ...

  2. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  3. 2.Java中String,StringBuilder以及StringBuffer的关系与区别

    String     StringBuffer     StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...

  4. String StringBuffer StringBuilder的区别

    简单的事情做到极致也是一种能力. 首先,说一下目前我还没进行整理的情况下,我的理解: String 不可修改 修改后相当于又新创建创建一个字符串 比如: String a = "abc&qu ...

  5. java substr函数_oracle 中的substr()函数的用法,以及与java中String.substring()方法的区别...

    oracle 中的substr()函数的规则是 substr( string, start_position, [ length ] ) 说明: string 是要分割的字符串 start_posit ...

  6. 【Java】Java中String、StringBuilder、StringBuffer三者的区别

    这三个类之间的区别主要是在两个方面(运行速度和线程安全)这两方面. 1. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:  StringBuilder >StringBuffer & ...

  7. 探秘Java中String、StringBuilder以及StringBuffer

    相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它 ...

  8. java stringbuffer原理_深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)

    String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...

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

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

最新文章

  1. Atitit. 脚本语言的断点单步调试的设计与实现 attialx 总结 php 参照java
  2. ubuntu 安装ImageMagic
  3. 浅析“字典--NSDirctionary”理论
  4. mysql到oracle数据迁移,mysql数据迁移到oracle
  5. setitimer()函数
  6. Python小数据池
  7. ubuntun系统mysql数据库同步_Canal 实现 Mysql数据库实时数据同步
  8. python爬去百度百科词条_python简单爬虫爬取百度百科python词条网页
  9. 飞鸽传书2011帮助文档
  10. HTML5博客个人日志记录网页模板
  11. HTML5 Canvas中 绘制圆弧
  12. mysql like 数字结尾_MySQL中的Like和正则表达
  13. STM32的JTAG下载模式
  14. 使用Vue做评论+localStorage存储(js模块化)
  15. Android Wifi 调试
  16. 图书馆服务器虚拟化实施方案,服务器虚拟化与图书馆实施策略.pdf
  17. qq私聊顺序回复_QQ为什么难以替代
  18. 什么是防火墙?服务器防火墙建议开启吗?
  19. 微信分身 服务器,看了这个,你还敢用分身版微信吗?
  20. yum源服务器本地配置

热门文章

  1. 用python查看和更改系统默认编码
  2. 通用Makefile模板
  3. OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)【转】
  4. 两次称量误差多少为恒重_双台子100吨二手散装罐回收价格多少
  5. LeetCode 29. Divide Two Integers
  6. 结构化分析方法是一种自下而上逐步求精的分析方法【软件项目管理】
  7. 【操作系统】输入输出系统(上)-思维导图
  8. iOS开发 控件不能绑定拖动到视图ViewController连接的解决方法
  9. html数据插入到数据库,将数据插入到数据库中:text和html格式
  10. linux 系统性能分析常用命令