String类与StringBuffer类

一、String类和StringBuffer类的区别

String类是不可变类,新建的对象为不可变对象(String类的内容和长度是固定的),一旦被创建就不能修改它的值(对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去); String类是final类型不可被继承。

StringBuffer类是可变类,新建的对象是一个可变的对象,当需要修改其内容的时候,不需要再创建新的字符串对象,而是直接操作原来的串;不能通过赋值符号对他进行赋值(只能通过构造函数来建立, StringBuffer sb = new StringBuffer(),每个StringBuffer对象都有一定的缓冲区容量,当字符串大小超过容量时,会自动增加容量);字符串连接操作中StringBuffer的效率要比String高​。

另外由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。从JDK5开始,为该类补充了一个单个线程使用的等价类,即StringBuilder。与该类相比,通常应该优先使用 StringBuilder ,因为它支持所有相同的操作,但由于它不支持同步,所以速度更快。

String 作为参数传递是类似于基本数据类型作为参数传递(值传递),StringBuffer 作为参数传递就是引用数据类型传递。

总结一下:

相同点:

(1)String类与StringBuffer类都用来处理字符串。

(2)部分方法在二者中的用法是相同的。

(3)在这两个类中,字符的索引都是从0开始的。

(4)这两个类都是CharSequence的子类。CharSequence接口描述的是一系列字符集。

不同点:

(1)String类是不可变类,因为在底端是用字符数组实现的,而数组长度固定,一旦赋值,就不能在原来的字符串上进行修改可能会浪费空间。StringBuffer类是可变类,能够在原来的数组上进行修改。

(2)String类覆盖了Object类的equals()方法,而StringBuffer类没有覆盖该方法。比较StringBuffer字符串内容是否相等,可以使用toString() 方法将StringBuffer的内容转换为String 字符串,再使用equals()方法比较。

(3)虽然两个类都覆盖了toString()方法,但各自的实现方式不同。String类的toString()方法返回当前String对象的引用。而StringBuffer类的toString()方法返回一个以当前StringBuffer的缓冲区的所有字符为内容的新的String对象的引用。

(4)String类对象可以用操作符"+"进行连接,而StringBuffer类的对象通过append()方法添加新的字符串。

二、StringBuffer对象和String对象之间的互转

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| String s = "abc"; StringBuffer sb1 = new StringBuffer("123"); StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer String s1 = sb1.toString(); //StringBuffer转换为String |

三、StringBuffer类

1.StringBuffer的构造方法

public StringBuffer() 构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。

public StringBuffer(int capacity):指定容量大小

public StringBuffer(String str):构造一个字符串缓冲区:里面的容量(字符串内容英文)大小:字符串长度+16初始容量

使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就自动进行扩容:构建新的存储空间更大的字符串,将旧的复制过去;

在进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,需要扩容就调用expandCapacity方法进行扩容:尝试将新容量扩为大小变成2倍+2 ,判断一下 容量如果不够,直接扩充到需要的容量大小。

2.StringBuffer获取功能

public int capacity():初始容量

public synchronized int length():返回字符串长度

3.StringBuffer的添加功能

StringBuffer append(xxx x):将指定的内容追加(末尾追加)到字符串缓冲区中,返回StringBuffer本身

public StringBuffer insert(int index,xxx x):在指定位置处,插入一个新的内容,返回StringBuffer本身

void setLength(int newLength) 重新设置字符串缓冲区中字符串的长度,如果newLength小于当前的字符串长度,将截去多余的字符。

public void ensureCapacity (int minimumCapacity) 重新设置字符号串缓冲区的总空间。如果minimumCapacity大于当前的总空间,则新的空间被设置:一种结果是minimumCapacity;另一种结果是{"老空间"乘2加2}。

4.StringBuffer的删除功能

StringBuffer deleteCharAt(int index) :删除指定位置出的字符,返回字符串缓冲区本身

StringBuffer delete(int start, int end) :删除从指定位置开始到指定位置结束,返回值字符串缓冲区本身

public void trimToSize()将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

5.StringBuffer的替换功能

public StringBuffer replace(int start,int end,String str):从指定位置开始到指定位置结束,用给定的str字符串替换指定的字符内容

public void setCharAt(int index, char ch):修改对象中索引值为index位置的字符为新的字符ch

6.StringBuffer的反转功能

public StringBuffer reverse () 反转功能

7.StringBuffer的截取功能

String substring(int start) :从指定位置默认截取到末尾,返回一个新的字符串

String substring(int start,int end):从指定位置开始截取到指定位置结束

void getChars(int srcBegin, int srcEnd, char\[\] dst, int dstBegin) 从当前StringBuffer对象的索引号srcBegin开始,到srcEnd结束的子串,赋值到字符数组dst中,并且从dst的索引号dstBegin开始。

8. StringBuffer查找功能

int indexOf(String str) 返回当前StringBuffer对象中,第一个满足str子串的位置。

int indexOf(String str, int fromIndex) 从当前StringBuffer对象的fromIndex开始查找,返回第一个满足str子串的位置。

int lastIndexOf(String str) 返回当前StringBuffer对象中,最后一个满足str子串的位置。

int lastIndexOf(String str, int fromIndex) 从当前StringBuffer对象的fromIndex开始查找,返回最后一个满足str子串的位置。

四、String类方法(分类参考

|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| 方法摘要 ||
| char | charAt (int index) 返回指定索引处的 char 值。 |
| int | codePointAt (int index) 返回指定索引处的字符(Unicode 代码点)。 |
| int | codePointBefore (int index) 返回指定索引之前的字符(Unicode 代码点)。 |
| int | codePointCount (int beginIndex, int endIndex) 返回此 String 的指定文本范围中的 Unicode 代码点数。 |
| int | compareTo (String anotherString) 按字典顺序比较两个字符串。 |
| int | compareToIgnoreCase (String str) 按字典顺序比较两个字符串,不考虑大小写。 |
| String | concat (String str) 将指定字符串连接到此字符串的结尾。 |
| boolean | contains (CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true。 |
| boolean | contentEquals (CharSequence cs) 将此字符串与指定的 CharSequence 比较。 |
| boolean | contentEquals (StringBuffer sb) 将此字符串与指定的 StringBuffer 比较。 |
| static String | copyValueOf (char\[\] data) 返回指定数组中表示该字符序列的 String。 |
| static String | copyValueOf (char\[\] data, int offset, int count) 返回指定数组中表示该字符序列的 String。 |
| boolean | endsWith (String suffix) 测试此字符串是否以指定的后缀结束。 |
| boolean | equals (Object anObject) 将此字符串与指定的对象比较。 |
| boolean | equalsIgnoreCase (String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。 |
| static String | format (Locale l, String format, Object... args) 使用指定的语言环境、格式字符串和参数返回一个格式化字符串。 |
| static String | format (String format, Object... args) 使用指定的格式字符串和参数返回一个格式化字符串。 |
| byte\[\] | getBytes () 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
| byte\[\] | getBytes (Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。 |
| void | getBytes (int srcBegin, int srcEnd, byte\[\] dst, int dstBegin) 已过时。 该方法无法将字符正确转换为字节。从 JDK 1.1 起,完成该转换的首选方法是通过 getBytes() 方法,该方法使用平台的默认字符集。 |
| byte\[\] | getBytes (String charsetName) 使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
| void | getChars (int srcBegin, int srcEnd, char\[\] dst, int dstBegin) 将字符从此字符串复制到目标字符数组。 |
| int | hashCode () 返回此字符串的哈希码。 |
| int | indexOf (int ch) 返回指定字符在此字符串中第一次出现处的索引。 |
| int | indexOf (int ch, int fromIndex) 返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。 |
| int | indexOf (String str) 返回指定子字符串在此字符串中第一次出现处的索引。 |
| int | indexOf (String str, int fromIndex) 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。 |
| String | intern () 返回字符串对象的规范化表示形式。 |
| boolean | isEmpty () 当且仅当 length() 为 0 时返回 true。 |
| int | lastIndexOf (int ch) 返回指定字符在此字符串中最后一次出现处的索引。 |
| int | lastIndexOf (int ch, int fromIndex) 返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。 |
| int | lastIndexOf (String str) 返回指定子字符串在此字符串中最右边出现处的索引。 |
| int | lastIndexOf (String str, int fromIndex) 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。 |
| int | length () 返回此字符串的长度。 |
| boolean | matches (String regex) 告知此字符串是否匹配给定的正则表达式。 |
| int | offsetByCodePoints (int index, int codePointOffset) 返回此 String 中从给定的 index 处偏移 codePointOffset 个代码点的索引。 |
| boolean | regionMatches (boolean ignoreCase, int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。 |
| boolean | regionMatches (int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。 |
| String | replace (char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
| String | replace (CharSequence target, CharSequence replacement) 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。 |
| String | replaceAll (String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
| String | replaceFirst (String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 |
| String\[\] | split (String regex) 根据给定正则表达式的匹配拆分此字符串。 |
| String\[\] | split (String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。 |
| boolean | startsWith (String prefix) 测试此字符串是否以指定的前缀开始。 |
| boolean | startsWith (String prefix, int toffset) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始。 |
| CharSequence | subSequence (int beginIndex, int endIndex) 返回一个新的字符序列,它是此序列的一个子序列。 |
| String | substring (int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。 |
| String | substring (int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。 |
| char\[\] | toCharArray () 将此字符串转换为一个新的字符数组。 |
| String | toLowerCase () 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。 |
| String | toLowerCase (Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。 |
| String | toString () 返回此对象本身(它已经是一个字符串!)。 |
| String | toUpperCase () 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 |
| String | toUpperCase (Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。 |
| String | trim () 返回字符串的副本,忽略前导空白和尾部空白。 |
| static String | valueOf (boolean b) 返回 boolean 参数的字符串表示形式。 |
| static String | valueOf (char c) 返回 char 参数的字符串表示形式。 |
| static String | valueOf (char\[\] data) 返回 char 数组参数的字符串表示形式。 |
| static String | valueOf (char\[\] data, int offset, int count) 返回 char 数组参数的特定子数组的字符串表示形式。 |
| static String | valueOf (double d) 返回 double 参数的字符串表示形式。 |
| static String | valueOf (float f) 返回 float 参数的字符串表示形式。 |
| static String | valueOf (int i) 返回 int 参数的字符串表示形式。 |
| static String | valueOf (long l) 返回 long 参数的字符串表示形式。 |
| static String | valueOf (Object obj) 返回 Object 参数的字符串表示形式。 |