Java中的StringBuffer和StringBuilder

来源:互联网 发布:tgp检测网络环境异常 编辑:程序博客网 时间:2024/05/22 15:29

前言

在我们开始讲解StringBuffer和StringBuild这两个类时,首先我们应该了解为什么要使用这两个类。相信要看这个博客的朋友应该都对String类很熟悉吧,那么问题就来了,既然已经有了String类,为什么我们还要用别的类呢。

String,StringBuffer和StringBuilder的区别

可变与不可变

String类中使用字符数组保存字符串,就是用如下方式,因为有“final”修饰符,所以可以知道string对象是不可变的。

private final char value[];

StringBuilder与StringBuffer都继承于AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

char value[];

于是我们可以得出String是不变类,那么用String修改字符串会新建一个String对象,如果频繁的修改,将会产生很多的String对象,开销很大.因此Java提供了StringBuffer和StringBuilder两个类,这两个类在修改字符串方面的效率比String高了很多。

线程安全

String中的对象是不可变的,也就可以理解为常量,显然线程安全。

查看官方文档,我们可以知道AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

我们看到StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,而StringBuilder并没有,所以是非线程安全的。

总结

因为StringBuffer和StringBuilder都继承了AbstractStringBuilder(抽象类),抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。

所以两个类都继承了AbstractStringBuilder中的公共方法,只是StringBuffer会在方法上加synchronized关键字,进行同步。因为不用同步,所以StringBuilder效率比StringBuffer高,StringBuffer则线程安全。

所以:

  1. 如果要操作少量的数据用String

  2. 单线程操作字符串缓冲区下操作大量数据用StringBuilder

  3. 多线程操作字符串缓冲区下操作大量数据用StringBuffer

方法

方法以StringBuffer为例,因为StringBuilder与StringBuffer的方法几乎是一样的,功能也是相同,所以就不重复说明了。

说明:①所有方法均为public;
②书写格式:[修饰符] <返回类型> <方法名([参数列表])>

public static String copyValueOf(char[] data);  //表示这个方法为类方法,返回类型为String,方法参数为char数组。

1.public StringBuffer append(boolean b)
2.public StringBuffer append(char c)
3.public StringBuffer append(char[] str)
4.public StringBuffer append(char[] str, int offset, int len)
5.public StringBuffer append(double d)
6.public StringBuffer append(float f)
7.public StringBuffer append(int i)
8.public StringBuffer append(long l)
9.public StringBuffer append(Object obj)
10.public StringBuffer append(String str)
11.public StringBuffer append(StringBuffer sb)

以上的方法都是向字符串缓冲区“追加”元素,但是,这个“元素”参数可以是布尔量、字符、字符数组、双精度数、浮点数、整型数、长整型数对象类型的字符串、字符串和StringBuffer类等。如果添加的字符超出了字符串缓冲区的长度,Java将自动进行扩充。

boolean bool = true;char c = '/';char[] cs = {'0','1','2','3'};double d = 1.23;String string = "string";StringBuffer str = new StringBuffer("java");str.append(str); //javajavastr.append(string); //javajavastringstr.append(bool); //javajavastringtruestr.append(c); //javajavastring/str.append(cs); //javajavastring/0123str.append(cs, 1, 2); //javajavastringtrue/012312 从1这个位置开始取长度为2的元素str.append(d); //javajavastringtrue/0123121.23

1.public int capacity():返回当前容量。

StringBuffer str = new StringBuffer("java");System.out.println(str.capacity()); //20

2.public char charAt(int index):返回此序列中指定索引处的 char 值。
3.public void ensureCapacity(int minimumCapacity):确保容量至少等于指定的最小值。

StringBuffer str = new StringBuffer("java"); //20str.ensureCapacity(30);System.out.println(str.capacity()); //42

4.public StringBuffer delete(int start, int end):移除此序列的子字符串中的字符。

StringBuffer str = new StringBuffer("java");str.delete(1, 2);System.out.println(str); //jva

5.public StringBuffer deleteCharAt(int index):该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。

6.public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):将字符从此序列复制到目标字符数组 dst。

char[] cs = {'0', '1', '2', '3', '4'};StringBuffer str = new StringBuffer("java");str.getChars(0, 4, cs, 1);System.out.println(cs); //0java

7.public StringBuffer insert(int offset, int i):将 int 参数的字符串表示形式插入此序列中。

StringBuffer str = new StringBuffer("java");str.insert(4, 's');System.out.println(str); //javas

8.public int indexOf(String str):返回第一次出现的指定子字符串在该字符串中的索引。
9.public int indexOf(String str, int fromIndex):从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
10.public int lastIndexOf(String str):返回最右边出现的指定子字符串在此字符串中的索引。
11.public int lastIndexOf(String str, int fromIndex):返回最后一次出现的指定子字符串在此字符串中的索引。
12.public int length():返回长度(字符数)。
13.public StringBuffer replace(int start, int end, String str):使用给定 String 中的字符替换此序列的子字符串中的字符。

StringBuffer str = new StringBuffer("java");String string = "string";str.replace(4, 4, string);System.out.println(str); //javastring

14.public StringBuffer reverse():将此字符序列用其反转形式取代。

StringBuffer str = new StringBuffer("java");str.reverse();System.out.println(str); //avaj

15.public void setCharAt(int index, char ch):将给定索引处的字符设置为 ch。

StringBuffer str = new StringBuffer("java");str.setCharAt(1, 's');System.out.println(str); //jsva

16.public void setLength(int newLength):设置字符序列的长度。

StringBuffer str = new StringBuffer("java"); //4str.setLength(10);System.out.println(str.length()); //10

17.public CharSequence subSequence(int start, int end):返回一个新的字符序列,该字符序列是此序列的子序列。

StringBuffer str = new StringBuffer("java");CharSequence charSequence = str.subSequence(0, str.length());System.out.println(charSequence); //java

18.public String substring(int start):返回一个新的 String,它包含此字符序列当前从start到末尾所包含的字符子序列。
19.public String substring(int start, int end):返回一个新的 String,它包含此序列当前所包含的字符子序列。
20.public String toString():返回此序列中数据的字符串表示形式。
21.public void trimToSize():该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

StringBuffer str = new StringBuffer("java");System.out.println(str.capacity()); //20str.trimToSize();System.out.println(str.capacity()); //4

结束语:本文仅用来学习记录,参考查阅。

4 0
原创粉丝点击