字符串

从日常的程序设计角度看,Java最重要的数据类型之一就是String.String定义并支持字符串.在其他许多程序设计语言中,字符串是字符数组,而在Java中却并非如此.在Java中,字符串是对象.当创建一个字符串字面值时,实际上就创建了一个String对象.例如:
System.out.println("In Java ,strings are objects");
Java使字符串”In Java,strings are objects”,自动成为String对象.因此,在前面的程序中,字符串的使用是藏在幕后的,然而,然而注意String类是非常庞大的.
1.构造字符串
可以像构造其他类型的对象那样,构造字符串:使用new并调用String构造函数.例如:
String str = new String("Hello");
该语句创建了一个名为str的String对象,他包含字符串”Hello”.也可以从一个String对象创建另一个String对象,例如:
String str = new String("Hello");
String str2 = new String(str);
执行这些代码后,str2也包含字符串”Hello”.创建String对象的另一种简单方法如下所示:
String str = “Java string are powerful”;
在本例中,str被初始化为字符序列”Java string are powerful”.
一旦创建一个String对象,就可以在任何允许使用被引用字符串的地方使用他.例如,可以把String对象作为println()实参来使用,如下所示:
    public static void main(String args[])
    {
        String str1 = new String("Java strings  are objects.");
        String str2 = "They are constructed  various ways.";
        String str3 = new String(str2);
        
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }
输出:
Java strings are objects.
They are constructed various ways.
They are constructed various ways.
2.操作字符串
String类包含操作字符串的若干方法,下表列出了其中的几个常用方法:
方法
描述
boolean equals(str)
如果调用字符串包含的字符序列与str一样,这返回true
int length()
获取字符串的长度
char charAt(index)
获取index指定的索引位置的字符
int compareTo(str)
如果调用字符串小于str,则返回小于0的数;如果调用字符串大于str,这返回大于0的数;如果相等则返回0
int indexOf(str)
在调用字符串中查找str指定的字串,返回第一个匹配的索引,如果没有匹配项,这返回-1
int lastIndexOf(str)
在调用字符串中查找str指定的字符串,返回最后一个匹配的索引,如果没有匹配项,这返回-1
问:String为什么要定义equals()方法,不能使用==吗?
答:equals()方法比较两个String对象的字符串序列是否相等.把==应用到两个字符串引用只是用来判断两个引用所指的是否是同一对象.
3.字符串数组
同其他数据类型一样,字符串也可以存储在数组中,例如:
    public static void main(String args[])
    {
        String strs[] = {"aaa","bbb","ccc"};
        
        for(String oneString : strs)  System.out.println(oneString);
    }
输出:
aaa
bbb
ccc
4.字符串是不可变的
String对象的内容是不能改变的.即一旦创建String对象,组成字符串的字符序列就是不可改变的.这一限制使得Java可以更有效的实现字符串,尽管这听起来像一个严重的缺点,但是事实并非如此.当需要与已有字符串略有区别的字符串时,只需创建所需的新字符串即可.因为无用的String对象会自动被回收,所以甚至不必担心无用的字符串会造成什么影响.然而,必须清楚的是,String引用变量可以改变他们引用的对象.创建对象后,不可以改变的只是特定String对象的内容.
问:你说一旦创建String对象,他就是不可变的.从实际的角度来理解,我认为这不是一个严格的限制,但是如果我想创建一个可变的字符串,该怎么办?
答:Java提供了一个名为StringBuffer的类,他创建的字符串对象是可以改变的.例如,除了用于在具体位置获取字符的charAt()方法以外,StringBuffer还定义了setCharAt(),用于在字符串中设置字符.Java还提供了一个与StringBuffer相关的StringBuilder类,该类创建的字符串对象也是可以改变的.然而,多数情况下需要使用的是String,而不是StringBuffer或StringBuilder.
不可变字符串绝不是程序设计的障碍,为完全理解其中的原因,我们使用String类的另一个方法:substring().substring()方法返回一个包含调用字符串指定部分的新字符串.因为新String对象是包含原字符串的子串,所以原字符串没有变化,也没有违背不变原则.我们将使用substring()方法的形式如下所示:
String substring(int startIndex,int endIndex)
这里startIndex指定索引起始点,而endIndex指定索引结束点,下面是用于演示substring()和不可变字符串原则的程序:
    public static void main(String args[])
    {
        String orgstr = "Java makes the web  move.";
        String substr = orgstr.substring(5,18);
        
        System.out.println("orgstr : "+orgstr);
        System.out.println("substr : "+substr);
    }
输出:
orgstr : Java makes the web move.
substr : makes the web
如你所见,源字符串orgstr没有变化,substr包含子字符串.
5.使用String控制switch语句
在JDK7以前,必须使用整数类型(int或char)来控制switch语句.其局限就是,当需要根据一个字符串的内容来选择几个动作之一时,就不能使用switch语句,而是要使用if-else-if在语义上是正确的,但switch语句是用于这种选择的一种更加自然的方式.幸好,这种情况已被纠正,现在可以使用String来控制switch语句了,许多情况下,这可以得到可读性更好,更加简洁的代码.
下面的示例代码演示了如何使用String来控制switch语句:
    public static void main(String args[])
    {
        String command = "a";
        
        switch(command)
        {
            case "a":
                System.out.println("aaa");
                break;
            case "b":
                System.out.println("bbb");
                break;
        }
    }
输出:
aaa