10.1 String 类
单个字符可以用char类型保存,多个字符组成的文本就需要保存在String对象中。String通常被称为字符串,一个String对象最多可以保存(2的32次-1)个字节。
10.1.1 声明字符串
在Java语言中,字符串必须包含在一对双引号(“”)之内。
列如:“你好”
可以通过以下语法格式来声明字符串变量:
String str:
10.1.2 创建字符串
char[] ch= {'g','o','o','d'};
str=new String(ch);
char[] c= {'s','t','u','d','e','n','t'};
String s =new String(c,1,3);
10.2 字符串相连
10.2.1 连接多个字符串
使用“+”运算符可实现连接多个字符串的功能。“+”运算符可以连接多个String对象并产生一个新的String对象
public class Join {
public static void main(String args[]) {
String s1=new String("春风绿千里");
String s2=new String("马蹄香万家");
String s=s1+"\n"+s2;
System.out.println(s);
}
}
10.2.2 连接其他数据类型
字符串也可同其他基本数据类型进行连接。如果将字符串同其他数据类型进行连接,会将其他数据类型的数据直接转换成字符串。
public class Link {
public static void main(String args[]) {
int booktime =4;
float practice=2.5f;
//将字符串与整型、浮点型变量相连
System.out.println("我每天花费"+booktime+"小时看书;"
+practice+"小时上机练习");
}
}
10.3 获取字符串信息
10.3.1 获取字符串长度
使用String类的length()方法可获取声明的字符串对象长度
str.length();
10.3.2 字符串查找
String 类提供了两种查找字符串的方法,即indexOf()与 lastIndexOf()方法。这两种方法都允许在字符串中搜索指定条件的字符或字符串。indexOf()方法返回的是搜索的字符或字符串首次出现的位置lastIndexOf()方法返回的是搜索的字符或字符串最后一次出现的位置
1.indexOf(String s)
该方法用于返回参数字符串s在指定字符串中首次出现的索引位置。当调用 String 类的 indexOf()方法时,会从当前字符串的开始位置搜索s的位置。如果没有检索到字符串s,该方法的返回值是-1
2;lastIndexOf(String str)
该方法用于返回指定字符串最后一次出现的索引位置。当调用String类的 lastIndexOf()方法时,会从当前字符串的开始位置检索参数字符串str,并将最后一次出现str的索引位置返回。如果没有检索到字符串str,该方法返回-1
10.3.3 获取指定索引位置的字符
使用charA()方法可将指定索引处的字符返回
str.charAt(int index)
10.4 字符串操作
10.4.1 获取子字符串
通过Sring类的substring()方法可对字符串进行截取。
substring()方法被两种不同的重载形式,来满足不同的需要。这些形式的共同点就是都利用字符串的下标进行截取,且应明确字符串下标是从0开始的
1. substring(int beginlndex)
该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串
str.substring(int beginIndex)
2. substring(int beginindex, int endindex)
该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串。
substring(int beginlndex, int endlndex)
public class Subs {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="《将进酒》:李白(唐)";
String substr=str.substring(6,8);
System.out.println("《将进酒》的作者是"+substr);
}
}
10.4.2 去除空格
trim()方法返回字符串的副本,忽略前导空格和尾部空格
str.trim
String st=" JAVA CLASS ";
System.out.println(st+"的长度为"+st.length());
String trim=st.trim();
System.out.println(trim+"的长度为"+trim.length());
10.4.3 字符串替换
replace()方法可事先将指定的字符或字符串替换成新的字符或字符串
str.replace(CharSequence target,CharSequence replacement)
String s="address";
String replace=s.replace("a","A");
System.out.println(replace);
10.4.4 判断字符串的开始与结尾
startsWith()方法与endsWith()方法分别用于判断字符串是否以指定的内容开始或结束
1. startsWith()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串
str.startsWith(String prefix)
其中,prefix 是指作为前缀的字符串
2.endsWith()方法
该方法用于判断当前字符串是否为以给定的子字符串结束
str.endsWith(String suffix)
其中,sufifx 是指作为后缀的字符串
//判断字符串的开始
String num1="22045612";
boolean startsWith =num1.startsWith("22");
System.out.println(startsWith);
//判断字符串的结尾
String num2="21304578";
boolean endsWith=num2.endsWith("78");
System.out.println(endsWith);
10.4.5 判断字符串是否相等
对字符串对象进行比较不能简单地使用比较运算符“= =”,因为比较运算符比较的是两个字符串的地址是否相同。即使两
个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符仍然会返回false
String tom = new String("I am a student");
String jerry = new String("I am a student");
boolean b =(tom == jerry);
1. equals()方法
如果两个字符串具有相同的字符和长度,则使用equalsO方法进行比较时,返回true
str.equals(String otherstr)
其中,str、otherstr 是要比较的两个字符串对象
2. equalslgnoreCase()方法
使用equals()方法对字符串进行比较时是区分大小写的,而使用equalsIgnoreCase()方法是在忽略了大小写的情况下比较两个字符串是否相等,返回结果仍为boolean类型
str.equalslgnoreCase(String otherstr)
其中,str、otherstr 是要比较的两个字符串对象。
//判断字符串是否相等
String s1=new String("abc"); //开辟了两个位置(new String),存储位置不同所以false
String s2=new String("abc"); //不使用(new String),可以true
boolean b1=(s1==s2);
System.out.println(b1);
s1.equals(s2); //不在乎地址,判断里面的内容是否相等
boolean b2=s1.equals(s2);
System.out.println(b2);
String s3="ABC";
boolean b3=s1.equalsIgnoreCase(s3); //忽略大小写比较内容
System.out.println(b3);
10.4.6 按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode 值,按字典顺序将String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此String 对象位于参数字符串之前,则比较结果为一个负整数;如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数:如果这两个字符串相等,则结果为0
str.compare To(String otherstr)
//按照Unicode值比较字符串先后顺序
String str1="a";
String str2="b";
String str3="c";
System.out.println(str1.compareTo(str2));
System.out.println(str2.compareTo(str2));
System.out.println(str3.compareTo(str2));
10.4.7 字母大小写转换
String类的toLowerCase()方法可将字符串中的所有大写字母改写为小写字母,而xoUpperCase()方法可将字符串中的所有小写字母改写为大写字母。
1. toLowerCase()方法
该方法将字符串中的所有大写字母转换为小写。如果字符串中没有应该被转换的字符,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个大写字母都转换成小写,字符串长度不变
str.toLowerCase()
其中,str 是要进行转换的字符串。
2.toUpperCase()方法
该方法将字符串中所有的小写字母转换为大写。如果字符串中没有应该被转换的字符,则将原字符串返回;否则返回一个新字符串,将原字符串中每个小写字母都转换成大写,字符串长度不变
str.toUpperCase()
其中,str 是要进行转换的字符串。
//字母大小写转换
String stri="oh My God!";
String lower=stri.toLowerCase();
System.out.println(lower);
String upper=stri.toUpperCase();
System.out.println(upper);
10.4.8 字符串分割
使用split()方法可以使字符串按指定的分割字符或字符串进行分割,并将分割后的结果存放在字符串数组中。split()方法提供了以下两种字符串分割形式
1. split(String sign)
该方法可根据给定的分割符对字符串进行拆分。
str.split(String sign)
2.spilt(String sign,int limit)
该方法可根据】给定的0分割符对字符串进行拆分
str.split(String sign,int limit)
//字符串分割
String strin="192.168.0.1";
String[] split=strin.split("\\."); //按照"."进行分割,使用转义字符"\\."
for(String temp:split) {
System.out.println(temp);
}
String[]split2=strin.split("\\.",2);
for(String temp:split2) {
System.out.println(temp);
10.5 格式化字符串
String类的静态format()方法用于创建格式化的字符串。format)方法有两种重载形式。
format(String format,Object..args)
该方法使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境
str.format(String format,Object..args)
2.
format(Local I,String format,Object...args)
该方法使用指定的语言环境、格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用其指定的语言环境。
str.format(Local I, String format,Object...args)
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.1 日常用的日期格式转换符
2.时间格式化
使用format)方法不仅可以完成日期的格式化,也可以实现时间的格式化。时间的格式化转换符要比日期的格式化转换符更多、更精确,它可以将时间格式化为时、分、秒、毫秒等。格式化时间的转换符。
表10.2 时间格式化转换符
import java.util.Date;
public class Test4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//10.5 格式化字符串
//String 格式化后的字符串 = String.format(格式,字符串);
//日期和时间字符串的格式化
Date date = new Date(); //默认输出当时的时间
System.out.println(date);
//日期
String year = String.format("%ty",date);
String month = String.format("%tm",date);
String day = String.format("%td",date);
System.out.println(year + "年" + month + "月" + day + "日");
}
}
2.时间格式化
使用format)方法不仅可以完成日期的格式化,也可以实现时间的格式化。时间的格式化转换符要比日期的格式化转换符更多、更精确,它可以将时间格式化为时、分、秒、毫秒等。格式化时间的转换符。
import java.util.Date;
public class Test4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//时间
String hour = String.format("%tH",date);
String minute = String.format("%tM",date);
String second = String.format("%tS",date);
System.out.println(hour + "时" + minute + "分" + second + "秒");
}
}
3.格式化常见的日期时间组合
格式化日期与时间组合的转换符定义了各种日期时间组合的格式
表10.3 常见的日期和时间组合的格式
import java.util.Date;
public class Test4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//常用的日期时间格式化
String formatDate = String.format("%tF", date);
String formatTime = String.format("%tT", date);
System.out.println(formatDate + " " + formatTime);
}
}
10.5.2 常规化类型格式化
常规类型格式化可应用于任何参数类型
表10.4 常规转换符
public class Genneral {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = String.format("%d",400/2); //将结果以十进制格式显示
String str2 = String.format("%b",3>5); //将结果以Boolean型显示
String str3 = String.format("%x",200); //将结果以十六进制格式显示
System.out.println("400的一半是: "+str); //输出格式化字符串
System.out.println("3>5正确嘛: "+str2);
System.out.println("200的十六进制数是: "+str3);
}
}
10.6 使用正则表达式
正则表达式通常被用于判断句中,用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。
表10.5 正则表达式中的元字符
id 在正则表达式中,可以使用方括号括起若干个字符来表示一个元字符,该元字符可代表方括号中
的任何一个字符。例如,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次或多次。限定修饰符的用法如表10.6所示。
表10.6 限定修饰符
public class Judge {
public static void main(String[] args) {
// TODO Auto-generated method stub
String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}"; //定义要匹配e-mail地址的正则表达式
String str1 = "aaa@"; //定义要进行验证的字符串
String str2 = "aaaaa";
String str3 = "1111@111ffyu.dfg.com";
if(str1.matches(regex)) { //判断字符串变量是否与正则表达式匹配
System.out.println(str1+"是一个合法的E-mail地址判断格式");
}
if(str2.matches(regex)) {
System.out.println(str2+"是一个合法的E-mail地址判断格式");
}
if(str3.matches(regex)) {
System.out.println(str3+"是一个合法的E-mail地址判断格式");
}
}
}
10.7 字符串生成器
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大地增加系统开销。而JDK新增了可变的字符序列StringBuilder类,大大提高了频繁增加字符串的效率。
public class Jerque {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="";
long starTime=System.currentTimeMillis();
for(int i=0;i<10000;i++) {
str=str+i;
}
long endTime=System.currentTimeMillis();
long time=endTime-starTime;
System.out.println("String 消耗时间:"+time);
StringBuilder builder=new StringBuilder("");
starTime=System.currentTimeMillis();
for(int j=0;j<10000;j++) {
builder.append(j);
}
endTime=System.currentTimeMillis();
time=endTime-starTime;
System.out.println("StringBuilder 消耗时间:"+time);
}
}
1. append()方法 笑的常用方法如下。
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如int、boolean、 char、String、double或者另一个字符串生成器等。
append(content)
其中,content表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象。
2. insert(int offset,arg)方法
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入int、float、char和boolean等基本数据类型的数据或其他对象。
insert(int offset arg)
StringBuilder bf = new StringBuilder("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)
a、 start:将要删除的字符串的起点位置。
b、 end:将要删除的字符串的终点位置
StringBuilder bf = new StringBuilder("StringBuilder");
bf.delete(5,10);
System.out.println(bf.toString());