Java中String,StringBuffer,StringBuilder的区别
- 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字符串不能被修改带来的好处
- 只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现(译者注:String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。
- 如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。
- 因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。
- 类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。
- 因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。
总结
- 单线程环境中使用StringBuilder,多线程使用StringBuffer
- 大量循环拼接字符串使用StringBuilder或StringBuffer,避免使用"+"拼接(在循环中,每执行一次 “+”,都会创建一个 String 对象,因此会有大量对象创建和回收的消耗)
原文: https://rumenz.com/rumenbiji/Java-String-StringBuffer-StringBuilder.html
Java中String,StringBuffer,StringBuilder的区别相关推荐
- 【翻译】Java中String, StringBuffer, StringBuilder的区别
2019独角兽企业重金招聘Python工程师标准>>> String 是 Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会 用String定义一些内容,然后通过著 ...
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- 2.Java中String,StringBuilder以及StringBuffer的关系与区别
String StringBuffer StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...
- String StringBuffer StringBuilder的区别
简单的事情做到极致也是一种能力. 首先,说一下目前我还没进行整理的情况下,我的理解: String 不可修改 修改后相当于又新创建创建一个字符串 比如: String a = "abc&qu ...
- java substr函数_oracle 中的substr()函数的用法,以及与java中String.substring()方法的区别...
oracle 中的substr()函数的规则是 substr( string, start_position, [ length ] ) 说明: string 是要分割的字符串 start_posit ...
- 【Java】Java中String、StringBuilder、StringBuffer三者的区别
这三个类之间的区别主要是在两个方面(运行速度和线程安全)这两方面. 1. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为: StringBuilder >StringBuffer & ...
- 探秘Java中String、StringBuilder以及StringBuffer
相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它 ...
- java stringbuffer原理_深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)
String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...
- Java中String StringBuffer和StringBuilder的区别是什么
String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的? 可变性 简单的来说:String 类中使用 final 关键字修饰字符数组来保存 ...
最新文章
- Atitit. 脚本语言的断点单步调试的设计与实现 attialx 总结 php 参照java
- ubuntu 安装ImageMagic
- 浅析“字典--NSDirctionary”理论
- mysql到oracle数据迁移,mysql数据迁移到oracle
- setitimer()函数
- Python小数据池
- ubuntun系统mysql数据库同步_Canal 实现 Mysql数据库实时数据同步
- python爬去百度百科词条_python简单爬虫爬取百度百科python词条网页
- 飞鸽传书2011帮助文档
- HTML5博客个人日志记录网页模板
- HTML5 Canvas中 绘制圆弧
- mysql like 数字结尾_MySQL中的Like和正则表达
- STM32的JTAG下载模式
- 使用Vue做评论+localStorage存储(js模块化)
- Android Wifi 调试
- 图书馆服务器虚拟化实施方案,服务器虚拟化与图书馆实施策略.pdf
- qq私聊顺序回复_QQ为什么难以替代
- 什么是防火墙?服务器防火墙建议开启吗?
- 微信分身 服务器,看了这个,你还敢用分身版微信吗?
- yum源服务器本地配置
热门文章
- 用python查看和更改系统默认编码
- 通用Makefile模板
- OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)【转】
- 两次称量误差多少为恒重_双台子100吨二手散装罐回收价格多少
- LeetCode 29. Divide Two Integers
- 结构化分析方法是一种自下而上逐步求精的分析方法【软件项目管理】
- 【操作系统】输入输出系统(上)-思维导图
- iOS开发 控件不能绑定拖动到视图ViewController连接的解决方法
- html数据插入到数据库,将数据插入到数据库中:text和html格式
- linux 系统性能分析常用命令