第 5章 字符串操作
字符串是程序编写中经常用到的一种操作。 Java
提供了两种字符串操作,String类和
StringBuffer类,对字符串的操作是通过定义好的一系列方法实现的。本节重点讲解字符串的操作和格式化字符串。
5.1 字符串
字符串是由单个或多个字符组成的。本小节首先介绍 Java提供的字符串类,介绍分三个部分,分别是字符串分类、如何声明和创建字符串,通过本节的学习,使读者对字符串有直观的认识。
5.1.1 字符串分类
Java提供了两种字符串类,即 String类和 StringBuffer类。它们都提供了相应的方法实现字符串地操作。但二者略有不同,下面详细介绍。
String类:该类一旦产生一个字符串,其对象就不可变。 String的内容和长度是固定的。如果程序需要获得字符串的信息需要调用系统提供的各种字符串操作方法实现。虽然通过各种系统方法可以对字符串施加操作,但这并不改变对象实例本身,而是生成了一个新的实例。系统为 String类对象分配内存,是按照对象包含实际字符数分配。
StringBuffer类:该类从名字就可以看出具有缓冲功能。 StringBuffer类处理可变字符串。如果要修改一个 StringBuffer类的字符串,不需要再创建新的字符串对象,而是直接操作原来的字符串。该类的各种字符串操作方法中与 String类提供的方法不相同。
系统为 StringBuffer类对象分配内存时,除去当前字符所占空间外,还提供另外 16个字
符大小的缓冲区。注意使用 StringBuffer类对象时,使用 length()方法获得实际包含字符
串的长度,capacity()方法返回当前数据容量和缓冲区的容量之和。
5.1.2 声明字符串
字符串的声明格式有两种常量声明方式和对象声明方式。
常量声明方式用双引号括住一个字符串,如
,hello” 。
String stringhello =,hello” ;
对象声明方式,其格式如下。
字符串类 字符串名 = new字符串类 (参数 ),下面是:
String stringhello = new String(“hello”);
5.1.3 创建字符串
在声明了字符串后,就需要创建字符串实例,使字符串操作有实际的对象。因为字符串分为
String类和 StringBuffer类,所以这里分开介绍字符串的创建方式。
( 1) String类字符串的创建 。
( 2) StringBuffer类字符串的创建 。
5.2 字符串操作
本节介绍字符串的各种操作,因为字符串分为两类 String类和 StringBuffer类,所以这里介绍的方法如果二者一致就以 String类介绍,如果二者不同则分别举例介绍,在用代码举例时,为节省篇幅不再给出完整的代码程序,只要读者明白函数的使用方法,灵活地选择使用位置就可以了。
5.2.1 字符串连接
字符串连接实现两个或多个字符串连接为一个字符串,同时生成一个新串。 Java调用 String类的 concat()函数实现字符串连接,该函数的参数是一个 String对象,返回值是
String(连接后的新字符串)。
1 String s1 = new String(“hello”); //创建一个字符串,内容为” hello”,字符串名为 s1
2 String s2 = new String(“world”); //创建一个字符串,内容为” world”,字符串名为 s2
3 String s3
//声明一个字符串 s3但没初始化
4 s3 = s1.concat(s2); //调用 String类的 concat函数实现字符串的连接
5.2.2 比较字符串
比较字符串实现两个字符串内容是否相同的比较结果,如果相同则返回 true,如果不同则返回 false。 Java调用 String类的
equals()函数实现,该函数的参数是一个 String对象,返回值是 boolean值(比较后的结果)。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String s2 = new String(,world” ); //创建一个字符串,内容为,world”,字符串名为 s2
3 String s3 = s1.concat(s2); //调用
String类的 concat函数实现字符串的连接
4 String s4 =,helloworld” ; //创建一个字符串,内容为,helloworld”,字符串名为 s4
5 System.out.println(s1.equals(s2));//输入比较结果,
结果为 false
6 System.out.println(s3.equals(s4)); //输入比较结果,
结果为 true
5.2.3 获取字符串长度
在字符串创建后,往往需要获得字符串的长度值,String类对象的字符串的长度值是固定的,一旦字符串对象创建后长度就不再变化,而
StringBuffer类有缓冲空间,默认是 16个字符的长度,在操作 String
类对象时是生成一个新的字符串,而操作 StringBuffer类的对象时,
不用生成新的字符串而是在原串的基础上实现操作。二者都提供了获得字符串长度的函数 length()获得当前对象中的字符数量,但
StringBuffer类还提供了 Capacity()函数说明字符容量,因为有缓冲区,所以容量大小肯定大于当前对象中的字符数量。
1 String s = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 StringBuffer sf = new StringBuffer(,world” ); //创建一个 StringBuffer类
3 System.out.println(s.length()); //输出 String
类对象的长度,结果为 5
4 System.out.println(sf.length()); //输出
StrinBuffer类对象的长度,结果为 5
5 System.out.println(s.capacity()); //输出 StrinBuffer类对象的容量,结果为 5+16 = 21
5.2.4 复制字符串
字符串的复制实现字符串的部分复制和全部复制,Java提供了 copyValueOf()方法实现字符串的拷贝,但该方法只提供两种参数,返回值都是 String。
String copyValueOf(char[ ],int offset,int count)
该参数方式拷贝部分字符数组的内容为一个新字符串 。
String copyValueOf(char[ ])
该参数方式拷贝整个字符数组为一个新的字符串 。 下面代码实现字符串 s1的 拷贝 。
1 String s1 = new String(“hello”) ; //创建一个字符串,内容为,hello”,字符串名为 s1
2 char[] s_chars = new char[s1.length()];
3 //代码 4,5,6把字符串转化成一个字符数组,也可以用 String类的
toCharArray()方法代替 。
4 for(int i=0 ;i<s_chars.lenght();i++){
5 s_chars[i] = s1.charAt(i);
6 }
7 // 拷贝整个字符数组为一个新数组,完成字符串 s1的拷贝,s2内容是,hello” 。
8 String s2 = String.copyValueOf(s_chars);
9 //拷贝整个字符数组的部分为一个新数组,完成字符串 s1的部分拷贝,参数 0
表示起始位 //置,而参数 3表示从开始位置起共有几个需要拷贝的字符 。 s3的内容是,hel”
10 String s3 = String.copyValueOf(s_chars,0,3);
5.2.5 获得子串
获得子串实现获得字符串中部分字符串,该方法只提供两种参数,返回值都是 String。
String substring(int start,int end )
该参数方式获得从 start 到 end(不包含 end位置)的字符串。
String substring(int count)
该参数方式获得字符串中从 count(包含 count位置 )开始到字符串结束的子串。下面代码获得字符串 s1的子串。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String subs1 = s1.substring(0,2); //获得从第一个字符到第二个字符的子串,结果是” he”
3 String subs2 = s1.substring(2); //获得从第三个字符到最后一个字符的子串,结果是” llo”
5.2.6 获取指定位置的字符
在字符串操作中获取指定位置的字符提供了字符操作的灵活性,通过该操作可以直接获取字符串中一个特定位置的字符,前提是首先知道字符串的长度值,在长度范围内获得一个指定的字符。
String charAt(int index)
该参数方式获得字符串中指定位置的字符 (char类型 ),参数 index是 int型数据类型,用以指定字符位置。下面代码获得字符串 s1中指定位置的字符。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 Char resultchar = s1.charAt(0); //获得字符串 s1中第一个位置的字符。
5.2.7 更改大小写
Java提供了更改字符串中字符大小写的方法,如把大写字母,A” 转换成小写字母,a”,把小写字符串,hello”
转换成大写字符串,HELLO” 。
toUpperCase()方法
该方法把小写字符串转换成大写字符串。如下代码。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String uppers1 = s1.toUpperCase(); //把字符串
s1的字符转换成大写。
toLowerCase()方法
该方法把大写字符串转换成小写字符串。如下代码。
1 String s1 = new String(,HELLO” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String lowers1 = s1.toLowerCase(); //把字符串
s1的字符转换成大写。
5.2.8 分割字符串
分割字符串指按照指定的划界表达式把字符串分割成几部分,每部分是一个字符串,方法返回值是字符串数组
( String[])。
split(String);
该参数指定划界表达式,通过该表达式来分割字符串。如字符串联,hello:moto”,如果划界表达式是,,”,则分割结果是 {“hello”,“moto”},如果划界表达式是
,o”,则分割结果是 {“hell”,“:m”,“t” } 下面代码对字符串 s1进行分割。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String[] splitresult = s1.split(“l”); //划界表达式是” l” ;分割结果是 {“he”,”,,”o”} 。
5.2.9 更改字符串中的部分字符
Java提供了更改字符串中字符的方法,即替换方法,它有三种方法如下:
replace(char,char),replaceAll(String,String),
replaceFirst(String,String)。
replace(char,char)
该方法把字符串中与方法中第一个参数字符相同的字符统一替换为方法中第二个字符。
replaceAll(String,String)
该方法把字符串中与方法中第一个参数字符串相同的字符串统一替换为方法中第二个字符串。
replaceFirst(String,String)
该方法把字符串中与方法中第一个参数字符串相同的第一个字符串替换为方法中第二个字符串。
5.3 格式化字符串
本节学习字符串的创建和连接方式,字符串的各种操作,如比较字符串、查找字符、替换字符串、
分割字符串等。另外介绍了字符串的一些高级处理技术,如格式化字符串,也需要读者认真掌握,
熟练应用。
5.3.1 一般类型格式化
一般类型格式化创建格式化的字符串,同时连接多个字符串对象。 Java提供两种一般的格式化方法。
public static String format(Local l,String
format,Object args)
该方法使用指定的语言环境( l本地语言环境,也可以通过
Locale.setDefault(Locale newlocale)方法设置语言环境),字符串格式和一系列参数生成一个格式化的新字符串。参数说明:
locale:指定的语言环境,Java虚拟机可以依本机环境在启动期间设置默认的本地环境。
format:字符串格式。
args,字符串格式中由格式说明符引用的参数,该参数可以没有。
public static String format(String format,Object
args)
5.3.2 日期和时间类型格式
日期格式化实现日期格式的显示方式,如何日期可以是 2008-5-21,也可以是 2008年 5月 21日,或
2008/05/21。在格式化日期时,需要事先导入
java.text.*包,该包中包含格式化日期的类函数。
下面代码日期格式化。
1 import java.text.*;
2 SimpleDateFormat formatter = new
SimpleDateFormat(“yyyy 年 MM月 dd日” );
3 java.util.Date date = new
java.util.Date();
4 String sdate = formatter.format(d);
5.4 本章习题
( 1)学完本章中,读者需要回答:
1.理解 Java对字符串的定义。
2.知道如何声明和创建字符串。
3.分割字符串,onewordonedream”,划界标志分别是‘ o’
和‘ n’ 。
4.将试题 3中的第一个‘ o’ 改变为大写,并输入修改后的字符串。
5.创建两个个字符串,实现的操作是连接这两个字符串、获取连接后的字符串长度、比较这两个字符串。如数组长度为
length,获取位置 length-1的字符。
( 2)注意事项:
1.字符串的操作是本节的重点,需要熟练掌握并加以实践。
2.格式化字符属于字符串操作的高级主题,这里只是简单的介绍了一般类型格式化的方法和日期时间类型格式化的具体操作,如需要更具体 的信息在了解本节知识的基础上可以参考 Java
API文档。
字符串是程序编写中经常用到的一种操作。 Java
提供了两种字符串操作,String类和
StringBuffer类,对字符串的操作是通过定义好的一系列方法实现的。本节重点讲解字符串的操作和格式化字符串。
5.1 字符串
字符串是由单个或多个字符组成的。本小节首先介绍 Java提供的字符串类,介绍分三个部分,分别是字符串分类、如何声明和创建字符串,通过本节的学习,使读者对字符串有直观的认识。
5.1.1 字符串分类
Java提供了两种字符串类,即 String类和 StringBuffer类。它们都提供了相应的方法实现字符串地操作。但二者略有不同,下面详细介绍。
String类:该类一旦产生一个字符串,其对象就不可变。 String的内容和长度是固定的。如果程序需要获得字符串的信息需要调用系统提供的各种字符串操作方法实现。虽然通过各种系统方法可以对字符串施加操作,但这并不改变对象实例本身,而是生成了一个新的实例。系统为 String类对象分配内存,是按照对象包含实际字符数分配。
StringBuffer类:该类从名字就可以看出具有缓冲功能。 StringBuffer类处理可变字符串。如果要修改一个 StringBuffer类的字符串,不需要再创建新的字符串对象,而是直接操作原来的字符串。该类的各种字符串操作方法中与 String类提供的方法不相同。
系统为 StringBuffer类对象分配内存时,除去当前字符所占空间外,还提供另外 16个字
符大小的缓冲区。注意使用 StringBuffer类对象时,使用 length()方法获得实际包含字符
串的长度,capacity()方法返回当前数据容量和缓冲区的容量之和。
5.1.2 声明字符串
字符串的声明格式有两种常量声明方式和对象声明方式。
常量声明方式用双引号括住一个字符串,如
,hello” 。
String stringhello =,hello” ;
对象声明方式,其格式如下。
字符串类 字符串名 = new字符串类 (参数 ),下面是:
String stringhello = new String(“hello”);
5.1.3 创建字符串
在声明了字符串后,就需要创建字符串实例,使字符串操作有实际的对象。因为字符串分为
String类和 StringBuffer类,所以这里分开介绍字符串的创建方式。
( 1) String类字符串的创建 。
( 2) StringBuffer类字符串的创建 。
5.2 字符串操作
本节介绍字符串的各种操作,因为字符串分为两类 String类和 StringBuffer类,所以这里介绍的方法如果二者一致就以 String类介绍,如果二者不同则分别举例介绍,在用代码举例时,为节省篇幅不再给出完整的代码程序,只要读者明白函数的使用方法,灵活地选择使用位置就可以了。
5.2.1 字符串连接
字符串连接实现两个或多个字符串连接为一个字符串,同时生成一个新串。 Java调用 String类的 concat()函数实现字符串连接,该函数的参数是一个 String对象,返回值是
String(连接后的新字符串)。
1 String s1 = new String(“hello”); //创建一个字符串,内容为” hello”,字符串名为 s1
2 String s2 = new String(“world”); //创建一个字符串,内容为” world”,字符串名为 s2
3 String s3
//声明一个字符串 s3但没初始化
4 s3 = s1.concat(s2); //调用 String类的 concat函数实现字符串的连接
5.2.2 比较字符串
比较字符串实现两个字符串内容是否相同的比较结果,如果相同则返回 true,如果不同则返回 false。 Java调用 String类的
equals()函数实现,该函数的参数是一个 String对象,返回值是 boolean值(比较后的结果)。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String s2 = new String(,world” ); //创建一个字符串,内容为,world”,字符串名为 s2
3 String s3 = s1.concat(s2); //调用
String类的 concat函数实现字符串的连接
4 String s4 =,helloworld” ; //创建一个字符串,内容为,helloworld”,字符串名为 s4
5 System.out.println(s1.equals(s2));//输入比较结果,
结果为 false
6 System.out.println(s3.equals(s4)); //输入比较结果,
结果为 true
5.2.3 获取字符串长度
在字符串创建后,往往需要获得字符串的长度值,String类对象的字符串的长度值是固定的,一旦字符串对象创建后长度就不再变化,而
StringBuffer类有缓冲空间,默认是 16个字符的长度,在操作 String
类对象时是生成一个新的字符串,而操作 StringBuffer类的对象时,
不用生成新的字符串而是在原串的基础上实现操作。二者都提供了获得字符串长度的函数 length()获得当前对象中的字符数量,但
StringBuffer类还提供了 Capacity()函数说明字符容量,因为有缓冲区,所以容量大小肯定大于当前对象中的字符数量。
1 String s = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 StringBuffer sf = new StringBuffer(,world” ); //创建一个 StringBuffer类
3 System.out.println(s.length()); //输出 String
类对象的长度,结果为 5
4 System.out.println(sf.length()); //输出
StrinBuffer类对象的长度,结果为 5
5 System.out.println(s.capacity()); //输出 StrinBuffer类对象的容量,结果为 5+16 = 21
5.2.4 复制字符串
字符串的复制实现字符串的部分复制和全部复制,Java提供了 copyValueOf()方法实现字符串的拷贝,但该方法只提供两种参数,返回值都是 String。
String copyValueOf(char[ ],int offset,int count)
该参数方式拷贝部分字符数组的内容为一个新字符串 。
String copyValueOf(char[ ])
该参数方式拷贝整个字符数组为一个新的字符串 。 下面代码实现字符串 s1的 拷贝 。
1 String s1 = new String(“hello”) ; //创建一个字符串,内容为,hello”,字符串名为 s1
2 char[] s_chars = new char[s1.length()];
3 //代码 4,5,6把字符串转化成一个字符数组,也可以用 String类的
toCharArray()方法代替 。
4 for(int i=0 ;i<s_chars.lenght();i++){
5 s_chars[i] = s1.charAt(i);
6 }
7 // 拷贝整个字符数组为一个新数组,完成字符串 s1的拷贝,s2内容是,hello” 。
8 String s2 = String.copyValueOf(s_chars);
9 //拷贝整个字符数组的部分为一个新数组,完成字符串 s1的部分拷贝,参数 0
表示起始位 //置,而参数 3表示从开始位置起共有几个需要拷贝的字符 。 s3的内容是,hel”
10 String s3 = String.copyValueOf(s_chars,0,3);
5.2.5 获得子串
获得子串实现获得字符串中部分字符串,该方法只提供两种参数,返回值都是 String。
String substring(int start,int end )
该参数方式获得从 start 到 end(不包含 end位置)的字符串。
String substring(int count)
该参数方式获得字符串中从 count(包含 count位置 )开始到字符串结束的子串。下面代码获得字符串 s1的子串。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String subs1 = s1.substring(0,2); //获得从第一个字符到第二个字符的子串,结果是” he”
3 String subs2 = s1.substring(2); //获得从第三个字符到最后一个字符的子串,结果是” llo”
5.2.6 获取指定位置的字符
在字符串操作中获取指定位置的字符提供了字符操作的灵活性,通过该操作可以直接获取字符串中一个特定位置的字符,前提是首先知道字符串的长度值,在长度范围内获得一个指定的字符。
String charAt(int index)
该参数方式获得字符串中指定位置的字符 (char类型 ),参数 index是 int型数据类型,用以指定字符位置。下面代码获得字符串 s1中指定位置的字符。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 Char resultchar = s1.charAt(0); //获得字符串 s1中第一个位置的字符。
5.2.7 更改大小写
Java提供了更改字符串中字符大小写的方法,如把大写字母,A” 转换成小写字母,a”,把小写字符串,hello”
转换成大写字符串,HELLO” 。
toUpperCase()方法
该方法把小写字符串转换成大写字符串。如下代码。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String uppers1 = s1.toUpperCase(); //把字符串
s1的字符转换成大写。
toLowerCase()方法
该方法把大写字符串转换成小写字符串。如下代码。
1 String s1 = new String(,HELLO” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String lowers1 = s1.toLowerCase(); //把字符串
s1的字符转换成大写。
5.2.8 分割字符串
分割字符串指按照指定的划界表达式把字符串分割成几部分,每部分是一个字符串,方法返回值是字符串数组
( String[])。
split(String);
该参数指定划界表达式,通过该表达式来分割字符串。如字符串联,hello:moto”,如果划界表达式是,,”,则分割结果是 {“hello”,“moto”},如果划界表达式是
,o”,则分割结果是 {“hell”,“:m”,“t” } 下面代码对字符串 s1进行分割。
1 String s1 = new String(,hello” ); //创建一个字符串,内容为,hello”,字符串名为 s1
2 String[] splitresult = s1.split(“l”); //划界表达式是” l” ;分割结果是 {“he”,”,,”o”} 。
5.2.9 更改字符串中的部分字符
Java提供了更改字符串中字符的方法,即替换方法,它有三种方法如下:
replace(char,char),replaceAll(String,String),
replaceFirst(String,String)。
replace(char,char)
该方法把字符串中与方法中第一个参数字符相同的字符统一替换为方法中第二个字符。
replaceAll(String,String)
该方法把字符串中与方法中第一个参数字符串相同的字符串统一替换为方法中第二个字符串。
replaceFirst(String,String)
该方法把字符串中与方法中第一个参数字符串相同的第一个字符串替换为方法中第二个字符串。
5.3 格式化字符串
本节学习字符串的创建和连接方式,字符串的各种操作,如比较字符串、查找字符、替换字符串、
分割字符串等。另外介绍了字符串的一些高级处理技术,如格式化字符串,也需要读者认真掌握,
熟练应用。
5.3.1 一般类型格式化
一般类型格式化创建格式化的字符串,同时连接多个字符串对象。 Java提供两种一般的格式化方法。
public static String format(Local l,String
format,Object args)
该方法使用指定的语言环境( l本地语言环境,也可以通过
Locale.setDefault(Locale newlocale)方法设置语言环境),字符串格式和一系列参数生成一个格式化的新字符串。参数说明:
locale:指定的语言环境,Java虚拟机可以依本机环境在启动期间设置默认的本地环境。
format:字符串格式。
args,字符串格式中由格式说明符引用的参数,该参数可以没有。
public static String format(String format,Object
args)
5.3.2 日期和时间类型格式
日期格式化实现日期格式的显示方式,如何日期可以是 2008-5-21,也可以是 2008年 5月 21日,或
2008/05/21。在格式化日期时,需要事先导入
java.text.*包,该包中包含格式化日期的类函数。
下面代码日期格式化。
1 import java.text.*;
2 SimpleDateFormat formatter = new
SimpleDateFormat(“yyyy 年 MM月 dd日” );
3 java.util.Date date = new
java.util.Date();
4 String sdate = formatter.format(d);
5.4 本章习题
( 1)学完本章中,读者需要回答:
1.理解 Java对字符串的定义。
2.知道如何声明和创建字符串。
3.分割字符串,onewordonedream”,划界标志分别是‘ o’
和‘ n’ 。
4.将试题 3中的第一个‘ o’ 改变为大写,并输入修改后的字符串。
5.创建两个个字符串,实现的操作是连接这两个字符串、获取连接后的字符串长度、比较这两个字符串。如数组长度为
length,获取位置 length-1的字符。
( 2)注意事项:
1.字符串的操作是本节的重点,需要熟练掌握并加以实践。
2.格式化字符属于字符串操作的高级主题,这里只是简单的介绍了一般类型格式化的方法和日期时间类型格式化的具体操作,如需要更具体 的信息在了解本节知识的基础上可以参考 Java
API文档。