第6章 使用字符串来交流
本章介绍如下内容:
使用字符串来存储文本;
在程序中显示字符串;
在字符串中包含特殊的字符;
拼接字符串;
在字符串中包含变量;
比较字符串;
判断字符串的长度。
在电影《钢琴》中,Holly Hunter 扮演的 Ada 是一位年轻的苏格兰妇女,她从 6 岁起就是哑巴,只能通过弹钢琴来表达自己。
同Ada一样,计算机程序能够安静地工作,从来不停下来聊天或演奏钢琴。然而如果《钢琴》告诉了我们什么,那就是交流和食物、水和住所一样,是人类的基本需求(这部电影还告诉我们,演员 Harvey Keitel 对自己的肢体表达能力很自信,但这不是本书讨论的内容)。
Java 程序将字符串作为与用户交流的主要方式。字符串是一组文本,可以包含字母、数字、标点符号及其他字符。本章将介绍如何在Java程序中使用字符串。
6.1 在字符串中存储文本
字符串用来存储文本并显示给用户。字符串中最基本的元素是字符。字符可以是一个字母、数字、标点符号,或者是其他符号。
在Java程序中,字符是可存储到变量中的信息类型之一,字符型变量是在语句中使用char来创建的,如下所示:
这条语句创建了一个名为keyPressed的变量,可用于存储字符。当创建字符型变量时,可以设置其初始值,如下所示:
字符值必须用单引号括起来。
字符串是一组字符,可以使用String和变量名来创建存储字符串值的变量,如下所示:
这条语句创建了一个名为 fullName 的字符串变量,并在其中存储了文本“Ada McGrath Stewart”,这是Hunter的钢琴家的全名。在Java语句中,字符串用双引号括起,但双引号不是字符串的一部分。
不同于你前面使用过的其他类型变量:int、float、char、boolean,表示字符串类型的String的首字母必须大写。
这样做的原因是,字符串类型与Java中的其他类型有些不同。字符串是一种称为对象的特殊信息,而所有对象类型名的首字母都必须大写。有关对象的知识将在第 10 章介绍。在本章需要注意的是,字符串与其他变量类型不同,由于这种差别,在语句中指定字符串类型时, String的首字母必须大写。
6.2 在程序中显示字符串
在 Java 程序中,显示字符串的最基本方法是使用 System.out.println( )语句。该语句可在括号中接收字符串和其他变量,并将它们显示在系统输出设备中,即计算机监视器。下面是一个例子。
上述语句将显示下列文本:
在屏幕上显示文本通常称为打印,这就是 println( )代表的意思:打印该行。你可以使用System.out.println( )语句显示用双引号括起的文本和变量(稍后你将会看到)。将所有要显示的内容都放在括号内。
另一种显示文本的方法是调用 System.out.print( ),该语句显示括号中的字符串和其他变量,但不同于 System.out.println( ),它让接下来的语句在同一行显示文本。
可以连续使用 System.out.print( )多次,将内容显示在同一行,如下例所示:
这些语句输出的文本如下:
6.3 在字符串中使用特殊字符
创建或显示字符串时,其文本必须用双引号括起。这些双引号不会显示出来,这就提出了一个很好的问题:如果要显示双引号该怎么办呢?
为显示双引号,Java 创建了一个特殊编码\",可放到字符串中。在字符串中遇到该编码时,将其替换为双引号。例如,请看下面的例子:
这段代码显示如下内容:
可以采用这种方式在字符串中插入多个特殊字符,下面列表出了这些特殊字符,注意到每个都是以反斜线(\)打头。
换行符的作用是在下一行行首显示换行符后面的文本,请看下面的例子:
这条语句将显示如下内容:
6.4 拼接字符串
使用 System.out.println( )语句以及用其他方式处理字符串时,可以使用加号(+)将两个字符串拼接起来。这里用到的加号和用来对数值进行求和的加号相同。
将运算符+用于字符串,其含义与原来不同:不是执行数学运算,而是将两个字符串拼接起来。这导致字符串显示在一起,或使用两个小字符串组合成一个长字符串。
这种行为用拼接(concatenation)来描述,因为它的意思是将两样东西连接起来。
注意:
读者在学习编程技巧时,可能会在其他书中看到 concatenation 这个术语。但是,本书在讲解字符串和字符串结合时,用的是pasting这个术语。
下面的语句使用+运算符来显示一个长字符串:
这里不是将整个字符串放在单独一行(如果这样,以后查看程序时将更难理解),而是使用运算符+将文本文件分成两行。执行这条语句时,输出结果如下:
在该字符串中使用了几个特殊字符:\"、\'、\n 和\t。为更好地熟悉这些字符,请将输出和生成输出的 System.out.println( )语句进行比较。
6.5 将其他变量用于字符串中
虽然可以使用+运算符将两个字符串拼接起来,但更常见的是使用它将字符串和变量拼接起来。请看下面的例子:
这段代码的输出如下:
这个例子说明了将+运算符用于字符串的独特之处:导致不是字符串的变量作为字符串显示出来。length是一个整型变量,其值为121,它显示在字符串“Running time:”和“minutes”之间。System.out.println( )语句用于显示一个字符串加上一个整数再加上一个字符串。这条语句之所以能够正常运行,是因为至少开头的部分是字符串。Java语言通过提供这种功能使信息更容易显示。
读者可能想做的一件事情是,将字符串拼接多次,如下例如示:
这段代码导致变量 searchKeywords被设置为“drama romance New Zealand”。第1行创建变量 searchKeywords 并将其设置为空字符串,因为双引号之间为空。第 2 行将变量 search Keywords设置为其当前值加上字符串drama;接下来的两行用相同的方式再加上ramance和New Zealand。
可以看到,在变量后面拼接文本时,变量名将出现两次。Java提供了一种快捷方式来简化该过程,这就是+=运算符。+=运算符将=和+运算符的功能融为一体。对于字符串,它用于在当前字符串后面加上其他字符串。上述SearchKeywords示例可以使用+=运算符简化为如下所示:
这段代码的效果与前面相同:将 searchKeywords设置为“drama romance New Zealand”。
6.6 字符串的高级处理
还有多种其他方式可用于查看字符串变量和修改其值。之所以有这些高级功能,是因为字符串在Java语言中是对象。通过处理字符串对象获得的知识,也适用于其他对象。
在程序中经常要比较两个字符串是否相等,为此可在带有两个字符串的语句之中使用equals( ),如下所示:
这里使用了两个字符串变量,一个是变量favorite,用于存储Ada最喜欢的乐器名称:钢琴;另一个变量是guess,用于存储对其最喜欢的乐器的猜测,该猜测是Ada最喜欢尤克里里琴。
第 3 行显示文本“Is Ada’s favorite instrument a”、变量 guess 的值和问号。第4 行显示文本“Answer:”以及下面的新内容:
语句中的这部分称为方法,方法是在Java程序中完成任务的一种方式,这里的方法要完成的任务是,比较字符串favorite和字符串guess的值是否相等。如果这两个字符串的值相等,就显示true,否则显示false。下面是该示例的输出结果:
Output ▼
有时确定字符串的长度很有用,为此可使用方法 length( )。该方法的工作原理与 equals( )相似,但只涉及一个字符串变量。请看下面的例子:
该示例将整型变量 nameLength 的值设置为 15,方法 cinematographer.length( )计算字符串变量cinematographter包含的字符数,并将结果赋给整型变量nameLength。
计算机很不灵活,不能识别明显相同的东西。虽然人很容易识别出文本 Harvey keitel 和HARVEY KEITEL是一回事,但大多数计算机不这么认为。例如,在本章前面介绍的equals( )方法将果断地认为 Harvey keitel 不等于 HARVEY KEITEL。
为了克服这些障碍,Java 提供了将字符串变量全部转换为大写的方法(toUpperCase( ))和全部转换为小写的方法(toLowerCase( ))。下面的例子演示了如何使用方法 toUpper Case( ):
这段代码将字符串变量 change 设置为字符串变量 baines 的大写形式,即 HARVEY KEITEL。ToLowerCase( )方法的用法相同,但返回的是字符串的小写。
注意,toUpperCase( )方法不改变调用它时使用的字符串变量的大小写。在上述示例中,变量 baines的值仍为 Harvey keitel。
处理字符串时,另一项常见的任务是,确定在一个字符串中能否找到另一个字符串。要在字符串中查找,可使用方法 indexof( ),并将要查找的字符串放在括号中。如果没有找到指定的字符串,indexof( )返回−1;如果找到,indexof( )返回一个整数,指出该字符串的起始位置。字符串中字符位置从 0 开始编号,即第一个字符的位置为 0。在字符串 The Piano 中,文本Piano的起始位置为4。
警告:
indexof( )方法是区分大小写的,这也就意味着只有当目标字符串和搜索字符串的大小写完全相同时,才算查找成功。否则,indexof( )返回−1。
indexof( )方法的一种用法是,在电影《钢琴》的剧本中,搜索 Ada 盛气凌人的丈夫跟她的女儿 Flora的谈话:“You are greatly shamed and you have shamed those trunks”。
如果《钢琴》的剧本存储在变量script中,可以使用下面的语句从中搜索前面引用的部分:
如果在 script 中找到文本“you have shamed those trunks”,变量position 将等于该文本在script中的起始位置,否则将等于−1。
6.7 导演及演员名单
在电影《钢琴》中,Ada McGrath Stewart 从苏格兰搬到新西兰,来到一片陌生的土地并嫁给了一个不懂得欣赏钢琴的人。对于本章介绍的有些主题,读者可能与她一样有种失落感。
接下来,为了加深读者对前面介绍的字符串处理功能的理解,将编写一个Java程序,显示一部电影的导演和演员名单。你应该能够猜到该电影的名字。
返回NetBeans中的Java24项目,然后创建一个名为Credits的新Java类,在源代码编辑器中输入程序清单6.1中的所有文本,输入完毕之后存盘。
程序清单6.1 Credits程序
编译程序前先浏览一遍程序,看是否能够明白各条语句的功能。对该程序的详细分析如下。
第1行将该Java程序命名为Credits。
第 2 行是 main( ) 块语句的开头,程序的所有功能都是在该块语句中完成的。
第 4~14 行创建用于存储导演和演员以及影片信息的变量。其中一个变量 year,它是一个整型变量,其他变量都是字符串变量。
第 16~21 行是长语句System.out.println( )。在第16行和第21行的括号之间的信息都将显示到屏幕上。换行符\n的作用将其后面的文本在下一行的行首显示。制表符\t的作用是在输出信息中插入制表符。其他要显示的内容要么是文本,要么是字符串变量。
第 22 行结束main( )块语句。
第23行结束整个程序。
如果提示有错误,可以修改程序中的输入错误,然后重新保存。NetBeans将自动编译程序。当运行程序时,将会看到类似于图6.1所示的输出窗口。
图6.1 Credits程序的输出
注意:
如果你对本章提到的电影《钢琴》、电影中的主人公,以及该电影的导演 Jane Campion 感兴趣,可以访问 Magnus Hjelstuen的非官方网站,地址为www.cadenhead.org/piano。
6.8 总结
如果你的Credits程序运行正常,输出结果与图6.1相同,你的信心也应该增加。通过本书前6章的学习,你现在可以编写一个比较长的Java程序,而且也可以处理一些比较复杂的问题了。字符串是你在每次编程时都会用到的东西。
在影片《钢琴》的开头,Ada的丈夫不允许其毛利人劳工将她的钢琴搬回家,她失去了钢琴。你很幸运,你在Java程序中使用字符串的技能不会其他任何人夺走,你可以通过多种方式使用使用字符串来与用户交流。
6.9 问与答
问:如何将字符串变量的值设置为空?
答:一对双引号之间没有任何文本就表示空字符串。下面的代码创建一个名为 adaSays的字符串变量,并将其值设置为空:
问:使用 toUpperCase( )方法好像不能将字符串中的字母全部转换为大写,我哪里操作不正确?
答:调用字符串对象的 toUpperCase( )方法时,实际上它并未修改该字符串对象,而是创建一个字母全部大写的新字符串,请看下面的语句:
这些语句的输出结果为“First Name: Nessie”,因为变量 firstName 包含的是原来的字符串。如果将最后一条语句改为显示变量 changeName,输出结果将为“First Name: NESSIE”。
当字符串在Java中创建之后,它们的值不会发生改变。
问:在 Java 中,所有方法都像 equals( )那样返回true 或 false吗?
答:方法被调用后,可以有不同的方式来进行响应。如果方法像 equals( )那样发回一个值,则被称为返回一个值。方法 equals( )方法返回一个布尔值,其他方法可能返回字符串、整数、其他类型的值,也可能什么都不返回(使用void来表示)。
6.10 测验
回答下列问题,以测试对字符串理解和掌握的程度。
1.我的朋友要执行拼接操作,需要向权威部门报告吗?
a.不,仅在冬季这才是非法的。
b.是的,但要等到我将故事卖给TMZ.com再说。
c.不,他所做的只是在程序中将两个字符串连接起来。
2.为什么String的首字母要大写,而int等类型名的首字母不需要大写?
a.String是一个完整的单词,而int不是。
b.和Java中所有的对象一样,String的首字母必须大写。
c.Oracle的质量控制做得很糟糕。
3.下列那项在字符串中添加一个单引号?
a.<quote>。
b.\’。
c.‘。
1.c.拼接(Concatenation)指的是将两个字符串连接起来,它使用运算符+或+=。
2.b.在Java中,所有的对象类型名的首字母都要大写,因此变量名的首字母都是小写,这样就不容易将变量和对象搞混。
3.b.在字符串中插入特殊字符时,总是以单个反斜杠开头。
6.11 练习
通过下列练习来复习本章介绍的主题:
编写一个名为Favorite的小型Java程序,将本章中“比较两个字符串”一节的代码放在 main( )块语句中。测试该程序,确认其输出就像正文中描述的那样,Ada 最喜欢的乐器不是尤克里里琴。测试完毕后,将变量guess的初始值从ukelele改为piano,再看看如果如何。
修改程序Credits,将导演和全部演员的名字都用大写字母显示。
有关完成这些练习需要编写的Java程序,请访问本书的配套网站www.java24hours.com。