String,StringBuilder和StringBuffer的特点和使用场景
这三个类是平时开发中经常遇到的,主要差别是运行速度和线程安全,使用起来String最方便了,另外两个稍微复杂一些。
从运行速度角度看,StringBuilder>StringBuffer>String。
从线程安全角度看,StringBuffer是线程安全的,StringBuilder和String不是。
下面从代码的角度分析一下,示例代码:
StringBuilder strBuilder = new StringBuilder();
strBuilder.append(100);
strBuilder.append("123"); StringBuffer strBuffer = new StringBuffer();
strBuffer.append(100);
strBuffer.append("123"); String strTest = "start";
strTest += 100;
strTest += "123";
首选看下StringBuilder的实现:
public StringBuilder append(int i) {
super.append(i);
return this;
}
public AbstractStringBuilder append(int i) {
if (i == Integer.MIN_VALUE) { // 是否是最小值
append("-2147483648");
return this;
}
// 计算i的字符串长度,判断是否需要增大存储空间
int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1
: Integer.stringSize(i);
int spaceNeeded = count + appendedLength;
ensureCapacityInternal(spaceNeeded);
Integer.getChars(i, spaceNeeded, value); // 使用Integer的getChars方法,计算i的字符串值并把值拷贝到value中
count = spaceNeeded;
return this;
}
// 其中扩展空间时,会按照现有空间的2倍+2来扩展,保证不需要一直来扩展,提高效率
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);
}
//Arrays.copyOf的实现
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength]; // 新申请空间,并拷贝
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count); // 使用了String的getChars方法把str拷贝到value中去
count += len;
return this;
}
str.getChars代码:
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
if (srcBegin < 0) {
throw new StringIndexOutOfBoundsException(srcBegin);
}
if (srcEnd > value.length) {
throw new StringIndexOutOfBoundsException(srcEnd);
}
if (srcBegin > srcEnd) {
throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
}
// 最终使用 System.arraycopy完成字符串的拷贝
System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
}
再看下StringBuffer的实现:
public synchronized StringBuffer append(int i) { // 多了同步关键字,是线程安全的
super.append(i); // 调用了AbstractStringBuilder的append方法,和StringBuilder使用的是一样的方法
return this;
}
public synchronized StringBuffer append(String str) { // 使用了同步关键字
super.append(str); // 使用了AbstractStringBuilder的方法
return this;
}
从上面分析可以看到,StringBuffer和StringBuilder是继承了相同的父类AbstractStringBuilder,然后通过在方法上使用了同步关键字实现了线程安全,看下类定义:
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{} public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{}
最后再看下String的操作,jvm会申请一段新的char数组,并把"start"和"100"顺序拷贝进去,第二次再申请一段新的char数组,并把"start100"和"123"顺序拷贝进去。
由于String的每次拷贝都会有申请新的存储空间和拷贝动作,而StringBuffer和StringBuilder只有在空间不够用的时候才会申请新的存储空间,因此从效率上讲String是最慢的。
综上所述,对String,StringBuilder和StringBuffer的使用做个小结:
1. String 适用次数较少的拷贝场景。
2. StringBuilder适用无线程安全要求的大量拷贝场景。
2. StringBuffer适用要求线程安全的大量拷贝场景。
String,StringBuilder和StringBuffer的特点和使用场景的更多相关文章
- String StringBuilder以及StringBuffer
例一:[看了威哥视频,下面更好理解] package sunjava; public class String_test { public static void main(String[] args ...
- String, StringBuilder 与StringBuffer的区别与联系
1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个String相加,需要新建一个String对象,然后容纳最终的结果. 而StringBuilder与StringBu ...
- Java中String, StringBuilder和StringBuffer
Java中常用来处理字符串的类有三个: String, StringBuffer和StringBuilder. 区别 三者都继承自CharSequence接口, 首先说明三者间主要区别 String字 ...
- java String,StringBuilder和StringBuffer
String:1.java语言中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但java一般使用Sting类作为字符串的标准格式,java编译器把字符串值作为String对象. ...
- String,StringBuilder与StringBuffer的区别
相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...
- Java基础学习总结(65)——Java中的String,StringBuilder和StringBuffer比较
字符串,就是一系列字符的集合. Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串,其中StringBuilder类是到jdk 1.5才新增的.字符 ...
- String,StringBuilder和StringBuffer
String 字符串常量,由String创建的字符内容,长度是不可改变,存放字符的数组被声明为final. 实际上String类操作字符串是通过建立一个StringBuffer,然后调用append( ...
- java 常用类库:String ; StringBuilder和StringBuffer类
1. String 1.String对象是不可变的 String类的value属性是用来存放字符串里面的值的.这个属性是被final修饰的.final修饰的变量不能够被第二次赋值,所以字符串是不可变的 ...
- String,StringBuilder 和StringBuffer区别
1. String 和字符串缓冲区的区别是: String 是一个不可变的字符序列 , 而字符串缓冲区是可变的 2. StringBuffer 是一个线程安全的可变字符序列 ; 线程安全对应的效率低 ...
随机推荐
- java命令行执行程序解决依赖外部jar包的问题
用java命令行直接执行程序,如果这个程序需要引用外部jar包.就不能单纯用java xx来执行 如果你的jar包和程序就在一个目录: 编译 javac -cp D:\yy\yy.jar,D\xx\x ...
- [ios]MKMapView中使用MKPolyline画线
参考:http://blog.sina.com.cn/s/blog_9e8867eb0101dt76.html 首先在MapView.h中 #import <MapKit/MapKit.h> ...
- java开源类库pinyin4j的使用
最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字), 呵呵,看了看他的demo,决定就用它了,因为我在实际使 ...
- putty xming gnome-session
在windows里远程连接linux的最好方法. 比VNC方式好多了 1) xming启动一个窗口 2) putty 设置完X11 forwarding之后,远程登录 3) 在putty 里启动 gn ...
- JavaScript--Array; Array.prototype
Array: Javascritp中Array的方法: findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引.否则返回-1. find() 方法返回数组中满足提供的测试函数的第一个 ...
- 30 进程process
进程模块 process Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动) ...
- Chrome DevTools 的 Sources 调试
在 Chrome 中调试 JS 代码,那你不得不与 Chrome DevTools 的 Sources 面板打交道,所以文章主要通过介绍 Sources 面板上的各部分功能来介绍如何调试网页中的 JS ...
- oo第四篇博客作业
测试与正确性论证的效果差异及各自的优缺点: 测试针对一些典型的输入情况进行方法验证,可操作性更强,结果直观.但不能完全覆盖所有的输入情况. 正确性论证则是根据代码逻辑从所有的方面对方法进行论证,可操作 ...
- Oracle解析复杂json的方法(转)
转:Oracle解析复杂json的方法 问题背景: 当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串, ...
- OC ARC之基本使用(代码分析)
// // main.m // 01-arc的基本使用 // // Created by apple on 13-8-11. // Copyright (c) 2013年 itcast. All ri ...