1、第5章 字符串操作,字符串是程序编写中经常用到的一种操作。Java提供了两种字符串操作:String类和StringBuffer类,对字符串的操作是通过定义好的一系列方法实现的。本节重点讲解字符串的操作和格式化字符串。,5.1 字符串,字符串是由单个或多个字符组成的。本小节首先介绍Java提供的字符串类,介绍分三个部分,分别是字符串分类、如何声明和创建字符串,通过本节的学习,使读者对字符串有直观的认识。,5.1.1 字符串分类,Java提供了两种字符串类,即String类和StringBuffer类。它们都提供了相应的方法实现字符串地操作。但二者略有不同,下面详细介绍。 String类:该类一
2、旦产生一个字符串,其对象就不可变。String的内容和长度是固定的。如果程序需要获得字符串的信息需要调用系统提供的各种字符串操作方法实现。虽然通过各种系统方法可以对字符串施加操作,但这并不改变对象实例本身,而是生成了一个新的实例。系统为String类对象分配内存,是按照对象包含实际字符数分配。 StringBuffer类:该类从名字就可以看出具有缓冲功能。StringBuffer类处理可变字符串。如果要修改一个StringBuffer类的字符串,不需要再创建新的字符串对象,而是直接操作原来的字符串。该类的各种字符串操作方法中与String类提供的方法不相同。 系统为StringBuffer类对
3、象分配内存时,除去当前字符所占空间外,还提供另外16个字 符大小的缓冲区。注意使用StringBuffer类对象时,使用length()方法获得实际包含字符 串的长度,capacity()方法返回当前数据容量和缓冲区的容量之和。,5.1.2 声明字符串,字符串的声明格式有两种常量声明方式和对象声明方式。 常量声明方式用双引号括住一个字符串,如“hello”。 String stringhello = “hello”; 对象声明方式,其格式如下。 字符串类 字符串名= new字符串类(参数),下面是: String stringhello = new String(“hello”);,5.1.3
4、 创建字符串,在声明了字符串后,就需要创建字符串实例,使字符串操作有实际的对象。因为字符串分为String类和StringBuffer类,所以这里分开介绍字符串的创建方式。 (1)String类字符串的创建。 (2)StringBuffer类字符串的创建。,5.2 字符串操作,本节介绍字符串的各种操作,因为字符串分为两类String类和StringBuffer类,所以这里介绍的方法如果二者一致就以String类介绍,如果二者不同则分别举例介绍,在用代码举例时,为节省篇幅不再给出完整的代码程序,只要读者明白函数的使用方法,灵活地选择使用位置就可以了。,5.2.1 字符串连接,字符串连接实现两个或
5、多个字符串连接为一个字符串,同时生成一个新串。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
6、.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函
7、数实现字符串的连接 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类对象时是生成一
8、个新的字符串,而操作StringBuffer类的对象时,不用生成新的字符串而是在原串的基础上实现操作。二者都提供了获得字符串长度的函数length()获得当前对象中的字符数量,但StringBuffer类还提供了Capacity()函数说明字符容量,因为有缓冲区,所以容量大小肯定大于当前对象中的字符数量。 1 String s = new String(“hello”); /创建一个字符串,内容为”hello”,字符串名为s1 2 StringBuffer sf = new StringBuffer(“world”); /创建一个StringBuffer类 3 System.out.print
9、ln(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 coun
10、t) 该参数方式拷贝部分字符数组的内容为一个新字符串。 String copyValueOf(char ) 该参数方式拷贝整个字符数组为一个新的字符串。下面代码实现字符串s1的拷贝。 1 String s1 = new String(“hello”); /创建一个字符串,内容为”hello”,字符串名为s1 2 char s_chars = new chars1.length(); 3 /代码4、5、6把字符串转化成一个字符数组,也可以用String类的toCharArray()方法代替。 4 for(int i=0 ;is_chars.lenght();i+) 5 s_charsi = s1
11、.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(
12、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); /
13、获得从第三个字符到最后一个字符的子串,结果是”llo”,5.2.6 获取指定位置的字符,在字符串操作中获取指定位置的字符提供了字符操作的灵活性,通过该操作可以直接获取字符串中一个特定位置的字符,前提是首先知道字符串的长度值,在长度范围内获得一个指定的字符。 String charAt(int index) 该参数方式获得字符串中指定位置的字符(char类型),参数index是int型数据类型,用以指定字符位置。下面代码获得字符串s1中指定位置的字符。 1 String s1 = new String(“hello”); /创建一个字符串,内容为”hello”,字符串名为s1 2 Char re
14、sultchar = 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
15、()方法 该方法把大写字符串转换成小写字符串。如下代码。 1 String s1 = new String(“HELLO”); /创建一个字符串,内容为”hello”,字符串名为s1 2 String lowers1 = s1.toLowerCase(); /把字符串s1的字符转换成大写。,5.2.8 分割字符串,分割字符串指按照指定的划界表达式把字符串分割成几部分,每部分是一个字符串,方法返回值是字符串数组(String)。 split(String); 该参数指定划界表达式,通过该表达式来分割字符串。如字符串联“hello:moto”,如果划界表达式是 “:”,则分割结果是“hello”,
16、 “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), replaceFi
17、rst(String,String)。 replace(char,char) 该方法把字符串中与方法中第一个参数字符相同的字符统一替换为方法中第二个字符。 replaceAll(String,String) 该方法把字符串中与方法中第一个参数字符串相同的字符串统一替换为方法中第二个字符串。 replaceFirst(String,String) 该方法把字符串中与方法中第一个参数字符串相同的第一个字符串替换为方法中第二个字符串。,5.3 格式化字符串,本节学习字符串的创建和连接方式,字符串的各种操作,如比较字符串、查找字符、替换字符串、分割字符串等。另外介绍了字符串的一些高级处理技术,如格式化
18、字符串,也需要读者认真掌握,熟练应用。,5.3.1 一般类型格式化,一般类型格式化创建格式化的字符串,同时连接多个字符串对象。Java提供两种一般的格式化方法。 public static String format(Local l,String format,Object args) 该方法使用指定的语言环境(l本地语言环境,也可以通过Locale.setDefault(Locale newlocale)方法设置语言环境),字符串格式和一系列参数生成一个格式化的新字符串。参数说明: locale:指定的语言环境,Java虚拟机可以依本机环境在启动期间设置默认的本地环境。 format:字符串
19、格式。 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(“yyy
20、y年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文档。,