String类是所有项目开发中一定会用到的一个功能类,并且这个类拥有如下的特点:
- 每一个字符串的常量都属于一个String类的匿名对象,并且不可更改;
- String有两个常量池:静态常量池、运行时常量池;
- String类对象实例化建议使用直接赋值的形式完成,这样可以直接将对象保存在对象池之中以方便下次重用。
虽然String类很好使用,但是如果认真去思考也会发现其最大的弊端:内容不允许修改,虽然大部分情况下我们都不会涉及到字符串内容的频繁修改,但是依然会存在这样的情况,多以为了解决此问题,专门提供了一个StirngBuffer类实现字符串内容的修改处理。
**范例:**观察String与StringBuffer的对比
Stirng类对象的引用传递:
public class JavaApi {
public static void main(String[] args) {
String str = "Hello ";
change(str);
System.out.println(str); //内容没有发生改变
}
public static void change(String temp){
temp += "world";
}
}
StirngBuffer并不像Stirng类那样有两种对象实例化,StringBuffer必须像普通类那样首先进行对象实例化,而后在才可以调用方法进行处理,而这个时候可以调用StringBuffer类中的如下方法:
- 构造方法: public StirngBuilder(){};
- 构造方法: public StringBuilder(String str){};
- 数据追加: public StringBuilder append(数据类型 变量);相当于字符串的加操作。
StringBuffer类引用传递:
public class JavaApi {
public static void main(String[] args) {
StringBuffer btf = new StringBuffer("Hello ");
change(btf);
System.out.println(btf); //内容没有发生改变
}
public static void change(StringBuffer temp){
temp.append("world !");
}
}
大多数情况下,很少会出现有字符串内容的改变,这种改变指的并不是针对于静态常量池的改变:
**范例:**分析一下已有问题
public static void main(Stirng[] args){
Stirng strA = "www.baidu.com";
String strB = "www." + "mldn" +".com";
System.out.println(strA == strB);
}
这个时候的strB对象内容的改变不算改变,从更加严格的意义上来讲,对于现在的strB当程序编译之后会变为如下形式:
String strB = "www." + "mldn" +".com";
StringBuffer buf = new StringBuffer();
buf.append("www.").append("mldn").append(".com);
所有的“+”在编译之后都变为了StirngBuffer中的append()方法,并且在程序中StirngBuffer与String类对象之间可以互相转换:
- String类对象变为StringBuffer可以依靠StringBuffer的构造方法或者append()方法
- 所有的类对象都可以通过toStirng()方法变为String对象。
在StringBufferl类里面除了有字符串修改以外,实际上也提供了一些其他的方法:
1、插入数据: publc StirngBuffer insert(int offset,数据类型 变量);
public static void main(String[] args) {
StringBuffer btf = new StringBuffer();
btf.append(".com").insert(0,"www.").insert(4,"baidu");
System.out.println(btf); //内容没有发生改变
}
2、删除指定范围的数据: public StringBuffer delete(int start,int end);
public static void main(String[] args) {
StringBuffer btf = new StringBuffer();
btf.append("hello world").delete(6,12).insert(6,"baidu");
System.out.println(btf); //内容没有发生改变
}
3、字符串内容的反转
public static void main(String[] args) {
StringBuffer btf = new StringBuffer();
btf.append("hello world");
System.out.println(btf.reverse()); //内容没有发生改变
}
实际上与StringBuffer类还有一个类似的功能类:StringBuilder类,这个类是JDK1.5的时候提供的,该类中提供的方法,与StringBuffer的功能相同,最大的区别在于StringBuffer类中的方法属于线程安全的,全部方法使用synchronized关键字标注,而StringBuilder类属于非线程安全的。
**面试题:请解释String、StringBuffer、StringBuilder的区别?
- Stirng类是字符串的首选型,其最大特点是内容不允许修改;
- StringBuffer和StringBuilder类的内容可以进行修改;
- StringBuffer是在JDK1.0的时候提供的,属于线程安全的操作,StringBuilder是在JDK1.5的时候提供的,属于非线程安全的操作。