Java中String, StringBuilder和StringBuffer
Java中常用来处理字符串的类有三个: String, StringBuffer和StringBuilder.
区别
三者都继承自CharSequence接口, 首先说明三者间主要区别
- String字符串常量
- StringBuffer字符串变量(线程安全)
- StringBuilder字符串变量(线程不安全)
String
在Java中String对象是不可变的. 每次改变String类型的时候都会生成一个新的String对象, 然后将指针指向新的String对象.
如下代码中, str最终的值"ab"并非str所引用对象的内容发生了变化, 而是str在执行的过程中重新引用了另外一个String对象"ab". 并且String的+操作, 会转化成StringBuilder的append()方法来实现.
String str = "a";
str += "b";
特别的, 如果代码如下这样直接拼接字符串的话, 在编译过程中JVM会直接优化成把str的引用指向"ab".
String str = "a" + "b";
StringBuilder和StringBuffer
StringBuffer和StringBuilder都可变, 区别在于StringBuilder是线程不安全的, 而StringBuffer的API前多了一个synchronized关键字, 所以StringBuffer是线程安全的. 所谓的线程安全就是在多线程中多个线程同时操作一个对象不会出现问题. 然而真实的应用场景中, 还真没怎么见过有多个线程轮流操作一个字符串的情况.
实际上StringBuilder是在JDK 1.5中才加上的, 之前只有StringBuffer, 写过几年C#的我很是怀疑StringBuilder的这个命名是从C#借鉴来的. 至于为什么先有一个线程安全的StringBuffer后来再有一个线程不安全的StringBuilder, 而且从两者的命名来看你压根区分不出哪个是线程安全的, 个人感觉这应该是一个设计失误吧...
StringBuffer和StringBuilder都继承自AbstractStringBuilder, 而AbstractStringBuilder里有个expandCapacity方法用来扩容, 这就导致了StringBuffer和StringBuilder中另外一个重要的问题, 就是初始化时的容量问题.
StringBuilder扩容的问题
在StringBuilder中有一个char[], 初始的容量是16. 那么问题来了, 如果要append的长度超过了16, 会发生什么?
答案是会调用expandCapacity, 成倍扩容! 所以在高性能场景下StringBuilder的初始长度很重要很重要.
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
初始长度太小扩容时会带来时间消耗, 初始长度太大又会带来空间消耗. 可以参考这里的用法来复用StringBuilder.
Java中String, StringBuilder和StringBuffer的更多相关文章
- JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么?
JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么? 最简单的回答是,stringbuffer 基本没有适用场景,你应该在所有的情况下选择使用 stringbu ...
- java中String StringBuilder StringBuffer比较和效率(性能)测试
string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...
- Java中测试StringBuilder、StringBuffer、String在字符串拼接上的性能
应一个大量字符串拼接的任务 测试一下StringBuilder.StringBuffer.String在操作字符串拼接时候的性能 性能上理论是StringBuilder > StringBu ...
- java中string stringbuilder stringbuffer 的区别
1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a&qu ...
- Java中的StringBuilder和StringBuffer适用场景
我不知道为什么这个这么老的问题会出现在我的时间线上,看了一下回答,大多是2012,2013年的回答,照说那个年代,有些历史故事还很新鲜,却不知道为什么没有一个答案说到点子上. stringbuffer ...
- java中String、StringBuffer、StringBuilder的区别
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- 探秘Java中String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- java中String类、StringBuilder类和StringBuffer类详解
本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html 版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolp ...
- Java中string拼接,StringBuilder,StringBuffer和+
Java中string拼接,StringBuilder,StringBuffer和+,到底哪个更合适? StringBuilder线程不安全,效率较线程安全的StringBuffer高.jdk1.5之 ...
随机推荐
- [NodeJS] Node.js 与 V8 的故事
要说Node.js的历史,就不得不说说V8历史.在此之前我们先一句话描述一下什么是Node.js:Node.js是一个基于Google Chrome V8 Javascript引擎之上的平台,用以创建 ...
- gozmq的安装与使用
1. 安装zmq 下载Windows版安装或linux版本并执行安装命令: tar zxvf zeromq-4.1.6.tar.gz cd zeromq-4.1.6 ./configure make ...
- gcc的选项
-g: 是一个编译选项,即在源代码编译的过程中起作用,让gcc把更多调试信息(也就包括符号信息)收集起来并将存放到最终的可执行文件内. -rdynamic: 却是一个 连接选项 ,它将指示连接器把 ...
- Java bean中布尔类型使用注意
JavaBean是一个标准,遵循标准的Bean是一个带有属性和getters/setters方法的Java类. JavaBean的定义很简单,但是还有有一些地方需要注意,例如Bean中含有boolea ...
- 【Java基础】StringTokenizer用法
写在前面 因为最近在接触hadoop的东西,看示例WordCount的时候里面有一个StringTokenizer的东西特地看了一下 The string tokenizer class allows ...
- MFC onpaint() ondraw()
OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中. OnPaint()是CWnd的类成员,负责响应WM_PAIN ...
- mouseleave,mouseout 和mouseover ,mouseenter区别
鼠标离开事件: mouseleave:只有鼠标离开指定元素时才会触发; mouseout 鼠标离开指定元素或内部子元素都会触发; 鼠标在上事件: mouseover:只有鼠标进入指定元素时才会触发; ...
- Elasticsearch学习之深入搜索一 --- 提高查询的精准度
1. 为帖子增加标题字段 POST /forum/article/_bulk { "} } { "doc" : {"title" : "th ...
- 改变vux样式
场景:修改 x-header 颜色 解决: 在创建文件路径如下 src/assets/less/theme.less ; 在build/webpack.base.conf.js下添加 这两行即可
- linux中的标准输出和输入
===============1.有些人经常问我这个问题问题=========== 经常在脚本里面看到这个 2>&1 表示什么意思啊? ==============2.理论 ...