文档章节

String、StringBuilder、StringBuffer

 小鱼--
发布于 2017/05/25 11:32
字数 814
阅读 36
收藏 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
博文 19
码字总数 6428
作品 0
通州
程序员
私信 提问
加载中
请先登录后再评论。
StringBuilder、StringBuffer分析比较

StringBuilder、StringBuffer源码分析 StringBuilder源码分析 类结构 StringBuilder使用final关键字修饰,和String一样不可以被继承 StringBuilder继承AbstractStringBuilder并实现了Seriali...

osc_kvcz9ju6
05/01
11
0
String,StringBuilder,StringBuffer三者的区别

1、运行速度 StringBuilder 最快, StringBuffer第二,String最慢。 String最慢的原因:   String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该...

十里春风不如她
2019/04/28
1
0
Java之String+StringBuffer+StringBuilder

Java中常用的字符串类有:String、StringBuffer、StringBuilder 1、String 是不可变的字符串(字符串常量),也是线程安全的。 String类的源码中组成字符串的数组是被 “ final ” 所修饰的,...

osc_x0g6o8z1
2019/01/25
0
0
String、StringBuffer和StringBuilder区别

String、StringBuffer和StringBuilder区别 1、长度是否可变 String 是被 final 修饰的,他的长度是不可变的,就算调用 String 的concat 方法,那也是把字符串拼接起来并重新创建一个对象,把...

osc_81544g47
2019/11/15
3
0
Java入门系列之StringBuilder、StringBuffer(三)

前言 上一节我们讲解了字符串的特性,除了字符串类外,还有两个我们也会经常用到的类,那就是StringBuffer和StringBuilder。因为字符串不可变,所以我们每次对字符串的修改比如通过连接conca...

osc_t0xmr011
2019/08/30
1
0

没有更多内容

加载失败,请刷新页面

加载更多

反反爬 | 如何巧过 CloudFlare 5秒盾?

巧破 Cloudflare 5秒盾 相信下面这个界面大家都不会陌生。【图1-1】 图1-1 当我们第一次访问使用 CloudFlare 加速的网站时,网站就会出现让我们等待 5 秒种的提示,当我们需要的通过爬虫爬取...

咸鱼学Python
2019/09/20
0
0
​Python爬虫学习之代理IP抓取(2)

Python爬虫学习之代理IP抓取 ✕ 代理数据保存清洗 运行效果: 然后我的IP就给封了 代理测试 代码没问题。。。 不过短短几分钟抓了6000条代理,也算是不错了 需要下载的模块 pip install tiny...

萌海无涯
2019/08/05
0
0
从nginx1.17.9源码理解nginx -s reload

使用nginx的时候,我们经常会使用nginx -s reload命令重启。下面我们就分析一下,执行这个命令的时候,nginx里发生了什么?我们从nginx的main函数开始。在main函数里,执行ngx_get_options函...

theanarkh
03/15
6
0
Geekpwn 2020云端挑战赛 Noxss & umsg

作者:LoRexxar'@知道创宇404实验室 时间:2020年7月14日 前两天看了今年Geekpwn 2020 云端挑战赛,web题目涉及到了几个新时代前端特殊技巧,可能在实战中利用起来难度比较大,但是从原理上又...

osc_ccy4urvn
22分钟前
0
0
host、referer和origin的区别

题图 By Clm From Bing 在http协议中这三个请求头比较容易让人产生混淆。 host比较容易理解,来看下MDN网站给的介绍: Host 请求头指明了服务器的域名(对于虚拟主机来说),以及(可选的)服...

挥刀北上
2019/02/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部