java.lang里String相关的类主要有三个: String/StringBuffer/StringBuilder。其中最特殊的要数String类。
学习语言的最好途径是源代码和jdk,所以我们先来看看他们的源代码片断,各自的特性就自然而然展现出来。
(一) 字符串类的特性
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char value[];
从上面的代码中大家可能已经看出了点什么端倪,接下来我就总结一下:
1,这三个类都用final修饰,所以他们都是不可以继承的。
2,只有String类的value--字符串值---用了final修饰,这指明了value在String对象创建之后就不能修改(immutable),
而StringBuffer和StringBuilder是可以的。也就是说如果你需要一个可以任你随时改变的字符串的时候,应该用StringBuffer
或者StringBuider,而不是String。
这个时候或许你有疑问了---
Qa1:既然String是类,那么我可以用new来创建它了? String s = new String("hello");
Answer:最好不要这样,因为这样会生成两个String对象,不仅加大了内存开销还降低了效率。
jdk说,当jvm碰到"hello"这样的字面字符串,会自动为其生成一个String对象。
既然jvm已经替你生成了,你何必再去生成一次呢?只需要定义一个指向String对象的引用,然后让引用指向那个对象就可以了。
即: String s = "hello";
Qa2:我经常看到如下的代码,明明s的value改变了呀问什么说value不能改变呢?
String s = "abc"; s = s+"de";
Answer: 这里s的value确实是不一样了,但是是因为s指向的object变了,而不是object本身的value变了。
其实每次你试图改变的时候jvm都会为你生成一个新的object。 上面的“+”的结果就是创建了一个新的String对象,
它的value是“abcde”,然后s指向了这个新的String object,表面上看,你确实改变了s的value。但请牢记,s只是
可以指向String对象的一个引用,而不是对象本身。
(二)字符串对象提供的服务
接下来我们看一下这三个字符串类给我们提供了什么服务。