StringBuffer类的构造方法 API文档深入研究---1.0

 上一期我们深入研究了String类的使用,那么StringBuffer它来了,它与String类有什么区别呢?请往下看


目录

Class StringBuffer

 StringBuffer的特点

1、线程安全

2、可变的字符序列

3、字符串缓冲器就像一个String,但是可以修改

4、在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容

StringBuffer与String的区别

1、StringBuffer的长度和内容都是可以发生改变的,String不可变

2、Sting每创建一个新的字符串都会开辟一个新的内存空间

StringBuffer的构造方法

StringBuffer()

StringBuffer(int capacity)

StringBuffer(String str)


Class StringBuffer

查看API文档我们知道:

public final class StringBuffer extends Object implements Serializable, CharSequence

线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。

字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。

StringBuffer的主要StringBufferappendinsert方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。 append方法总是在缓冲区的末尾添加这些字符; insert方法将insert添加到指定点。

例如,如果z是指当前内容为"start"的字符串缓冲区对象,那么方法调用z.append("le")将使字符串缓冲区包含"startle" ,而z.insert(4, "le")会将字符串缓冲区更改为包含"starlet"

一般情况下,如果某人是指的一个实例StringBuffer ,则sb.append(x)具有相同的效果sb.insert(sb.length(), x)

每当涉及源序列(例如从源序列追加或插入)的操作发生时,该类仅在执行操作的字符串缓冲器上进行同步,而不在源上。 请注意,虽然StringBuffer被设计为可以安全地从多个线程并发使用,但如果构造函数或appendinsert操作被传递通过线程共享的源序列,则调用代码必须确保该操作具有一致且不变的视图在操作期间的源序列。 呼叫者通过使用不可变的源序列,或者不跨线程共享源序列,可以在呼叫期间持有锁来满足这一点。

每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。

除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException

从版本JDK 5开始,这个类别已经被一个等级类补充了,这个类被设计为使用一个线程StringBuilderStringBuilder应该使用StringBuilder类,因为它支持所有相同的操作,但它更快,因为它不执行同步。

看完这么长一段文字,你是否看明白了什么?来看靓仔给你分析吧!

  •  StringBuffer的特点

1、线程安全

    什么是线程不安全呢?就是存在同步操作同一数据的行为,效率高,那什么是线程安全呢?就是线程安全的时候,没有同步操作,效率不高。

   其实在实际的开发过程中,效率和安全一直都是很难平衡的事情,举一些生活中线程安全和不安全的例子:

   线程安全的例子:银行的一些业务、医院取号(不同人同时取不可能取相同的号)、电影院售票(不同人同时买票不可能取一张座位的号)

   线程不安全的例子:视频会员(一个会员多个用户同时登录),博客评论(不同人同时发表评论)

2、可变的字符序列

3、字符串缓冲器就像一个String,但是可以修改

4、在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容

总而言之StringBUffer就是一个线程安全的可变字符串


  • StringBuffer与String的区别

1、StringBuffer的长度和内容都是可以发生改变的,String不可变

2、Sting每创建一个新的字符串都会开辟一个新的内存空间

      StringBuffer可以提前给出一个容量,可以进行字符串的拼接,而不会重新开辟


StringBuffer的构造方法

StringBuffer()

查看API文档我们知道:

public StringBuffer()

构造一个没有字符的字符串缓冲区,初始容量为16个字符。

那如何查看StringBuffer的容量呢?

参考代码:

public class StringBufferDemo1 {
    public static void main(String[] args) {

        //StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
        StringBuffer sb1 = new StringBuffer();

        //StringBuffer重写的toString()方法
        System.out.println("sb1:" + sb1);

        //查看StringBuffer的容量
        int capacity = sb1.capacity();
        System.out.println("StringBuffer的容量: " + capacity);

        //查看StringBuffer中字符串的长度
        int length = sb1.length();
        System.out.println("StringBuffer中字符串的长度: " + length);

    }
}

sb1:
StringBuffer的容量: 16
StringBuffer中字符串的长度: 0

Process finished with exit code 0


StringBuffer(int capacity)

查看API文档我们知道:

public StringBuffer(int capacity)

构造一个没有字符的字符串缓冲区和指定的初始容量。

参数

capacity - 初始容量。

异常

NegativeArraySizeException - 如果 capacity参数小于 0

 参考代码1:

public class StringBufferDemo1 {
    public static void main(String[] args) {

        //StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
        StringBuffer sb2 = new StringBuffer(50);

        //StringBuffer重写的toString()方法
        System.out.println("sb2:" + sb2); 

        //查看StringBuffer的容量
        int capacity2 = sb2.capacity();

        System.out.println("StringBuffer2的容量: " + capacity2);
        //查看StringBuffer2中字符串的长度
        int length2 = sb2.length();
        System.out.println("StringBuffer2中字符串的长度: " + length2);

    }
}

sb2:
StringBuffer2的容量: 50
StringBuffer2中字符串的长度: 0

Process finished with exit code 0

参考代码2:

public class StringBufferDemo1 {
    public static void main(String[] args) {

        //StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
        StringBuffer sb3 = new StringBuffer(-2);
        System.out.println("sb3"+ sb3);

        //查看StringBuffer的容量
        int capacity3 = sb3.capacity();
        System.out.println("StringBuffer3的容量: " + capacity3);

        //查看StringBuffer3中字符串的长度
        int length3 = sb3.length();
        System.out.println("StringBuffer3中字符串的长度: " + length3);

    }
}

 运行结果:

 通过参考代码2我们可以看出抛出了一个应用程序尝试创建一个负数大小的数组异常NegativeArraySizeException

所以capacity 是>0的否则NegativeArraySizeException


StringBuffer(String str)

查看API文档我们知道:

public StringBuffer(String str)

构造一个初始化为指定字符串内容的字符串缓冲区。 字符串缓冲区的初始容量为16加上字符串参数的长度。

参数

str - 缓冲区的初始内容。

参考代码: 

public class StringBufferDemo1 {
    public static void main(String[] args) {

        //StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
        //StringBuffer重写的toString()方法
        StringBuffer sb3 = new StringBuffer("hello");
        System.out.println("sb3" + sb3);

        //查看StringBuffer的容量
        int capacity3 = sb3.capacity();
        System.out.println("StringBuffer3的容量为:" + capacity3);

        //查看StringBuffer3中字符串的长度
        int length3 = sb3.length();
        System.out.println("StringBuffer3中字符串的长度为:" + length3);

    }
}

sb3hello
StringBuffer3的容量为:21
StringBuffer3中字符串的长度为:5

Process finished with exit code 0


至此StringBuffer类的构造方法介绍完毕

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liangzai2048

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值