String、StringBuilder与StringBuffe
2018-03-13 本文已影响0人
pianpianboy
String、StringBuilder与StringBuffer区别
时间:20180313
String:String/StringBuffer/StringBuilder三者的功能区别
String作为最基础的引用数据类型,日常的开发中被大量的使用。基于不可变的特性,一旦被过度的使用,堆内存就会负荷不堪,甚至影响性能,为此,java设计者特意为String在方法区中开辟了字符串常量池,以减少String的实例创建,然后,在面对大数量的情况下,字符串常量池也未必能解决问题。因此AbstractStringBuilder应运而生,就是为了解决String频繁创建而引发的内存性能下降的问题。
我们先要记住三者的特征:
- String字符串常量
- StringBuffer 字符串变量(线程安全)
- StringBuilder 字符串变量(非线程安全)
带着两个问题去看看String/StringBuffer/StringBuilder的区别
- String VS AbstractStringBuilder
- StringBuffer VS StringBuilder
- String/StringBuffer/StringBuilder的使用策略
String vs AbstractStringBuilder
String: 不可变性:重新创建一个对象
String代码的底层代码实现:
- String类被final修饰,该类不能被继承
- Value[] 属性被final修饰,引用不能被修改
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[]; //
/** Cache the hash code for the string */
private int hash; // Default to 0```
//other codes
测试代码:
String str = new String("a");
str = str + “b” ;
内存模型
AbStractStringBuilder:可变性
AbstractStringBuilder底层代码实现:
valu[]相当于String,没有final修饰
public class TestString {
//测试testString
public static void testString() {
long start = System.currentTimeMillis();
String str = null;
for(int i = 0; i < 20000; i++) {
str = str + i + ",";
}
System.out.println(System.currentTimeMillis()-start);
}
//测试testStringBuffer
public static void testStringBuffer() {
long start = System.currentTimeMillis();
StringBuffer sbuf = new StringBuffer();
for(int i=0; i <20000; i++) {
sbuf.append(i + ",");
}
System.out.println(System.currentTimeMillis()-start);
}
//测试testStringBuilder
public static void testStringBuilder() {
long start = System.currentTimeMillis();
StringBuilder sbuild = new StringBuilder();
for(int i = 0; i < 20000; i++) {
sbuild.append(i+",");
}
System.out.println(System.currentTimeMillis()-start);
}
public static void main(String[] args) {
testString();
testStringBuffer();
testStringBuilder();
}
}
测试结果:
运行结果