文档章节

String、StringBuilder、StringBuffer

 小鱼--
发布于 2017/05/25 11:32
字数 814
阅读 29
收藏 0

1.不可变字符串

String:java.lang.String

String对象在创建后是不可变的,在字符串缓存区共享。Java语言提供对字符串串联符号(+)以及将其它对象转换为字符串的特殊支持。

/** The value is used for character storage. */
private final char value[];

/** The offset is the first index of the storage that is used. */
private final int offset;

/** The count is the number of characters in the String. */
private final int count;

从String类的实现可以看到,字符串数组的长度是final定义,不可变。

 String one = "abc";
 String two = "xyz";
 String three = one + two;

注意:string的字符串拼接会被java compiler编译成StringBuilder对象的拼接,如下:

String one = "abc";
  String two = "xyz";
  String three = (new StringBuilder()).append(one).append(two).toString();

如果字符串和其它类型的变量拼接,java compiler并不会自动转换,相应的,速度并不会那么快。

 

2.可变字符串

StringBuffer:java.lang.StringBuffer

线程安全的可变字符串序列,类似于String的字符串缓冲区,序列的长度和内容可变。StringBuffer主要用到的方法有append和insert,append方法始终将这些字符添加到缓冲区的末端,而insert方法则在指定的点添加字符。

public synchronized StringBuffer append(String str) {
	super.append(str);
    return this;
}
/**
 * @throws StringIndexOutOfBoundsException {@inheritDoc}
 * @see        #length()
 */
public synchronized StringBuffer insert(int offset, String str) {
    super.insert(offset, str);
    return this;
}

StringBuilder:java.lang.StringBuilder

非线程安全的可变字符串序列,常用方法append和insert。

public StringBuffer append(String str) {
	super.append(str);
    return this;
}
/**
 * @throws StringIndexOutOfBoundsException {@inheritDoc}
 * @see        #length()
 */
public StringBuffer insert(int offset, String str) {
    super.insert(offset, str);
    return this;
}

AbstractStringBuilder:java.lang.AbstractStringBuilder

StringBuffer和StringBuilder都继续该抽象类。StringBuffer和StringBuilder通过super.append()调用父抽象类的append方法。

    public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        if (len == 0) return this;
        int newCount = count + len;
        if (newCount > value.length)
            expandCapacity(newCount);
        str.getChars(0, len, value, count);
        count = newCount;
        return this;
    }

每个字符串缓冲区都有一定的容量,只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组,如果内部缓冲区溢出,则容量自动增大。

expandCapacity方法实现容量的扩增。

void expandCapacity(int minimumCapacity) {
    int newCapacity = (value.length + 1) * 2;
    if (newCapacity < 0) {
        newCapacity = Integer.MAX_VALUE;
    } else if (minimumCapacity > newCapacity) {
	    newCapacity = minimumCapacity;
	}
    value = Arrays.copyOf(value, newCapacity);
}

System.arraycopy

//从指定源数组中复制一个数组,复制从指定的位置开始,到目标指定的位置结束
public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)

3.总结

1.String:少量数据的拼接用
StringBuilder:单线程操作大量数据
StringBuffer:多线程操作大量数据,线程安全

2.不要使用String类的"+"来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。

3.为了获得更好的性能,在构造 StringBuffer 或 StringBuilder 时应尽可能指定它们的容量。当然,如果你操作的字符串长度(length)不超过 16 个字符就不用了,当不指定容量(capacity)时默认构造一个容量为16的对象。不指定容量会显著降低性能。

4.StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中。

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 17
码字总数 5400
作品 0
通州
程序员
String,StringBuilder,StringBuffer对比

简述 StringBuilder 对比 StringBuffer StringBuilder是非线程安全 StringBuffer是线程安全的。 StringBuilder和StringBuffer其余的特性都是一样的,他们与String的区别: StringBuilder与S...

Real_man
03/20
0
0
Java: String, StringBuilder和StringBuffer 三者之间的区别

今天我们将分析Java中String,StringBuilder和StringBuffer三者之间的细微不同点。 String String是非易失性的(一旦创建不会改变)。当一个String变量被创建时,它将被存储在Constant Stri...

周宇YuZhou
2016/03/14
39
0
【翻译】Java中String, StringBuffer, StringBuilder的区别

String 是 Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会用String定义一些内容,然后通过著名的System.out.println()语句来打印出来。 然而,很多Java新手都不会意识到 String...

YuanyuanL
2014/09/03
0
4
java中String、StringBuffer、StringBuilder的区别 - jihite

java中String、StringBuffer、StringBuilder的区别 - jihite 博客园jihite2018-01-011 阅读 StringBufferjavaString Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串 ......

博客园_jihite
01/01
0
0
java中StringBuffer、StringBulider、String的区别

String 类   String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。 String a = "a"; //假设a指向地址0x0001 a = "b";//...

帅的不像男的
2016/05/23
55
0

没有更多内容

加载失败,请刷新页面

加载更多

发生系统错误 5 拒绝访问

1、使用命令net start *开启一个服务的时候,出现发生系统错误5,拒绝访问。 解决:切换到管理员模式执行此命令即可。

fang_faye
23分钟前
1
0
devops 成长路线

https://36kr.com/p/5157249.html

swingcoder
35分钟前
1
0
Java内存区域的划分和异常

行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域。 程序计数器 线程私有。可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通过改变这个计数值来读...

架构师springboot
37分钟前
1
0
kubeadm 安装kubernetes1.12.1

准备环境 服务器 服务器情况: IP 系统版本 角色 Hostname 10.20.13.24 Centos7 64位 minimal master kuber24 10.20.13.25 Centos7 64位 minimal work Kuber25 10.20.13.26 Centos7 64位 mi......

hgfgoodcreate
40分钟前
4
0
腾讯又添 AI 开源项目! 腾讯 AI Lab 正式开源业内最大规模多标签图像数据集

2018年10月17日,腾讯AI Lab宣布正式开源“Tencent ML-Images”项目,地址为https://github.com/Tencent/tencent-ml-images。该项目由多标签图像数据集ML-Images,以及业内目前同类深度学习模...

腾讯开源
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部