10.1 String类
单个字符可以用char类型保存,多个字符组成的文本就需要保存在String对象中。String通常被称为字符串,一个String对象最多可以保存(占4GB空间大小)的文本内容
10.1.1 声明字符串
在Java语言中,字符串必须包含在一对双引号(“ ”)之内
可以通过以下语法格式来声明字符串类型
a、String : 指定该变量为字符串变量的名称
b、 str : 任意有效的标识符,表示字符串变量的名称
10.1.2 创建字符串
char a[ ] = {'g','o','o','d'};
String sh = new String(a) 等价于 String sh = new String(“good”) //底层方法实现
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//10.1 String类
//字符串变量的声明
String sy;
// System.out.println(sy); //变量sy未初始化,会报错
//字符串变量的初始化 直接传入内容
sy="hello";
sy = new String("hello"); //调用string类的构造方法
System.out.println(sy); //字符串变量的初始化
//字符串变量的初始化 传入字符类型的数组
char [] ch = {'g','o','o','d'}; //定义字符类型的数组
String st = new String(ch);
System.out.println(st); //输出
//字符串变量的初始化,传入字符类型的数组,两个数字 前索引 取得个数
char[] c = {'s','t','u','d','e','n','t'}; //0 1 2 3 4 5 6 7
String s = new String (c,1,4); //1为前索引,4为取得个数
System.out.println(s);
}
}
10.2 连接字符串
对以声明的字符串,可以对其进行相应的操作,连接字符串就是字符操作中比较简单的一种,以对多个字符进行连接,也可使字符串与其他数据类型进行连接
10.2.1 连接多个字符串
使用"+"运算符可实现连接多个字符串的功能,"+"运算符可以连接多个String对象并产生一个新的String对象
例题10.1
public class Join { //创建类
public static void main(String[] args) { //主方法
// TODO Auto-generated method stub
String s1 = new String("春色绿千里"); //声明String对象s1
String s2 = new String("马蹄香万家"); //声明String对象s2
String s = s1 + "\n" + s2; //将对象s1、”、n“和对象s2连接并将结果赋值给s
System.out.println(s); //将s输出
}
}
10.2.2 连接其他数据类型
字符串也可以同其他基本数据类型进行连接,如果将字符串同其他数据类型进行连接,会将其他数据类型的数据直接转换为字符串
public class Link { //创建类
public static void main(String[] args) { //主方法
// TODO Auto-generated method stub
int booktime = 4; //声明的int型变量booktime
float practice = 2.5f; //声明类的float型变量practice
//将字符串与整型、浮点型变量相连,并将结果输出
System.out.println("我每天花费"+booktime +"小时看书;"+practice + "小时上机练习");
}
}
10.3 获取字符串信息
10.3.1获取字符串长度
使用String类的length()方法可获取声明的字符串对象的长度
str.length();
其中,str为字符串长度,获取代码串长度,
String str = "We are students";
int size = str.length();
空格也算长度
10.3.2 字符串查找
indexOf()方法返回的是搜索的字符或字符串首次出现的位置
str.indexOf(substr)
a、 str:任意字符串对象
b、 substr: 要搜索的字符串
lastIndexOf()方法返回的是搜索的字符或字符串最后一次出现的位置
str.lastIndexOf(substr)
a、 str:任意字符串对象
b、 substr: 要搜索的字符串
例题10.3
public class Test { //创建类
public static void main(String[] args) { //主方法
// TODO Auto-generated method stub
String str = "We are students"; //定义字符串str
int size = str.lastIndexOf(""); //将空字符串在str中的索引位置赋值给变量size
System.out.println("空字符串在字符串str中的索引位置是:"+size); //将变量size输出
System.out.println("字符串str的长度是:"+ str.length()); //将字符串str的长度输出
}
}
10.3.3 获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回
str.charAt(int index)
a、 str:任意字符串对象
b、 index: 整型值,用于指定要返回字符的下标
例题10.4
public class Ref {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "hello world";
char mychar = str.charAt(6); //将字符串str中索引位置是6的字符返回
System.out.println("字符串str中索引位置是6的字符为:" + mychar); //输出信息
}
}
10.4 字符串操作
10.4.1 获取子字符串
1. substreing(int beginlndex)
该方法返回时从指定的索引位置开始截取直到该字符串结尾的子串
str.substring(int beginIndex)
beginIndex指定从某一索引处开始截取字符串
2. substring(int beginIndex,int endIndex)
该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串
substring (int beginIndex, int endIndex)
a、 beginIndex :开始截取字字符串的索引位置
b、 endIndex: 子字符串在整个字符串中的结束位置
例题10.5
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()
例题10.6
public class Black {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = " Java Class ";
System.out.println("字符串原来的的长度为"+str.length());
String trim = str.trim();
System.out.println("去掉空格后的长度为"+str.trim().length());
}
}
10.4.3 字符串替换
replace()方法可以实现将指定的字符或字符串替换成新的字符或字符串
str.replace(charSequence target,CharSequence replacement)
a、 target:要替换的字符或字符串
b、 replacement: 用于替换成原来字符串的内容
replace()方法返回的结果时一个新的字符串,如果字符或字符串oldChar没有出现在该对象表达式中的字符串序列中,则将原字符串返回
public class NewStr {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "address";
String newstr =str.replace("a","A");//把a替换
System.out.println(newstr);//输出
}
}
10.4.4 判断字符串的开始与结尾
startsWith()方法与endsWith()方法分别用于判断字符串是否以指定的内容开始或结束,这两个方法的返回值都为Boolean类型
1.startsWith()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串
str.startsWith(String prefix)
其中,prefix是指作为前缀的字符串
2.endsWith()方法
该方法用于判断当前字符串是否为以给定的子字符串结束
str.endsWith(String suffix)
其中,suffix是指作为后缀的字符串
例题10.8
public class StartOrEnd {
public static void main(String[] args) {
// TODO Auto-generated method stub
String num1="22045612";
boolean b = num1.startsWith("22"); //判断真假
System.out.println("字符串num1是以22开始的吗?"+b);
String num2="21304578";
boolean b2 = num2.endsWith("78");
System.out.println("字符串num2是以78结尾的吗"+b2);
}
}
10.4.5 判断字符串是否相等
1.equals()方法
如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较,返回return,否则,返回false
str.equals(String otherstr)
其中,str、otherstr是要比较的两个字符串对象
2.equalsIgnoreCase()方法
使用equals()方法对字符串进行比较时是区分大小写的,而使用equalsIgnoreCase()方法是在忽略了大小写的情况下比较两个字符串是否相等,返回结果仍为Boolean类型
str.equalsIgnoreCase(String otherstr)
其中,str、otherstr是要比较的两个字符串对象
例题10.9
public class Opinion {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 =new String("abc");
String s2 =new String("ABC");
boolean b =s1.equals(s2);
boolean b2 =s1.equalsIgnoreCase(s2);
System.out.println(s1+"equals"+s2+":"+b);
System.out.println(s1+"equals"+s2+":"+b2);
}
}
10.4.6 按字典顺序比较两个字符串
compareToO方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将String对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0。语法如下:
str.compareTo(String otherstr)
例题10.10
public class Wordbook { //创建类
public static void main(String[] args) { //主方法
// TODO Auto-generated method stub
String str = new String ("b"); //用于比较的3个字符串
String str2 = new String ("a");
String str3 = new String ("c");
System.out.println(str+"compareTo"+str2+":"+str.compareTo(str2)); //将str与str2比较的结果输出
System.out.println(str+"compareTo"+str3+":"+str.compareTo(str3)); //将str与str3比较的结果输出
}
}
10.4.7 字母大小转换
String类的toLowerCase()方法可将字符串中的所有大写字母改写为小写字母,而toUpperCase()方法可以将字符串中的所有小写字母改为大写字母
1. toLowerCase()方法
该方法将字符串中的所有大写字母转换为小写。如果字符串中没有应该被转换的字符,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个大写字母都转换成小写,字符串长度不变。语法如下:
str.toLowerCase()
其中,str是要进行转换的字符串。
2. toUpperCase()方法
该方法将字符串中所有的小写字母转换为大写。如果字符串中没有应该被转换的字符,则将原字符串返回;否则返回一个新字符串,将原字符串中每个小写字母都转换成大写,字符串长度不变。语法如下:
str.toUpperCase()
其中,str是要进行转换的字符串。
例题10.11
public class UpAndLower {
public static void main(String[] args) {
// TODO Auto-generated method
stubString stri = "Oh My God!";
String lower = stri.toLowerCase(); //toLowerCase()将原字符串中的每个大写字母转化为小写,字符串长度不变
System.out.println(lower);
String upper = stri.toUpperCase(); //toUpperCase()将原字符串中的每个小写字母转化为大写,字符串长度不变
System.out.println(upper);
}
}
10.4.8 字符串分割
使用spilt()方法可以使字符串按指定的分割字符或字符串进行分割,并将分割后的结果存放在字符串数组里,spilt()方法提供了以下两种字符串分割形式
1.split(String sign)
该方法可根据给定的分割符对字符串进行拆分
str.split(String sign)
其中,sign为分割字符串的分割符,也可以使用正则表达式
2.split(String sign,int limit)
该方法可根据给定的分割符对字符串进行拆分,并限定拆分的次数
str.split(String sign,int limit)
a、sign: 分割字符串的分割符,也可以使用正则表达式
b、limit: 限制的分割次数
例题10.12
public class Division {
public static void main(String[] args) {
// TODO Auto-generated method
String strin = "192.168.0.1";
String[] split1 = strin.split("\\.");
for(String temp : split1) {
System.out.println(temp);
}
String[] split2 = strin.split("\\.",2);
for(String temp : split2) {
System.out.println(temp);
}
}
}
10.5 格式化字符串
String类的静态format()方法用于创建格式化的字符串。format)方法有两种重载形式。
1.
format(String format,Object..args)
该方法使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境。语法如下:
str.format(String format,Object..args)
a、 format:格式字符串。
b、 args:格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的,可以为0。
2.
format(Local I,String format,Object...args)
该方法使用指定的语言环境、格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用其指定的语言环境。语法如下:
str.format(Local I, String format,Object...args)
1:格式化过程中要应用的语言环境。如果1为null,则不进行本地化。
a、 format:格式字符串。
b、 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.1 日常用的日期格式转换符
2.时间格式化
使用format)方法不仅可以完成日期的格式化,也可以实现时间的格式化。时间的格式化转换符要比日期的格式化转换符更多、更精确,它可以将时间格式化为时、分、秒、毫秒等。格式化时间的转换符。
表10.2 时间格式化转换符
例题10.14
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 常见的日期和时间组合的格式
例题10.15
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.16
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 正则表达式中的元字符
d 在正则表达式中,可以使用方括号括起若干个字符来表示一个元字符,该元字符可代表方括号中
的任何一个字符。例如,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 限定修饰符
例题10.17
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类,大大提高了频繁增加字符串的效率。
例题10.18
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)
a、 offset:字符串生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。
b、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());