字符串是java程序中经常处理的对象,如果字符串运用的不好,将会影响到程度运行的效率。
在Java中,字符串作为String类的实例来处理。以对象的方式处理字符串,将使字符串更加灵活,方便。
了解字符串上可用的操作,可以节省程序编写以维护的时间。
10.1
String类
单个字符串可以用char类型保存,多个字符串组成的文本就需要保存在String对象中。String通常被称为字符串,一个String对象最多保存(4GB空间大小)的文本内容。
10.1.1声明字符串
在Java语言中,字符串必须包含在一对双引号("")之内。例如:
"23.23","ABCDE","你好"
以上这些都是字符串常量,字符串常量可以是系统能够显示的任何文字信息,甚至可以是单个字符。
误区:在Java中由双引号("")包围的都是字符串,不能作为其他数据类型使用,如"1+2"的输出结果不可能是3.
可以通过以下语法格式来声明字符串变量:
String str;
<String:指定该变量为字符串类型。
<str:任意有效的标识符,表示字符串变量的名称。
声明字符串变量s,代码如下:
String s;
说明声明的字符串变量必须经过初始化才能使用,否则编译器会报出“变量未被初始化错误”。
代码如下:
运行结果如下:
从整个代码来看,运行结果显示报错误了
10.1.2创建字符串
在Java语言中,将字符串作为对象来处理,因此可以像创建其他类对象一样来创建字符串对象。创建对象要使用类的构造方法。String类的常用构造方法如下:
1.String(char a[])
该方法用一个字符串数组a创建String对象,代码如下:
char a[] ={'g','o','o','d'}; }等价于 String s =new String("good")
String s =new String(a);
2.String(char a[],int offset,int length)
该方法提取字符串数组a中的一部分创建于一个字符串对象。参数offset表示开始截取字符串的位置,length表示截取字符串的长度。代码如下:
char a[] ={'s','t','u','d','e','n','t'};
String s = new String(a); }等价于 String s =new String("good")
3.String (char a[],int offset,int length)
该构造方法可分配一个新的String对象,使其表示字符串组参数中所有元素链接的结果。代码如下:
char a[] ={'s','t','u','d','e','n','t'};
String s =new String(a); }等价于 String s =new String("student");
除通过以上几种使用String类的构造方法来创建字符串变量外,还可以通过将字符串常量的引用赋值给一个字符串变量来创建字符串。代码如下:
String str1,str2;
str1="We are students"
str2= "We are students"
代码:
运行结果:
10.2连接字符串
10.2.1连接多个字符串
使用“+”运算符可实现连接多个字符串的功能。“+”运算符可以连接多个String对象并产生一个新的String对象。
例题【10.1】
代码如下:
运行结果如下:
将对象输出s1,"n\"和对象s2连接并将结果赋值给s,将s输出。案例实现的是将字符串常量与整型变量booktime和浮点型变量practice相连后的结果输出。在这里booktime和practice都不是字符串,当它们与字符串相连时会自动调用tostring()方法并转换成字符串形式,然后参与字符串连接。
字符串也可同其他数据类型进行连接。如果将字符串同其他数据类型进行连接,会将其他数据类型的数据直接转换成字符串。
例题【10.2】代码如下:
运行结果如下:
从实例来看实现的是将字符串常量与整型变量booktime和浮点型变量practiece相连后的结果输出。在这里booktime和practice都不是字符串,当它们与字符串相连时会自动调用toString()方法并转换成字符串形式,然后参与字符串连接。
误区:只要“+”运算符的一个操作数是字符串,编译器会将另一个操作数转换成字符串形式,所以应该谨慎地将其他数据类型的数据与字符串相连,以免出现允许不到的结果。
10.3获取字符串信息
字符串作为对象,可通过相应方法获取字符串的有效信息,如获取某段字符串的长度,某个索引位置的字符串等。
10.3.1获取字符串长度
使用String类的length()方法可获取声明的字符串对象的长度。语法如下:
str.length();
其中,str为字符串对象。
获取字符串长度,代码如下:
String str ="We are students";
int size = str.length();
上段代码是将字符串str的长度赋值给int型变量size,此时变量size的值为15,这表示length()方法返回的字符串的长度(包括字符串中的空格)。
10.3.2字符串查找
String类提供了两种查找字符串的方法,即indexOf()与lastIndexOf方法。这种方法都允许在字符串中搜索指定条件的字符或字符串。inIdexOf()方法返回的是搜索的字符或字符串首次出现的位置,lastIdexOf()方法返回的搜索的字符串或字符串最后一次出现的位置。
1.indexOf(String s)
该方法用于返回参数字符串s在指定字符串中首次出现的索引位置。当调用String类的indexOf()方法时,会从当前字符串的开始位置搜索s的位置。如果没有检索到字符串s,该方法的返回值是-1,语法如下:
str.indexOf(substr)
<str:任意字符对象。
<substr:要搜索的字符串。
查找字符串a在字符串str中的索引位置,代码如下:
String str ="We are students";
int size =str.IndexOf("a"); //变量sized的值是3
理解字符串的索引位置,要对字符串的下标有所了解。在Java语言中,String对象是用于数组表示的。字符串的下标是0~length()-1 。因此,字符串"We are students"的下标。
2.lastIndexOf(String str)
该方法用于返回指定字符串最后一次出现的索引位置。当调用String类的lastIndexOf()方法时,会从当前字符串的开始位置检索参数字符串str,并将最后一次出现str的索引位置返回。如果没有检索到字符串str,该方法返回-1。语法如下:
str.lastIndexOf(suber)
<str:任意字符串对象。
<substr:要搜索的字符串。
说明
如果lastIndexOf()方法中的参数是空字符串“”(注意没有空格),则返回的结果与调用length()方法的返回结果相同。
例题【10.3】代码如下:
代码如下:
从整个实例来说,将空符串在str中的索引位置赋值给变量size,将变量size输出,字符串str的长度输出。
10.3.3获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回。语法如下:
str.charAt(int index)
<str:任意字符串。
<index:整型值,用于指定要返回字符的下标。
【10.4】代码如下:
运行结果如下:
从将字符串str中索引位置为6的字符串信息,将字符串str索引位置字符串为6;输出信息。
10.4字符串操作
String类中包含了很多方法,允许程序员对字符串进行操作来满足编程中的需要。
10.4.1获取字符串
通过String类的substring方法()可对字符串进行截取。substring()方法被两种不同的重载形式,来满足不同的需要。这些形式的共同点就是利用字符串的下标进行截取,且应明确字符串下标是从0开始的。
1.substring(int beginIndex)
该方法返回的是指定的索引位置开始截取直到截取到该字符串结尾的字串。语法如下:
str.substring(int beginindex)
其中,beginstring(int beginIndex)指定从一某处索引处开始截取字符串。
截取字符串,代码如下:
String str = "Hello World"; //定义字符串str
String substr = str.substring(3); //获取字符串,此时substr值为lo World
使用substring(beginIndex)截取字符串。
误区:在字符串中,空格占用一个索引位置。
2.substring(int beginIndex,int endIndex)
该方法返回的是字符串某一个索引位置开始截取至某一索引位置结束的字串。语法如下:
substring (Int beginIndex, int endIndex)
<beginIndex:开始截取子字符串的索引位置。
<endIndex:子字符串 在整个字符串中的结束位置。
【10.5】例题代码:
运行结果:
从输出的截取的字符串,进行截取。
10.4.2去除空格
time()方法返回字符串的副本,忽略前导空格和尾部空格。语法如下:
str.time()
其中,str为任意字符串对象。
【10.6】例题代码如下:
运行结果:
定义字符串str,将str原来的长度输出。
10.4.3字符串的替换
replace()方法可实现将指定的字符或字符替换成字符串,语法如下:
str.replace(CharSequence target,CharSequence replacement)
<target:要替换的字符或字符串。
<replacement:用于替换原来字符字符串的内容。
replace()方法返回的结果是一个新的字符串。如果字符或者字符串oldChar没有出现在该对象表达式中的字符串序列中,则将原字符串返回。
【10.7】例题代码:
运行结果如下:
说明如果要替换的字符oldChar在字符串oldChar在字符串中重复出现多次,replace()方法会将所有oldChar全部替换或newChar.例如:
String str ="java project";
String newstr = str.replace("j","J");
此时,newstr的值为Java proJect。
需要注意的是,要替换的字符oldChar的大小写要与原字符串中字符的大小写保持一致,否则不能成功的替换。例如,上面的实例如果写成如下语句,则不能成功替换:
String str ="java project";
String str =str.replace("P","t");
10.4.4判断字符串的开始与结尾
startsWith()方法与endWith()方法分别用于判断字符串是否以指定的内容开始或者结束。
这两个方法的返回值都为boolean类型。
1.startsWith()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。语法如下:
str.startsWith(String prefix)
其中,prefix是指作为前缀的字符串。
2.endWith()方法
该方法用于判断当前字符串是否为以给定的子字符结束。语法如下:
str.endWith(String suffix)
其中,suffix是指作为后缀的字符串。
【10.8】例题代码如下:
运行结果如下:
判断字符串num1是否以‘22’开始,判断字符串num2是否以‘78’结束。
10.4.5判断字符串是否相等
对字符串对象进行比较不能简单的使用比较运算符“==”,因为比较运算符比较的是两个字符串的地址是否相同。即使两个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符任然会返回false。使用比较运算符比较两个字符串,代码如下:
String tom = new String(I am a student");
String jerry = new String(I am a student");
boolean b = (tom == jerry);
此时,布尔型变量b的值为false,因为字符串是对象,tom,jerry是引用。
因此,要比较两个字符串内容是否相等,应使用equals()方法和equalsIgnoreCase()方法。
1.equals()方法
如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。否则,返回false.语法如下:
str.equals(String otherstr)
其中,str,otherstr是要比较的两个字符串对象。
【10.9】例题代码如下:
运行结果如下:
使用equals方法比较s1,s2输出信息。
10.4.6按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将String对象表示的字符串序列与参数字符串所表示的字符串进行比较。如果按字典顺序此String对象于参数字符串之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0.语法如下:
str.compareTo(Stering otherstr)
其中,str,otherstr是要比较的两个字符串对象。
说明compareTo()方法只有在equals(Object)方法返回ture时才返回0。
【10.10】例题代码如下:
运行结果如下:
10.14.7字母大小写转换
String 类的toLowerCase()方法可将字符串中的所有大小写字母改写字母,而toUpperCase()方法可将字符串的所有大小写字母改下字母大写字母。
1.toLowerCase()方法
该方法将字符串中的所有大写字母转换为小写字母。如果字符串中没有应该被转换的字母,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个大写字母都转换成小写,字符串长度不变,语法如下:
str.toLowerCase()
2.toUpperCase()方法
该方法将字符串所有的小写字母转换大写。如果字符串中没有被转换的字符,则将原字符串返回;否则返回一个新字符串,将原字符串中每个小写字符串都转换成大写,字符串长度不变。语法如下:
str.toUpperCase()
其中,str是要进行转换的字符串。
说明使用toLowerCase()方法和toUpperCase()方法进行大小写转换时,数字或其他非英文字母类字符不受影响。
例题【10.11】代码如下:
运行结果:
10.4.8字符串分割
使用split()方法可以使字符串按指定的分割字符串或字符串进行分割,并将分割后的结果存放在字符串数组中。split()方法提供了以下两种字符串分割形式。
1.split(String sign)
该方法可根据给定的分割对字符串进行拆分。语法如下:
str.split(String sign)
其中,sign为分割字符串的分割符,也可以使用正式表达式。
说明没有统一的字符串分割的符号,如果想定义多个分割符,可使用符号”|"。例如,",|="表示分割符分别为“,”和“=”。
2.split(String sign,int Iimit)
该方法可根据给定的分割符对字符进行拆分,并限定拆分的,并限定拆分的次数。语法如下:
str.split(String sign,int Iimit)
<sign:分割字符串的分割符对字符串进行拆分,并限定拆分的次数。
<limit:限制的分割次数。
【10.12】例题代码:
运行结果如下:
输出全部的分割的结果,输出分割两次的结果。
10.5格式化字符串
String 类的静态format()方法用于创建格式化的字符串。format()方法有两种重裁形式。
1.format(String format ,Object....args)
该方法使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境,语法如下:
str.fomat(String fomat,Object....args)
<format:格式字符串
<args:格式字符串中由格式说明符引用的参数。如果还要格式的说明符以外的字符串的参数,则忽略这些额外的参数。此参数的数目是可变的,可以为0.
2. format(Local, l String format,Object ....args)
该方法使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境,语法如下:
format(Local, l String format,Object ....args)
<1.格式化过程中要应用的语言环境。如果1为null,则不进行本地化。
<format:格式字符串。
<args:格式字符串中由格式说明符引用的参数。如果还要格式的说明符以外的字符串的参数,则忽略这些额外的参数。此参数的数目是可变的,可以为0.
10.5.1日期和时间字符串格式化
在应用程序设计中,经常需要显示日期和时间。如果想输出满意的日期和时间的格式,一般需要编译写大量的代码,经过各种算法才能实现。format()方法通过给定的特殊转换符换做参数实现对日期时间的格式化。
1.日期格式化
先看一个例子,返回一个月的天数,代码如下:
Date date = new Date(); //创建Date 对象date
String s = String.format("%te,date); //通过format()方法对date进行格式化。
上述代码中变量,s的值是变量当前日期的天数,如今今天是15号,则s 的值为15:%te是转换符。
【10.13】例题代码如下:
运行结果如下:
2.时间格式化
使用format()方法不仅可以完成日期的格式化,也可以实现时间的格式化。时间的格式化为转换符要比较日期的格式转换符更多,更准确,它可以将时间格式化为时,分,秒,毫秒等。格式化时间的转换符。
【10.14】例题代码如下:
运行结果如下:
date进行格式化。
3.格式化常见的日期时间组合
格式化日期与时间组合的转换符定义了各种日期时间组合的格式,其中最常用的。
【10.15】例题代码如下:
运行结果:
将格式化后的日期时间输出。
10.5.2常规类型格式化
常规类型格式化可用应用于任何参数类型,可通过如表。
【10.16】代码如下:
运行结果如下:
输出格式化字符串。
10.6使用正则表达式
正则表达式通常被用于判断语句中,用来检查某一个字符串是否满足一个格式。正则表达式是含有一些具有特殊意义字符串的字符串,这些特殊字符串被称正则表达式的元字符。例如\d表示数字0~9的任何一个,“\d”就是元字符。正则表达式中的元字符及其意义。
说明在正则表达式中,“."代表任何一个字符,因此在正则表达式中如果使用普通使用着普通意义的点字符”.',必须使用转义字符“\".
在正则表达式中,可以使用方法方括号起若干给字符来表示一元字符,该元字符可代表括号中的任何一个字符,例如,reg="[abc],这样字符串a4,b4,c4都是和正则表达式匹配的字符串。方括号元字符可以转其他格式。如:
<[456]:代表4,5,6之外的任何字符。
<[a,r]:代表a~r中的任何一个字母。
<[a-zA-Z]:代表a~e或者g~z中的任何一个字母。
<[a~o&&[def]:代表字母a,e,f(交运算符)。
<[a~d&&[bc]:代表字母a,d差运算。
在正则表达式中允许使用限定元符出现的次数。例如"A*"代表A可在字符串中出现0次或者多次。限定修饰符的用法。
【10.17】
代码如下:
运行结果:
利用StringBuilder类中的方法可动态的执行添加、删除和插入等字符串的编辑操作。该类的常用方法如下:
10.7字符串生成器
【10.18】例题代码如下:
运行结果:
通过这一实例可以看出,两种操作执行的时间差距很大,如果在程序中频繁的附加字符串,建议使用StringBuilder类。新创建的StringBuilder对象初始容量是16个字符,可以自行指定初始长度。如果附加的字符串超过可容纳的长度,则SptringBuilder对象将自动增加长度以容纳被附加的字符。若要使用SptringBuilder类最后输出字符串结果,可使用toString()方法。利用SptringBuilder类的方法可动态的执行添加,删除和插入等字符串的编辑操作。该方法的常用方法如下。
1.append()方法
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据。语法:append(content) content表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象。
2.insert(int offset,arg)方法
该方法用于向字符串生成器中的指定位置插入数据内容。语法:insert(int offset arg) offset为字符串生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。 arg为将插入至字符串生成器的位置。该参数可以是任何数据类型的数据或其他对象。向字符串生成器中指定的位置添加字符
,代码:StringBulider bf=new StringBuilder(\"hello\");
//创建字符生成器bf.insert(5,\"world\");//添加至字符生成器的位置及内容System.out.println(bf.toString());//此时输出信息为helloword\n
3.delete(int start,int end)方法
移除此序列的子字符串中的字符。该字符串从指定的start处开始,一直到索引end-1处的字符。如果不存在这种字符,则一直到序列尾部,如果start等于end,则不发生任何更改。
语法:delete(int start,int end) start为将要删除的字符串的起点位置。 end为将要删除的字符串的终点位置。
删除指定位置的子字符串,
代码:StringBuilder bf=new StringBuilder(\"StringBuilder);//创建字符串生成器bf.delete(5,10);//删除的子字符串System.out.println(bf.toString());//此时输出的信息为Strinder
offset: 字符串生成器的位置。该参数必须大于等于 0,且小于等于此序列的长度。arg: 将插入至字符串生成器的位置。该参数可以是任何数据类型的数据或其他对象。向字符串生成器中指定的位置添加字符,代码如下:
StringBuilder bf = new StringBuilder(\"hello\");//创建字符生成器bf.insert(5, \"world\");//添加至字符生成器的位置及内容System.out.printin(bf.toString());//此时输出信息为 helloworld
delete(int start , int end) start;将要删除的字符串的起点位置。
end:将要删除的字符的终点位置。
删除指定位置的子字符串,代码如下:StringBuilder bf = new StringBuilder(\"StringBuilder\");//创建字符串生成器bf.delete(5.10);
//删除的子字符串System.out.println(bf.toString());//此时输出的信息为 Strinder。