1、String类的特点:
(1)String对象有两种实例化方式:
直接赋值
:只开辟一块堆内存空间。可以自动入池;
构造方法
:开辟两块堆内存空间,不会自动入池,可用intern()手工入池;
(2)字符串是String类的匿名对象;
(3)字符串一旦声明则不可更改,改变的是String对象的引用;
2、为解决String类的内容不可改变的问题,Java提供了StringBuffer
类(StringBuffer
对象的内容可以修改)。
String类使用+
进行字符串的连接,而StringBuffer
必须使用append()
进行连接操作:
append()
定义:public StringBuffer append(数据类型 变量);
范例:StringBuffer
使用
public class Demo {
public static void main(String[] args) {
// String类可以直接赋值,但是StringBuffer只能通过构造方法
StringBuffer buf = new StringBuffer();
buf.append("hello").append(" World ").append("!!");
change(buf); // 引用传递
System.out.println(buf);
// 结果:
// hello World !!
// Hello
}
public static void change(StringBuffer temp) {
temp.append("\n").append("Hello");
}
}
由上述代码可以发现StringBuffer
类的内容可以修改,而String的内容不可以修改。
3.、String
类与StringBuffer
类的定义
String类 | StringBuffer类 |
---|---|
public final class String extends Object implements Serializable, Comparable<String>, CharSequence | public final class StringBuffer extends Object implements Serializable, CharSequence |
由上表得知,String
和StringBuffer
都是CharSequence
接口的子类。因此在开发中,如果某些方法的操作使用CharSequence
接口,那么只要传递字符串即可。
public class Demo {
public static void main(String[] args) {
CharSequence seq = "hello"; // 向上转型
System.out.println(seq); // 调用String类覆写的toString()
}
}
4、虽然String和StringBuffer
类有着共同的接口,但是这两个类的对象之间不能直接转换。
(1)将String变为StringBuffer
对象有两种方式:
方式一:利用StringBuffer
构造方法:public StringBuffer(String str);
public class Demo {
public static void main(String[] args) {
// 将Hello由String型变为StringBuffer型
StringBuffer buf = new StringBuffer("Hello");
System.out.println(buf);
}
}
方式二:利用append()
:public StringBuffer append(String str)
;
public class Demo {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer();
// 将Hello由String型变为StringBuffer型
buf.append("Hello");
System.out.println(buf);
}
}
(2)将StringBuffer
变为String类对象
方式一: 利用toString()
可以将StringBuffer
转换为String;
public class Demo {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer("Hello");
String str = buf.toString();
System.out.println(str);
}
}
方式二:利用String类的构造方法:public String(StringBuffer buffer);
5、String类中提供有与StringBuffer
对象比较的方法:public boolean contentEquals(StringBuffer sb)
范例:比较String
与StringBuffer
public class Demo {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer("Hello");
System.out.println("hello".contentEquals(buf)); // false
System.out.println("Hello".contentEquals(buf)); // true
}
}
6、String类中定义了许多方法,便于用户开发;而StringBuffer
中也定义了许多方法,而且部分方法与String类正好互补。
(1)字符串反转:public StringBuffer reverse();
public class Demo {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer("Hello");
System.out.println(buf.reverse()); // olleH
}
}
(2)在指定位置插入数据:public StringBuffer insert(intoffset,数据类型 变量);
public class Demo {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer("Hello");
buf.insert(0, "MLDN").insert(0, "你好");
System.out.println(buf); // 你好MLDNHello
// 可以插入任意数据类型的数据
buf.insert(0,11);
System.out.println(buf); // 11你好MLDNHello
}
}
(3)删除部分数据:public StringBuffer delete(int start,int end);
public class Demo {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer("Hello");
buf.delete(2,4);
System.out.println(buf); // Heo
}
}
7、JDK1.5新增了一个字符串操作类:StringBuilder
,定义结构如下:
public final class StringBuilderextends Object implements Serializable,CharSequence
StringBuffer
和StringBuffer
类在定义上非常相似,并且方法也几乎一样。
小结:String、
StringBuffer
和StringBuilder
的区别?String的内容一旦声明则不可改变,而
StringBuffer
和StringBuilder
声明的内容可以改变;
StringBuffer
类中提供的方法都是同步方法,属于安全的线程操作;而StringBuilder
提供的方法都是非同步方法,属于不安全的线程操作。开发中使用String类,只有要频繁修改内容时,才考虑使用
StringBuffer
或StringBuilder
。