5.1 String类

  String类表示字符串,Java 程序中的所有字符串(例如“雷静”)都作为此类的对象。String类不是基本数据类型,它是一个类。因为对象的初始化默认值是null,所以String类对象的初始化默认值也是null。String是一种特殊的对象,具有其他对象没有的一些特性。

  String字符串是常量,字符串的值在创建之后不能更改。

  String类是最终类,不能被继承。

5.1.1 String类的概念

  如何使用String类操作字符串呢?首先要定义并初始化字符串。String类包括以下常用的构造方法。

  • String(String s):初始化一个新创建的String对象,使其表示一个与参数相同的字符序列。

  • String(char[] value):创建一个新的String对象,使其表示字符数组参数中当前包含的字符序列。

  • String(char[] value, int offset, int count):创建一个新的String对象,它包含取自字符数组参数的一个子数组的字符序列。offset参数是子数组第一个字符的索引(从0开始建立索引),count 参数指定子数组的长度。

  例如:

String stuName1 = new String("王云");

char[] charArray = {'刘','静','涛'};

String stuName2 = new String(charArray);

String stuName3 = new String(charArray,1,2);//从'静'字开始,截取2个字符,结果是“静涛”
copy

  实际上,最常使用的创建String类字符串的方法如下。

String stuName1 = "王云";
copy

  在实际编程过程中,常常有这样的需求,需要在一个字符串后面增加一些内容,例如需要在stuName1后面增加字符串“同学”。查询相关资料,知道String类提供了一个concat(String str)的方法,可以在String类字符串后面增加字符串。有如下代码:

class TestString2 

{

    public static void main(String[] args) 

    {

        String stuName1 = new String("王云");

        stuName1.concat("同学");

        System.out.println(stuName1);

    }

}
copy

  其输出结果是“王云”,而不是“王云同学”。为什么呢?

  在本章开始就介绍过String字符串是常量,字符串的值在创建之后不能更改。concat(String str)方法的输出是,创建了一个新String字符串,用来存stuName1字符串加上“同学”的结果,而不是在原来stuName1字符串的后面增加内容,对于stuName1而言,它是常量,内容并没有变化。所以,如果想输出“王云同学”,可以将stuName1.concat("同学")表达式的结果赋给一个新的字符串,然后再输出该字符串即可。

  再看下面的案例。

class TestString3 

{

    public static void main(String[] args) 

    {

        String stuName1 = new String("王云");

        System.out.println(stuName1);

        stuName1 = "刘静涛";

        System.out.println(stuName1);

    }

}
copy

  代码的输出结果如下。

王云

刘静涛
copy

  不是说String字符串是不可变的常量吗?怎么两次输出stuName1,却发生变化了呢?究其原因,主要是这里说的不可变是指在堆内存中创建出来的String字符串不可变。事实上,stuName1 = "刘静涛";语句已经新创建了一个String字符串,并让stuName1指向了这个新的String字符串,原来存放“王云”的这个String字符串没有发生变化,如图5.1所示。

图5.1 引用类型变量重赋值

5.1.2 String类的使用

1.连接字符串

  前面介绍了采用public String concat(String str)方法连接字符串。事实上,采用最多的方法是使用“+”进行String字符串连接。之前的代码,在控制台输出程序运行结果的时候,都是使用“+”进行String字符串的连接。

  执行下面的程序,其运行结果如图5.2所示。

public class TestStringConcat {

    public static void main(String[] args) {

        //使用"+"进行字符串连接

        System.out.println("使用'+'进行字符串连接");

        String s1 = "您好";

        s1 = s1 + ",蒋老师!";//创建一个新字符串用来连接两个字符串,并让s1指向这个新字符串

        System.out.println(s1);

        //使用public String concat(String str)方法连接

        System.out.println("使用public String concat(String str)方法连接");

        String s2 = "您好";

        //创建一个新字符串用来连接两个字符串,但没有变量指向这个新字符串

        s2.concat(",田老师!");

        //创建一个新字符串用来连接两个字符串,并让s3指向这个新字符串

        String s3 = s2.concat(",田老师!");

        System.out.println(s2);

        System.out.println(s3);

    }

}
copy
图5.2 连接String字符串

2.比较字符串

  比较字符串常用的两个方法是运算符“==”和String类的equals方法。

  使用“==”比较两个字符串,是比较两个对象的地址是否一致,本质上就是判断两个变量是否指向同一个对象,如果是则返回true,否则返回false。而String类的equals方法则是比较两个String字符串的内容是否一致,返回值也是一个布尔类型。

  先看下面的例子。

public class TestStringEquals {

    public static void main(String[] args) {

        String s1 = "Java基础";

        String s2 = "Java基础";

        System.out.println(s1 == s2);                           //返回true

        System.out.println(s1.equals(s2));           //返回true

        String s3 = new String("前端技术");

        String s4 = new String("前端技术");

        System.out.println(s3 == s4);                           //返回false

        System.out.println(s3.equals(s4));           //返回true

    }

}
copy

  程序的运行结果如图5.3所示。

图5.3 比较String字符串