在上一篇讲解字符串类String的文章中:
点击查看:【Java数据类型】“字符串”全解之“String类”
详解了String类对于字符串的构造方法
、功能API
、基本数据类型与String类的转换
,对Java语言中对于字符串的理解和使用有一定的认识与理解,在这篇文章中,我将继续阐述其他两种字符串相关类:StringBuffer和StringBuilder。
StringBuffer字符串的核心特性:
概览:
append:连接串;
insert:插入
delete:删
setCharAt:改某一个位置字符
reverse:反转
trimToSize:缩减空间
根据API,可以追加所有的基本数据类型的数据到一个串中去;
方法原型: public StringBuffer append(数据类型x);
//append()方法使用示例
public class Main {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("abc");
boolean a = true;
s.append(a); //在字符串后追加一个布尔类型
System.out.println(s); //abctrue
int b = 666;
s.append(b); //在字符串后追加一个int类型
System.out.println(s);//abctrue666
double c = 99.9;
s.append(c); //在字符串后追加一个double类型
System.out.println(s); //abctrue66699.9
}
}
方法原型: public StringBuffer insert(int offset, 数据类型 x);
其中,offset是位置,x是要插入的数据
//insert方法使用示例
import java.lang.StringBuffer;
public class Main {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("abc");
sb1.insert(1,"123"); //在原本串的下标为1的位置插入字符串;
System.out.println(sb1); //输出:a123bc
StringBuffer sb2 = new StringBuffer("abc");
sb2.insert(1,3.14159); //在原本串的下标为1的位置插入一个double类型的数;
System.out.println(sb2); //输出:a3.14159bc
//insert方法可以插入所有数据类型的值;
}
}
方法原型:
public StringBuffer deleteCharAt(int index);
其中方法参数只能是int型的整数;public StringBuffer delete(int start,int end);
public class Main {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("hello,world.");
StringBuffer sb2 = sb.deleteCharAt(1);
System.out.println("sb2 = " + sb2); //sb2 = hllo,world.
StringBuffer sb3 = sb.delete(0,3); //从0开始,向后删三个
System.out.println("sb3 = " + sb3); //sb3 = o,world.
}
}
setCharAt方法: 仅修改一个位置的一个字符
方法原型: public void setCharAt(int index, char ch);
方法功能: 该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。
public class Main {
public static void main(String args[]) {
StringBuffer sb = new StringBuffer("abc");
sb.setCharAt(1,'x'); //该表原本下标为1的字符;
System.out.println(sb); //输出:axc
sb.reverse();
System.out.println(sb); //输出:cxa
}
}
方法原型: public StringBuffer reverse();
功能: 将StringBuffer对象中的内容反转,然后形成新的字符串。
public class Main {
public static void main(String args[]) {
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = sb.reverse();
System.out.println("reverse: " + sb2); //reverse: cba
}
}
需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制
类型转换,下面的代码都是错误的:
StringBuffer s = "abc"; //赋值类型不匹配
StringBuffer s = (StringBuffer)"abc"; //不存在继承关系,无法进行强转
//String和StringBuffer的转化(正确方法)
public class Main {
public static void main(String[] args) {
//StringBuffer对象和String对象之间的互转的代码如下:
String s = "abc";
StringBuffer sb1 = new StringBuffer("123");
StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer
String s1 = sb1.toString(); //StringBuffer转换为String
}
}
StringBuilder诞生的背景:
相同点:
1. 两个类都是字符串缓冲类。其内容都是可变的。
2. 两个类的方法都是一致的。
不同点:
1. StringBuffer是多线程安全的(加了锁),操作效率低 ,StringBuilder是线程非安全的(没加锁),操作效率高。
2. StringBuffer是jdk1.0出现 的,StringBuilder 是jdk1.5的时候出现的。
推荐使用: StringBuilder,因为操作效率高。
概览:
capacity:当前容量
length:当前长度
append:追加
reverse:反转
方法原型:
public class StringBuilderDemo {
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder();
System.out.println("sb:"+sb);
System.out.println("sb.capacity():"+sb.capacity()); //容量,输出:16
System.out.println("sb.length():"+sb.length()); //当前大小,输出:0
}
}
追加: public StringBuilder append(任意类型)
public class StringBuilderDemo {
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder();
/*
sb.append("hello");
sb.append("world");
sb.append(true);
sb.append(100);
*/
//链式编程
sb.append("hello").append("world").append(true).append(100);
System.out.println("sb:"+sb);
}
}
StringBuilder – String:
public String toString()
: 通过toString()就可以实现把StringBuilder转成String
String – StringBuilder:
StringBuilder(String str)
: 通过构造方法就可以实现把String转成StringBuilder
public class StringBuilderTest {
public static void main(String[] args) {
//StringBuilder 转换为 String
StringBuilder sb = new StringBuilder();
sb.append("hello").append("world");
String s = sb.toString();
System.out.println(s);
//String 转换为 StringBuilder
String s = "helloworld";
StringBuilder sb = new StringBuilder(s);
System.out.println(sb);
}
}
多线程
下在字符缓冲区进行大量操作的情况;单线程
下在字符缓冲区进行大量操作的情况;请访问我的GitHub仓库,或直接点击:https://github.com/Kyle-Shawe/JavaSE-Study-Notes,进入“数据类型以及关系”文件夹中。