String类与StringBuffer类
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) |
int | codePointAt(int index) |
int | codePointBefore(int index) |
int | codePointCount(int beginIndex, int endIndex) |
int | compareTo(String anotherString) |
int | compareToIgnoreCase(String str) |
String | concat(String str) |
boolean | contains(CharSequence s) |
boolean | contentEquals(CharSequence cs) |
boolean | contentEquals(StringBuffer sb) |
static String | copyValueOf(char[] data) |
static String | copyValueOf(char[] data, int offset, int count) |
boolean | endsWith(String suffix) |
boolean | equals(Object anObject) |
boolean | equalsIgnoreCase(String anotherString) |
static String | format(Locale l, String format, Object... args) |
static String | format(String format, Object... args) |
byte[] | getBytes() |
byte[] | getBytes(Charset charset) |
void | getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin) |
byte[] | getBytes(String charsetName) |
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() |
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) |
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) |
String | replace(CharSequence target, CharSequence replacement) |
String | replaceAll(String regex, String replacement) |
String | replaceFirst(String regex, String 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 | toLowerCase(Locale locale) |
String | toString() |
String | toUpperCase() |
String | toUpperCase(Locale locale) |
String | trim() |
static String | valueOf(boolean b) |
static String | valueOf(char c) |
static String | valueOf(char[] data) |
static String | valueOf(char[] data, int offset, int count) |
static String | valueOf(double d) |
static String | valueOf(float f) |
static String | valueOf(int i) |
static String | valueOf(long l) |
static String | valueOf(Object obj) |