- Java从入门到精通(微视频精编版)
- 明日科技
- 5773字
- 2021-03-24 07:55:58
第7章 字符串处理
(视频讲解:1小时47分钟)
字符串是Java程序中经常处理的对象,如果字符串运用得不好,可以影响到程序运行的效率。在Java中字符串作为String类的实例来处理。以对象的方式处理字符串,将使字符串更加灵活、方便。了解字符串上可用的操作,可以节省程序编写与维护的时间。
本堂课从创建字符串开始向读者介绍字符串本身的特性,以及字符串上可用的几个操作等。
学习摘要:
字符串的创建方式
字符串连接的方式
获取字符串信息的方法
字符串的格式化
正则表达式
字符串生成器的用法
7.1 String类
视频讲解
前面的章节中介绍了char类型,它只能表示单个字符,而由多个字符连接而成的称之为字符串。在Java语言中字符串作为对象来处理,可以通过java.lang包中的String类来建字符串对象。
7.1.1 声明字符串
在Java语言中字符串必须包含在一对双引号(" ")之内。字符串是由许多个字符连接而成的。例如:"23.23"、"ABCDE"、"你好"。这些都是字符串常量,字符串常量是系统能够显示的任何文字信息,甚至是单个字符。
注意
在Java中由双引号包围的都是字符串,不能作为其他数据类型来使用,例如"1+2"的输出结果永远也不会是3。
可以通过如下语法格式来声明字符串变量。
语法:String str = [null]
参数:String用于指定该变量为字符串类型。str可以是任意有效的标识符,表示字符串变量的名称。null是可选参数,如果省略null,表示str变量是未初始化的状态,否则表示声明的字符串的值就等于null。例如,声明字符串变量str可以使用如下代码。
String str;
说明
声明的字符串变量在使用前,必须经过初始化才能使用,否则编译器会报出“变量为被初始化错误”。
7.1.2 创建字符串对象
在Java语言中将字符串作为对象来管理,因此可以像创建其他类对象一样来创建字符串对象。创建对象要使用类的构造方法。下面介绍String类的常用构造方法。
用字符数组构建字符串
方法声明:public String(char arr[])
参数说明:字符数组arr包含要创建的字符串的所有字符。例如用一个字符数组a创建String对象使用如下代码。
提取字符数组部分元素创建字符串
方法声明:public String(char arr[], int offset, int length)
参数说明:arr是包含一些字符的数组,参数offset表示开始截取字符串的位置,length表示截取字符串的长度。例如下列代码将提取字符数组a中的一部分创建一个字符串对象。
7.2 连接字符串
视频讲解
对于已声明的字符串,可以对其进行相应的操作。连接字符串就是字符操作中较简单的一种。可以对多个字符串进行连接,也可使字符串与其他数据类型进行连接。
7.2.1 连接多个字符串
使用“+”运算符可完成对多个字符串连接的功能。“+”运算符可以连接多个运算符并产生一个String对象。
【例7.1】 在项目中创建类Join,在主方法中创建String型变量,将字符变量连接的结果输出。(实例位置:资源包\源码\07\7.01)
运行结果如图7.1所示。
图7.1 实例运行结果
技巧
Java中一句相连的字符串不能分开在两行中写。例如:
System.out.println("I like Java")
这种写法是错误的,如果一个字符串太长,为了便于阅读,可以将这个字符串分在两行上书写。此时就可以使用“+”将两个字符串连起来,之后在加号处换行。因此上面的语句可以修改如下。
System.out.println("I like" + "Java");
7.2.2 连接其他数据类型
字符串也可同其他数据类型进行连接。如果将字符串同这些数据类型的数据进行连接,会将这些数据直接转换成字符串。
【例7.2】 在项目中创建类Link,在主方法中创建数值型变量,实现将字符串与整型、浮点型变量相连的结果输出。(实例位置:资源包\源码\07\7.02)
运行结果如图7.2所示。
本实例实现的是将字符串常量与整型变量booktime和浮点型变量practice相连后的结果输出。在这里booktime和practice都不是字符串,当它们与字符串相连时会自动将其转换成字符串形式,然后参与连接。
图7.2 实例运行结果
注意
只要“+”运算符的一个操作数是字符串,编译器就会将另一个操作数转换成字符串形式,所以应谨慎地将其他数据类型与字符串相连。以免输出意想不到的结果。
如果将上例中的输出语句修改如下。
System.out.println("我每天花费"+booktime+"小时看书;"+(practice+booktime)+"小时上机练习");
则实例修改后的运行结果如图7.3所示。
图7.3 实例运行结果
为什么会这样呢?这是由于运算符是有优先级的,圆括号的优先级最高,所以先被执行,然后再将结果与字符串相连。
7.3 获取字符串信息
视频讲解
字符串作为对象,可通过相应方法获取字符串的有效信息,例如获取某字符串的长度、某个索引位置的字符等。本节将向读者介绍几种获取字符串的相关信息的方法。
7.3.1 获取字符串长度
使用String类的length()方法可获取声明的字符串对象的长度。
方法声明:public String length();
例如下面的代码可以获取字符串长度。获取到的字符串str的长度被赋值给int型变量size,此时变量size的值为15,这表示length()方法返回的字符串的长度包括字符串中的空格。
String str = "We are students"; int size = str.length();
7.3.2 字符串查找
String类提供了两种查找字符串的方法,即indexOf()与lastIndexOf()方法。这两种方法都允许在字符串中搜索指定条件的字符或字符串。indexOf()方法返回的是搜索的字符或字符串首次出现的位置,lastIndexOf()方法返回的是搜索的字符或字符串最后一次出现的位置。
indexOf(String s)
该方法用于返回参数字符串s在指定字符串中首次出现的索引位置。当调用字符串的indexOf()方法时,会从当前字符串的开始位置搜索s的位置;如果没有检索到字符串s,该方法返回值是−1。
语法声明:public int indexOf(String substr)
参数说明:substr是要搜索的子字符串。例如查找字符a在字符串str中的索引位置可以使用如下代码:
String str = "We are students"; int size = str.indexOf("a"); // 变量size的值是3
理解字符串的索引位置,要对字符串的下标有所了解。在计算机中String对象是用数组表示的。字符串的下标是0至length()−1。例如上述代码中字符串str的下标如图7.4所示。
图7.4 字符串str下标
lastIndexOf(String str)
该方法用于返回指定字符串最后一次出现的索引位置。当调用字符串的lastIndexOf()方法时,会从当前字符串的开始位置检索参数字符串str,并将最后一次出现str的索引位置返回。如果没有检索到字符串str,该方法返回−1。
方法声明:public int lastIndexOf(String substr)
参数说明:substr是要搜索的子字符串。
说明
如果lastIndexOf()方法中的参数是空字符串""(注意没有空格),则返回的结果与调用该字符串length()方法的返回结果相同。下面的程序就可说明这个问题。
【例7.3】 在项目中创建类Text,在主方法中创建String对象,使用lastIndexOf()方法查看字符串str中空字符串的位置,然后输出字符串的长度,看它们是否相同。(实例位置:资源包\源码\07\7.03)
运行结果如图7.5所示。
图7.5 实例运行结果
7.3.3 获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回。
方法声明:public char charAt(int index)
参数说明:index用于指定要返回字符的下标。
【例7.4】 在项目中创建类Ref,在主方法中创建String对象,使用charAt()方法查看字符串str中索引位置是6的字符。(实例位置:资源包\源码\07\7.04)
运行结果如图7.6所示。
图7.6 实例运行结果
7.4 格式化字符串
视频讲解
String类的静态format()方法用于创建格式化的字符串。该方法使用指定的格式字符串和参数返回一个经过格式化的字符串,格式化后的新字符串使用本地默认的语言环境。本节将介绍字符串格式化的使用方法。
方法声明:public static String format(String format, Object…args)
参数说明:format是格式字符串,args是格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的,可以只提供一个参数。
7.4.1 日期和时间字符串格式化
在应用程序设计中,经常需要显示时间和日期。如果想输出满意的日期时间格式,一般需要编写大量的代码经过各种算法才能实现。format()方法通过给定的特殊转换符作为参数来实现对日期和时间的格式化。
1.日期格式化
如果使用字符串的format()方法格式化日期和时间,可以得到日期字符串的完整格式或者部分字段,例如获取单独的年、月或日信息。下面的代码将返回一个月中某一天。
上述代码中变量str的值是当前日期中的日字段,例如今天是15号,则str的值为15;“%te”是转换符。常用的日期格式化转换符如表7.1所示。
表7.1 常用的日期格式化转换符
【例7.5】 在项目中创建类Eval,实现将当前日期信息以4位年份、月份全称、2位日期形式输出。(实例位置:资源包\源码\07\7.05)
运行结果如图7.7所示。
图7.7 实例运行结果
2.时间格式化
使用format()方法不但可以完成日期的格式化,也可以实现时间的格式化。时间格式化转换符要比日期转换符更多、更精确,它可以将时间格式化为时、分、秒、毫秒。格式化时间的转换符如表7.2所示。
表7.2 时间格式化转换符
【例7.6】 在项目中创建类GetDate,实现将当前时间信息以2位小时、2位分钟数、2位秒数形式输出。(实例位置:资源包\源码\07\7.06)
运行结果如图7.8所示。
图7.8 实例运行结果
3.格式化常见的日期时间组合
格式化日期与时间的转换符定义了各种日期时间组合的格式,其中最常用的日期和时间的组合格式如表7.3所示。
表7.3 常用的日期和时间组合的格式
【例7.7】 在项目中创建类DateAndTime,在主方法中实现将当前日期时间的全部信息以及指定格式的日期输出。(实例位置:资源包\源码\07\7.07)
运行结果如图7.9所示。
图7.9 实例运行结果
7.4.2 常规类型格式化
常规类型的格式化可应用于任何参数类型,可通过如表7.4所示的转换符来实现。
表7.4 常规转换符
【例7.8】 在项目中创建类General,在主方法中实现不同数据类型到字符串的转换。(实例位置:资源包\源码\07\7.08)
运行结果如图7.10所示。
图7.10 实例运行结果
7.5 字符串生成器
视频讲解
对于创建成功的字符串对象,它的长度是固定的,内容不能被改变。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行连接以获取符合条件新字符串,将极大地增加系统开销。而Java6新增了可变的字符串序列StringBuilder类,它大大提高了频繁增加与修改字符串的效率。通过下面简单的测试就可以知道差距。
【例7.9】 在项目中创建类Jerque,在主方法中编写如下代码,验证字符串操作和字符串生成器操作的效率。(实例位置:资源包\源码\07\7.09)
运行结果如图7.11所示。
图7.11 实例运行结果
通过上面实例可以看出执行的时间差距很大。如果在程序中频繁地附加字符串,建议使用StringBuilder。新创建的StringBuilder对象初始容量是16个字符,可以自行指定初始长度。如果附加的字符超过可容纳的长度,则StringBuilder对象将自动增加长度以容纳被附加的字符。若要使用StringBuilder最后输出字符串结果,可使用toString()方法。利用StringBuilder类中的方法可动态地执行添加、删除和插入等字符串的编辑操作,该类的常用方法如下。
append()方法
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如int、boolean、char、String、double或者另一个字符串生成器等。
方法声明:public StringBuilder append(int content)
参数说明:content表示要追加到字符串生成器中的内容。可以是任何类型的数据或者其他对象。因为它有多种重载方法,每个方法接收不同数据类型的参数。
insert(int offset, arg)方法
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入int、float、char和boolean等基本数据类型或其他对象。
方法声明:public StringBuilder insert(int offset, str)
参数说明:offset:字符串生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。str是将插入至字符串生成器的数据。该数据可以是任何的数据类型或其他对象。例如下面的代码可以向字符串生成器中指定的位置添加字符。
delete(int start, int end)方法
移除此序列的子字符串中的字符。该子字符串从指定的start处开始,一直到索引end -1处的字符,如果不存在这种字符,则一直到序列尾部。如果start等于end,则不发生任何更改。
方法声明:public StringBuilder delete(int start, int end)
参数说明:start是将要删除的字符串的起点位置。end是将要删除的字符串的终点位置。例如删除指定位置的子字符串可以使用如下代码。
说明
想要了解更多的StringBuilder类方法,可查询java.lang.StringBuilder的API说明。
7.6 使用正则表达式
视频讲解
正则表达式通常被用于判断语句中,来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。例如,“\\d”表示数字0~9中任何一个,“\\d”就是元字符。正则表达式中元字符及其意义如表7.5所示。
表7.5 正则表达式中的元字符
说明
在正则表达式中“.”代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符“.”,必须使用转义字符“\”。
在正则表达式中可以使用方括号括起来若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。例如reg = "[abc]4",这样字符串"a4"、"b4"、"c4"都是和正则表达式匹配的字符串。方括号元字符还可以为其他格式。例如:
[^456]:代表4、5、6之外的任何字符。
[a-r]:代表a~r的任何一个。
[a-zA-Z]:可表示任意一个英文字母。
[a-e[g-z]]:代表a~e,或g~z中的任何一个字母(并运算)。
[a-o&&[def]]:代表字母d、e、f(交运算)。
[a-d&&[^bc]]:代表字母a、d(差运算)。
在正则表达式中允许使用限定修饰符来限定元字符出现的次数。例如“A*”,代表A可在字符串中出现0次或多次。修饰限定符的用法如表7.6所示。
表7.6 限定符
【例7.10】 在项目中创建类Judge,在主方法中实现使用正则表达式来判断指定的变量是否是合法的E-mail地址。(实例位置:资源包\源码\07\7.10)
实例运行结果如图7.12所示。
图7.12 实例运行结果
正则表达式分析:
通常情况下E_mail的格式为:“X@X.com.cn”。字符X表示任意的一个或多个字符,@为E-mail地址中的特有符号,符号@后还有一个或多个字符,之后是字符“.com”,也可能后面还有类似“.cn”的标记。总结E-mail地址的这些特点,因此可以书写正则表达式“\\w+@\\w+(\\.\\w+)*\\.\\w+”来匹配E-mail地址。字符集“\\w”匹配任意字符,符号“+”表示字符可以出现1次或多次,表达式“(\\.\\w+)*”,表示形如“.com”格式的字符串可以出现0次或多次。而最后的表达式“\\.\\w+”用于匹配E-mail地址中的结尾字符,如“.com”。
7.7 实战
视频讲解
7.7.1 获取子字符串
在项目中创建类Subs,在主方法中创建String对象,实现使用substring()方法对字符串进行截取,并将截取后形成的新串输出,运行结果如图7.13所示。(实例位置:资源包\源码\07\实战\01)
图7.13 实例运行结果
7.7.2 字符串替换
在项目中创建类NewStr,在主方法中创建String型变量,将字符变量中的小写字母j替换成大写字母J,并在控制台输出结果,运行结果如图7.14所示。(实例位置:资源包\源码\07\实战\02)
7.7.3 判断字符串的开始与结尾
在项目中创建类StartOrEnd,在主方法中创建String型变量,并判断变量的开始和结尾的字符串,运行结果如图7.15所示。(实例位置:资源包\源码\07\实战\03)
图7.14 实例运行结果
图7.15 实例运行结果
7.7.4 字符串分割
在项目中创建类Division,在主方法中创建String型变量,并将字符变量进行分割,将分割后的结果输出,运行结果如图7.16所示。(实例位置:资源包\源码\07\实战\04)
7.7.5 格式化当前日期
日期字符串的格式因语言环境的不同而不同,国际化的程序必须考虑程序在不同语言环境中的应用。所以提供一个格式化类就非常必要,Java的java.text包中提供了DateFormat类,本实例通过该类实现了几个不同语言环境的日期格式输出,实例运行结果如图7.17所示。(实例位置:资源包\源码\07\实战\05)
图7.16 实例运行结果
图7.17 实例运行结果