字符串是Java 程序中经常处理的对象,如果字符串运用得不好,将影响到程序运行的效率。在 Java中,字符串作为 Sting 类的实例来处理。以对象的方式处理字符串,将使字符串更加灵活、方便。了解字符串上可用的操作,可以节省程序编写与维护的时间。本章从创建字符串开始向读者讲解字符串本身的特性以及字符串上可用的重要操作等
单个字符可以用char类型保存,多个字符组成的文本就需要保存在String对象中。String通常被称为字符串 ,一个String对象最多可以保存(2^32-1)个字节(占用4GB空间大小)的文本内容
声明字符类:
在Java中,字符串的使用必须在一对双引号之内。
"23.23"、"ABCDE"、"你好"
以上所示这些都是字符串的常量,字符串常量可以是系统能够显示的任何文字信息,甚至可以是单个字符。
可以通过以下语法格式声明字符串变量:
String str;
String:指定该变量为字符串类型。
str:任意有效的标识符,表示字符串变量的名称。
声明字符串变量s,代码如下:
String s;
创建字符串:
1 String(char a[])
使用一个字符数组a创建String对象
char a[]={'g','o','o','d'};
String s=new String(a);
等价于
String s=new String ("good");
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,2,4);
等价于
String s=new String("unde");
3 String(char[]value)
该构造方法可分配一个新的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";
此时 str1 和str2引用的相同的字符串常量 因此具有相同的实体。
对于已经声明的字符串,可以对其惊醒相应的操作,连接字符串就是字符串操作中比较简单的一种以对多个字符串进行连接,也可以字符串与其他数据类型进行连接
连接多个字符串
使用加号“+”运算符可以实现对多个字符串的功能,“+”运算符可以连接多个String对象并产生一个新的String对象。
先连接一副对联的上、下联,再分行输出在控制台上
连接其他数据类型
统计每天的阅读和上机时间
获取字符串长度
使用String类的length()方法可以获取生命的字符串对象的长度。语法如下
str.length()
其中,str为字符串对象。
获取字符串长度,语法如下
String str ="We are students";
int size =str.length();
以上代码是将自负床str的长度赋值给int类型的变量size 此时变量size的值为15,这表示length()方法返回的字符串的长度(包括字符串中的空格)。
字符串查找
字符串查找String类停工了两种查找字符串的方法,一个是indexOf()和lastIndexOf()方法。这两种方法都允许在字符串中搜索指定条件的字符或者字符串。indexOf()方法返回的是搜索的字符或者字符串首次出现的位置lastIndexOf()方法的是搜索的字符或者字符串最后一次出现的位置。
1.indxOf(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");//变量size的值是3
2.iastlndexOf(String str)
该方法用于返回指定字符串最后一次出现的索引位置。当调用 String 类的 lastIndex0f0方法时,会从当前字符串的开始位置检索参数字符串 str,并将最后一次出现 str 的索引位置返回。如果没有检索到字符串 st,该方法返回-1。语法如下:
str.lastlndexOf(substr)
用两种方式判断字符串的长度
获取指定索引位置的字符
使用charAt()可以将指定索引处的字符返回
str.charAt(int index)
str是任意字符串
index:整型值,用于指定要返回字符的下标
查看指定索引位置上的字符
获取子字符串
通过String类的substring()方法对字符进行截取。substring()方法被两种不同的重载形式来满足不同的需要,这形式的共同点就是利于字符串的下标进行截取,且应明确字符串的下标是重0开始的跟数组类似
1.substring(int beginlndex)
该方法返回的是从指定的索引位置开始截取知道字符串结尾的字串
str.substring(int beginlndex)
其中beginlndex指定从某一索引处开始截取字符串 如下代码所示
String str ="Hello World";
String sybste =str.substring(3);
2.substring(int beginIndex,int endIndex)
该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的字串 语法如下
substring(int beginIndex,int endIndex)
beginIndex:开始截取子字符串的索引位置
endIndex:子字符串在整个字符串中的结束位置
《将进酒》的作者是哪位诗人?
去掉空格
trim()方法返回字符串的副本,忽略前导空格和尾部空格
str.trim()
其中str为任何字符串的对象 。
去掉字符串首、尾对象
字符串替换
replace()方法可实现将指定的字符或者字符串替换成新的字符或者字符串 语法如下
str.replace(CharSequence target,CharSequence replacement)
targer:要替换的字符或者字符串
replacement:用于替换原来字符串的内容
将单词中的字母a替换为字母A
判断字符串的开头与结尾
startsWith()方法与endsWith()方法分别是用来判断字符串是否只当的内容开始或者结束,这两个方法的返回值都是为布尔类型
1.startsWith()方法
判断该字符串的前缀是否为参数指定的字符串,语法如下
str.startsWith(String prefix)
其中的,prefix是只作为前缀的字符串
2.endsWith()方法
判断该字符串的后最是否为参数指定的字符串
str.endsWith(String suffix)
判断字符串是否以指定的内容开始或结束
判断字符串是否相等
对字符串对象进行比较不能简单的使用比较运算符“==”,因为比较运算符比较的是两个字符串的是否相同,即使两个字符串内容相同,两个对象的内存地址也是不同的,使用比较运算符任然会返回false。使用比较运算符比较两个字符串代码如下:
String tom=newString("I am a student");
String jerry=new String ("I am a student");
boolean b (tom ==jerry);
此时布尔类型的值为false 此时字符串b是对象 tom,jerry是引用
因此就要使用到本小节的两个关键字 equals()方法和equalsIgnoreCase()方法
1.equals()方法
如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较 是,返回true 否则,返回false语法如下:
str.equals(String otherstr)
其中str,otherstr是要比较的两个字符串对象
2.equalsIgnoreCase()方法
使用equals()方法对字符串进行比较时区分大小写的,而equalsIgnoreCase()方法是在忽略大小所写的情况下比较两个字符串是否相等,返回结果认为boolean型,语法如下
str.equalsIgnoreCase(String otherstr)
判断"abc"和'"ABC"是否相等
按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode的值,按字典顺序将String对象比较是字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此String对位于参数字符串之前则比较结果为一个负数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0,如法如下
str.compareTo(String otherstr)
其中str,otherstr是要比较的两个字符串对象
判断字母b的位置
字符大小写转换
String类的toLowerCase()方法可将字符串中的所有大写字母改写成小写字母,而另一种语句toUpperCase()可以将字符串中的所有小写字母改写成大写字母
1. toLowerCase()方法
该方法将字符串中所有的大写字母转换成小写,如果自负床中没有应该被转换的字符,则将源字符串返回:否则将返回一个新的字符串,将原字符串中每一个小写字母都转换成大写,字符串长度不变 语法如下:
str.toLowerCase();
其中str是要进行转换的字符
2.toUpperCase()该方法将字符串中所有小写的字符转换为大写,如果字符串中没有应该被转化的字符,则将原字符串返回;否则返回一个新字符串,将源字符串中每一个小写字母都转换为大写,字符串长度不变语法如下
str.toUpperCase();
其中str是要进行转换的字串。
字母大小写转换
将字符串分割
使用split()方法可以使字符串按指定的分割字符或者字符串进行分割,并将分割后的结果存放在字符串数组中,split()方法提供了以下两种字符串分割形式、
1.split(String sign)
该方法可以根据给定的分隔符来对字符串进行拆分 语法如下
str.split(String sign);
其中,sign为分割字符串的分隔符,也可以使用正则表达式。
2.split(String sign,int limit);
该方法可根据给定的分割符对字符串进行拆分,并且限制拆分的次数 语法瑞小安
str.split(String sign,int limit);
sign:分割字符串的分隔符,也可以使用正则表达式。
limit:显示的分割次数
按要求分割"192.168.0.1"
String类的静态 format0方法用于创建格式化的字符串。format0方法有两种重载形式
1,format(String format,Object...args)
该方法使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默i的语言环境。语法如下:
str.format(String format,Object...args)
format;格式字符串。
Cargs:格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的,可以为 0。
2.format(Local l,String format,Object...args)
该方法使用指定的语言环境、格式字符串和参数返回一个格式化字符串,格式化后的新字符申使用其指定的语言环境。语法如下:
str.format(Local l,String format,Object...args)
1:格式化过程中要应用的语言环境。如果1为 null,则不进行本地化。
format:格式字符串。
args:格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的,可以为0
日期和时间字符串格式化
在应用程序设计中,经常需要显示日期和时间。如果想输出满意的日期和时间格式,一般需要编写大量的代码、经过各种算法才能实现。format0方法通过给定的特殊转换符作为参数来实现对日期和时间的格式化。
1、日期格式化
先来看一个例子。返回一个月中的天数,代码如下:
Date date new Date();//创建Date对象date
String s = String.format("%te", date);//通过 format()方法对 date 进行格式化
上述代码中变量s的值是当前日期中的天数,如今天是15 号,则s的值为15:%te 是转换符。
常用的日期格式化转换符如图10.1所示。
转换符
转换符 | 说明 | 示例 |
---|---|---|
%te | 一个月中的某一天(1~31) | 2 |
%tb | 指定语言环境的月份简称 | Feb(英文)、二月(中文) |
%tB | 指定语言环境的月份全称 | February(英文)、二月 (中文) |
%tA | 指定语言环境的星期几全称 | Monday (英文)、星期一 (中文) |
%ta | 指定语言环境的星期几简称 | Mon(英文)、星期一(中文) |
%tc | 包括全部日期和时间信息 | 星期二三月25 13:37:22CST 2008 |
%tY | 4位年份 | 2008 |
%tj | 一年中的第几天(001~366) | 085 |
%tm | 月份 | 03 |
%td | 一个月中的第几天 (01~31) | 02 |
%ty | 2 位年份 | 08 |
按照格式输出今天的年、月、日
2.时间格式化
使用 formatO万法不仅可以完成日期的格式化,也可以实现时间的格式化。时间的格式化转换符要比日期的格式化转换符更多、更精确,它可以将时间格式化为时、分、秒、毫秒等。格式化时间的转换符如表 10.2 所示。
表10.2 时间格式化转换符
转换符 | 说明 | 示例 |
---|---|---|
%tH | 2位数字的24时制的小时(00~23) | 14 |
%tI | 2位数字的12时制的小时(01~12) | 05 |
%tk | 2位数字的24时制的小时(00~23) | 5 |
%tl | 2位数字的12时制的小时(1~12) | 10 |
%tM | 2位数字的分钟数(00~59) | 05 |
%tS | 2位数字的秒数(00~60) | 12 |
%tL | 3位数字的毫秒数(000~999) | 920 |
%tN | 9位数字的微秒数(000000000~999999999) | 062000000 |
%tp | 指定语言环境下上午或下午标记 | 下午(中文)、pm(英文) |
%tz | 相对于GMTRFC82格式的数字时区偏移量 | +0800 |
%tZ | 时区缩写形式的字符串 | CST |
%ts | 1970-01-01 00:00:00至现在经过的秒数 | 1206426646 |
%tQ | 1970-01-01 00:00:00至现在经过的毫秒数 | 1206426737453 |
按照格式输出当下的时、分、秒
转换符 | 说明 | 示例 |
%tF | "年-月-日”格式(4位年份)" | 2008-03-25 |
%tD | 月/日/年”格式(2位年份) | 03/25/08 |
%tc | 全部日期和时间信息 | 星期二三月2515:20:00CST2608 |
%tr | "时:分:秒PM(AM)"格式(12时制) | 03:22:06下午 |
%tT | "时:分:秒"格式(24时制) | 15:23:50 |
%tR | "时:分”格式(24时制) | 15:25 |
按照格式输出当下的年、月、日
常规类型格式化
常规类型格式化可应用于任何参数类型,可通过如表10.4所示的转换符来实现。
转换符 | 说明 | 示例 |
%b、%B | 结果被格式化为布尔类型 | true |
%h、%H | 结果被格式化为散列码 | A05A5198 |
%s、%S | 结果被格式化为字符串类型 | "abcd" |
%c、%C | 结果被格式化为字符类型 | 'a' |
%d | 结果被格式化为十进制整数 | 40 |
%o | 结果被格式化为八进制整数 | 11 |
%x、%X | 结果被格式化为十六进制整数 | 4b1 |
%e | 结果被格式化为用计算机科学记数法表示的十进制数 | 1.700000e+01 |
%a | 结果被格式化为带有效位数和指数的十六进制浮点值 | 0XL.C000000000001P4 |
%n | 结果为特定于平台的行分隔符 | |
%% | 结果为字面值“%” | % |
使用转换符获取表达式的结果
使用正则表达式
正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。例如,“wd”表示数字09中的任何一个,“d”就是元字符。正则表达式中的元字符及其意义如表 10.5 所示。
元字符 | 正则表达式中的写法 | 意义 |
. | . | 任意一个字符 |
\d | \\d | 0~9的任何一个数字 |
\D | \\D | 任何一个非数字字符 |
\s | \\s | 空白字符,如'\t'、'\n' |
\S | \\S | 非空白字符 |
\w | \\w | 可用于标识符的字符,但不包括“s” |
\W | \\W | 不可用于标识符的字符 |
\p{Lower} | \\p{Lower} | 小写字母 a~z |
\p{Upper} | \\p{Upper} | 大写字母 A~Z |
\p{AsCll} | \\p{AsCll} | ASCII字符 |
\p{Alpha} | \\p{Alpha} | 字母字符 |
\p{Digit} | \\p{Digit} | 十进制数字,即0~9 |
\p{Alnum} | \\p{Alnum} | 数字或字母字符 |
\p{Punct} | \\p{Punct} | 标点符号:!"#S%&0*+./:>?@[\]^_`{|}~ |
\p{Graph} | \\p{Graph} | 可见字符:[\p{Alnum}\p{Punct}] |
\p{print} | \\p{print} | 可打印字符[\p{Graph}\x20] |
\p{Blank} | \\p{Blank} | 空格或制表符:[\t] |
\p{Cntrl} | \\p{Cntrl} | 控制字符:[\x00-\x1F\x7F] |
效率比拼
1.append()方法
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如 int、boolean、char、String、double 或者另一个字符串生成器等。语法如下:
append(content)
其中,content 表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象。
2. insert(int offset, arg)方法
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入 int、float、char 和 boolean 等基本数据类型的数据或其他对象。语法如下:
insert(int offset arg)
offset: 字符串生成器的位置。该参数必须大于等于 0,且小于等于此序列的长度。
arg: 将插入至字符串生成器的位置。该参数可以是任何数据类型的数据或其他对象。向字符串生成器中指定的位置添加字符,代码如下:
StringBuilder bf=newStringBuilder("hello");//创建字符生成器
bf.insert(5,"world");//添加至字符生成器的位置及内容
System.out.println(bf.toString());//此时输出信息为 helloworld
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