StringBuffer 类
String类 是在所有项目开发之中一定会使用到的一个功能类,并且这个类拥有如下的特点:
- 每一个字符串的常量都属于一个 String 类的匿名对象,并且不可更改
- String 有两个常量池:静态常量池、运行时常量池
- String 类对象实例化建议使用直接赋值的形式完成,这样可以直接将对象保护在对象池中以下次重用
String 类的弊端:
为了解决此问题,专门提供有一个 StringBuffer
类可以实现字符串的内容修改
StringBuffer
并不像 String 类那样拥有两种对象实例化方式,StringBuffer
必须像.普通类对象那样,首先进行对象的实例化,而后才可以调用方法执行处理,而这个时候可以考虑使用 StringBuffer
类中的如下方法:.
- 构造方法:
public StringBuffer();
- 构造方法:
public StringBuffer(String str)
,接收初始化字符串内容;.
- 数据追加:
public StringBuffer append
(数据类型变量),相当于字符串中的“+”操作;
String与StringBuffer对比
范例:观察 String 与 StringBuffer 对比:
String 类对象引用传递:
public class StringTest {
public static void main(String[] args) {
String str = "我真帅";
change(str);
System.out.println(str);
}
private static void change(String data) {
data += ",天下第一帅";
}
}
// 结果:
我真帅
会发现引用change方法并没有改变str的值
StringBuffer 类对象引用传递:
public class StringTest {
public static void main(String[] args) {
String str = "我真帅";
StringBuffer sb = new StringBuffer(str);
change(sb);
System.out.println(sb.toString());
}
private static void change(StringBuffer data) {
data.append(",天下第一帅");
}
}
// 结果:
我真帅,天下第一帅
大部分情况下不是会出现改变字符串的内容,这种改变指的并不是针对于静态常量池的改变。
分析下列情况
public static void main(String[] args) {
String strA = "我真帅,天下第一帅";
String strB = "我真帅"+",天下第一帅";
System.out.println(strB == strA);
}
// 结果:
true
**注:**这个时候的 strB 对象的内容并不算是改变,严格的意义上来讲,对于现在的 strB 当程序编译之后会变为如下的形式:
String strB = "我真帅"+",天下第一帅";
// strB编译后会编程以下形式。
StringBuffer buf = new StringBuffer();
buf.append("我真帅").append(",天下第一帅");
**注:**所有的“+”在编译之后都变为了 StringBuffer 中的 append() 方法,并且在程序之中 StringBuffer 与 String 类对象之间可以直接相互转换:
- String 类对象变为 StringBuffer 可以依靠 StringBuffer 类的构造方法或者使用append 方法
- 所有类对象都可以通过 toString() 方法将其变为 String 类型
StringBuffer常用方法
在 StringBuffer 类里面除了可以支持有字符串内容的修改之外,实际上也提供有了一些 String 类所不具备的方法。
插入数据:
StringBuffer buf = new StringBuffer();
buf.append("小菜鸡").insert(0, "天下第一帅的我,").insert(8, "我就是");
System.out.println(buf);
// 结果:
天下第一帅的我,我就是小菜鸡
删除指定范围的数据:
StringBuffer buf = new StringBuffer("我是一个小菜鸟,来抓我呀");
buf.delete(7, 13);
System.out.println(buf);
// 结果:
我是一个小菜鸟
字符串反转:(重要)
StringBuffer buf = new StringBuffer("我是一个小菜鸟,来抓我呀");
System.out.println(buf.reverse());
// 结果;
呀我抓来,鸟菜小个一是我
注:实际上与 StringBuffer 类还有一个类似的功能类: StringBuilder 类.这个类是在 JDK1.5 的时候提供的,该类中提供的方法与 StringBuffer 功能相同,最大的区别在于 StringBuffer 类中的方法属于线程安全的,全部使用了 synchronized 关键字进行标注,而 StringBuilder 类属于非线程安全的。
String、StringBuffer、StringBuilder 的区别:
- String 类是字符串的首选类型,其最大的特点是内容不允许修改;
- StringBuffer '与 StringBuilder 类的内容允许修改;
- StringBuffer 是在 JDK 1.0 的时候提供的,属于线程安全的操作,而 StringBuilder 是在 JDK 1.5 之后提供的,不属于线程安全的操作。