目
录
四.String类,StringBuffer类和StringBuilder类的区别
一.StringBuffer类
1.StringBuffer
我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间.StringBuffer就可以解决这个问题.
StringBuffer是一个字符容器,是线程安全的可变字符序列.
2.StringBuffer的构造方法
- public StringBuffer(): 无参构造方法
- public StringBuffer(int capacity): 指定容量的字符串缓冲区对象
- public StringBuffer(String str): 指定字符串内容的字符串缓冲区对象
public class Test {
public static void main(String[] args) {
// StringBuffer:长度可变的字符容器。
/* StringBuffer() 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。*/
StringBuffer sb = new StringBuffer();
//你可以指定容器容量,例如指定100
StringBuffer stringBuffer = new StringBuffer(100);
//指定字符串内容的字符串缓冲区对象
StringBuffer sb2 = new StringBuffer("abc");
}
}
3.StringBuffer的取容量和长度的方法:
- public int capacity(): 返回当前容量。 理论值
- public int length(): 返回长度(字符数)。 实际值
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
StringBuffer stringBuffer = new StringBuffer(100);
StringBuffer sb2 = new StringBuffer("abc");
//获取容量的方法
int capacity1 = sb.capacity();
System.out.println(capacity1); //16
int capacity2 = stringBuffer.capacity();
System.out.println(capacity2); //100
int capacity3 = sb2.capacity();
System.out.println(capacity3); //19=16+3 16:默认容量 3:abc字符串的长度
//获取字符容器的长度
int length1 = sb.length();
System.out.println(length1); //0
int length2 = stringBuffer.length();
System.out.println(length2); //0
int length3 = sb2.length();
System.out.println(length3); //3
}
}
如何区分容量和长度?
按照生活中的实例水杯来说:一个水杯的额定容量是500ML ,实际装水 100ML.那么容量就是500ML,长度为100ML.也就是,容量为总的容量,而长度就是实际装的容量.
注意:有参构造方法的容量为16(默认容量)+字符串的长度.(StringBuffer的容量如果超过16,会自动扩展.)
4.StringBuffer添加功能方法:
- public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
- public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("秃头小编");
//往容器中追加内容,返回的还是原来的容器本身。
//append()
StringBuffer sb2 = sb.append("不想再秃头");
//sb 和 sb2 是同一个容器对象吗?是
System.out.println(sb == sb2); //true
StringBuffer sb3 = new StringBuffer();
sb3.append("我").append("爱").append("你").append(10000).append("年").append(true);
//StringBuffer 重写了toString方法,把容器中的数据,转换成字符串返回
String str = sb3.toString();
System.out.println(str); //我爱你10000年true
//insert()
StringBuffer sb4 = new StringBuffer();
sb4.append("aaa");
sb4.append("ccc");
sb4.append("ddd");
System.out.println(sb4); //aaacccddd
//可以往指定索引处,追加内容,返回的还是原来的容器
sb4.insert(2, "eee");
System.out.println(sb4); //aaeeeacccddd
}
}
5. StringBuffer删除功能的方法
- public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
- public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer().append("删除指定位置的字符,并返回本身");
//字符容器中的字符,也是编有索引的 ,从0开始
//根据索引删除容器中的某个字符,返回的还是原来的容器
sb.deleteCharAt(0);
System.out.println(sb); //除指定位置的字符,并返回本身
//从起始索引到终止索引,来删除容器中一段内容,返回的还是容器本身,含头不含尾
sb.delete(0, 3);
System.out.println(sb); //位置的字符,并返回本身
}
}
6.StringBuffer替换和反转功能的方法
- public StringBuffer replace(int start,int end,String str):从start开始到end用str替换
- public StringBuffer reverse():字符串反转
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer().append("从start开始到end用str替换");
//根据起始索引和终止索引,替换容器中一步分内容,返回的还是容器本身
sb.replace(0, sb.indexOf("到") + 1, "呵呵");
System.out.println(sb); //呵呵end用str替换
//StringBuffer的反转功能
sb.reverse();
System.out.println(sb); //换替rts用dne呵呵
}
}
7.StringBuffer截取功能的方法
- public String substring(int start):从指定位置截取到末尾
- public String substring(int start,int end):截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
注意:返回值类型不再是StringBuffer本身
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer().append("StringBuffer的截取功能");
//根据起始索引和终止索引,从容器中截取一部分内容返回,注意返回的是字符串
String s = sb.substring(0, sb.indexOf("的")); //含头不含尾
//返回的不再是容器本身
System.out.println(s); //StringBuffer
System.out.println(sb); //StringBuffer的截取功能
}
}
二.StringBuilder类
首先StringBuilder中的方法与StringBuffer中的方法完全一样.
其区别在于:StringBuilder是线程不安全的可变字符序列.执行效率要比StringBuffer高一些.
StringBuilder类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。
三.StringJoiner类
- StringJoiner(CharSequence delimiter) : 构建了一个字符容器,指定分隔符
- StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) : 构建了一个字符容器,指定分隔符,前缀,后缀
- StringJoiner add(CharSequence newElement) : 增加了一份给 CharSequence值的 StringJoiner价值的下一个元素。也就是拼接,这个方法只能拼接字符串.
- int length() : 返回该 StringJoiner的 String表示长度。
- String toString(): 把容器中的数据以字符串返回
import java.util.StringJoiner;
public class Test {
public static void main(String[] args) {
//构建了一个字符容器,指定分隔符
StringJoiner sj=new StringJoiner(",");
//add只能拼接字符串
sj.add("1111").add("2222").add("3333");
System.out.println(sj); //1111,2222,3333
//构建了一个字符容器,指定分隔符,前缀,后缀
StringJoiner sj2=new StringJoiner(",","[","]");
sj2.add("aaa").add("bbb").add("ccc");
System.out.println(sj2); //[aaa,bbb,ccc]
//返回该 StringJoiner的 String表示长度
int a=sj.length();
System.out.println(a); //14
//StringJoiner中的toString方法重写了,调用重写之后的toString方法,把容器中的数据以字符串返回
System.out.println(sj2.toString()); //[aaa,bbb,ccc]
}
}
四.String类,StringBuffer类和StringBuilder类的区别
- String字符串长度不可变,StringBuffer和StringBuilder的字符串长度是可变的!
- String内存地址指向更改,StringBuffer,StringBuilder可在原来的地址上继续拼接(String拼接字符串并不是在原来的对象上拼接的!而是生成了新的拼接后的对象!然后内存地址指向更改!而StringBuffer和StringBuilder的字符串拼接后还是在原来的容器里!)
- String相对于其他两个,它的执行效率最低,StringBuffer比StringBuilder的执行效率低一些,StringBuilder的执行效率最高!
- StringBuilder与StringBuffer的方法完全相同,其唯一的不同点就是StringBuffer线程安全,而StringBuilder线程非安全.
(小编也在努力学习更多哟!以后会多多分享哒!)
希望对友友们有所帮助!!!!