10.1 String类
知识点:单个字符可以用char类型保存,多个字符组成的文本就需要保存在String对象中。String通常被称为字符串,一个String对象最多可以保存(2的32次方减1)个字节(占用4GB空间大小)的文本内容。
10.1.1声明字符串
字符串必须包含在一对双引号(“”)之内。例如:
"23.23"、"ABCDE"、"你好"
String str;
String: 指定该变量为字符串变量类型;
str:任意有效的标识符,表示字符串变量的名称。
声明字符串变量s,代码如下:10.1.2 创建字符串10.1.2 创建字符串
String s;
10.1.2 创建字符串
1. String(char a[])
2. String(char a[],int offset,int length)
3. String(char[] value)
代码:
package tenbao;
public class Test {
public static void main(String[] args) {
//字符串变量的声明
String s;
//字符串变量初始化
// s = "你好";
s = new String("你好");
System.out.println(s);
//字符串变量初始化 传入字符类型数组
char[] ch = {'g','o','o','d'};
String st = new String(ch);
System.out.println(ch);
//字符串变量的初始化 传入字符串类型数组,初始索引号,个数
char[] chr = {'s','t','u','d','e','n','t'};
String str = new String(chr,2,4);
System.out.println(str);
//字符串相连接
System.out.println(s + st);
//字符串与其他相连接
System.out.println(1.6 + str + 3);
}
}
运行结果:
10.2 连接字符串
10.2.1 连接多个字符串
使用 “+” 运算符可实现连接多个字符串的功能。
例题10.1
代码:
package Join;
public class join {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = new String("春色绿千里");
String s2 = new String("马蹄香万家");
String s = s1 + "\n" + s2;
System.out.println(s);
}
}
10.2.2 连接其他数据类型
例题10.2
代码:
package Link;
public class Link {
public static void main(String[] args) {
// TODO Auto-generated method stub
int booktime = 4;
float practice = 2.5f;
//将字符串与整数类型、浮点类型相连、并将结果输出
System.out.println("我每天花费" + booktime + "小时看书:" + practice + "小时上机练习");
}
}
10.3 获取字符串信息
10.3.1 获取字符串长度
使用String类的length()方法可获取声明字符串对象的长度。
获取字符串长度,
代码:
String str = "We are student";
int size = str.length();
10.3.2 字符串查找
1.indexOf(String s)
该方法用于返回参数字符串 s 在指定字符串中首次出现的位置。如果没有检索到字符串 s ,该方法返回 -1
查找字符 a 在字符串 str 中的索引位置,
代码:
String str = "We are student";
int size = str.indexOf('a');
2.lostindexOf(String str)
该方法用于返回参数字符串 s 在指定字符串中最后一次出现的位置。如果没有检索到字符串 s ,该方法返回 -1
说明:
如果 lostindexOf()方法中的参数是空字符串 "" (注意没有空格),则返回的结果与调用 length()
方法的返回值相同。
l例题10.3
代码:
package Text;
public class Test {
public static void main(String[] args) {
String str = "We are student";
int size = str.lastIndexOf("");
System.out.println("空字符串在字符串 str 中的索引位置是:" + size);
System.out.println("字符串 str 的长度为" + str.length());
}
运行结果:
10.3.3 获取指定索引位置的字符
使用 charAt(int index)方法可指定索引处的字符返回。语句如下:
str.charAt(int index)
例题10.4:
代码:
package Ref;
public class Ref {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "hello world";
char mychar = str.charAt(6);
System.out.println("字符串 str 中索引位置是 6 的字符为:" + mychar);
}
}
运行结果:
10.4 字符串操作
10.4.1 获取子字符串
1. substring(int beginIndex)
该方法返回的是从指定的索引位置开始截取直到该字符串结尾的字串。语法如下:
str.substring(int beginIndex)
2. substring(int beginIndex,int endIndex)
该方法返回的是从字符串某一索引位置开始到某一位置结尾的字串。语法如下:
str.substring(int beginIndex,int engIndex)
例题10.5:
代码:
package tenbao;
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 Blak {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = " java class ";
System.out.println("字符串原来的长度:" + str.length());
//将 str 去掉前导和尾部的空格后的长度输出
System.out.println("字符串现在的长度:" + str.trim().length());
}
}
运行结果:
10.4.3 字符串替换
replace()方法可实现将指定的字符或字符串替换成新的字符或字符串。语法如下:
str.replace(CharSequence target,CharSequence replacment)
例题10.7:
public class NewStr {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "address";
String newstr = str.replace("a","A");
System.out.println(newstr);
}
}
运行结果:
10.4.4 判断字符串的开始与结尾
1.startsWith() 方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。语法如下:
startsWith(String prefix)
2.endsWith() 方法
该方法用于判断当前字符串是否以给予的字符串结尾。语法如下:
例题10.8:
public class StartOrEnd {
public static void main(String[] args) {
//判断字符串开头
String num1 = "22045612";
boolean b1 = num1.startsWith("22");
System.out.println(b1);
//判断字符串结尾
String num2 = "21304578";
boolean b2 = num2.endsWith("78");
System.out.println(b2);
}
}
运行结果:
10.4.5判断字符串是否相等
对字符串对象进行比较不能简单地使用比较运算符“==”
代码:
String tom =new String("I am a student");
String jerry = new String("I am a student");
boolean b = (tom == jerry);
布尔类型变量b的值位false,因为字符串是对象,tom、jerry是引用,如下图:
1.equals()方法
如果两个两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。否则,返回false。
语法:str.equals(String otherstr) //其中str、otherstr是要比较的两个字符串对象
2.equalslgnoreCase()方法
使用equals()方法对字符串进行比较时是区分大小写的,而使用equalslgnoreCase()方法是在忽略了大小写的情况下比较两个字符串是否相等,返回结果仍为boolean类型
语法如下:equalslgnoreCase(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"); //创建字符串对象s1
String s2 =new String("ABC"); //创建字符串对象s2
boolean b =s1.equals(s2); //使用equals()方法比较s1与s2
boolean b2 =s1.equalsIgnoreCase(s2); //使用equalsIgnoreCase()方法比较s1与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) //str、otherstr是要比较的两个字符串对象
注意:compareTo()方法只有在equals(Object)方法返回true时才返回0
例题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字符串分割
1.split(String sign)
该方法可根据给定的分割符对字符串进行拆分
语法:str.split(String sign) //sign为分割字符串的分割符,也可以使用正则表达式
2.split(String sign,int limit)
该方法可根据给定的分割符对字符串进行拆分,并限定拆分的次数
语法:str.split(String sign,int limit)
sign:分割字符串的分割符,也可以使用正则表达式
limit:限制的分割次数
例题10.12
代码:
//10.4.8字符串的分割
String strin="192.168.0.1";
String[] split =strin.split("\\.");//转义,分割为4个部分
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()方法有两种重载形式。
1.format(String format,Object...args)
该方法使用指定的格式字符和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境。
语法:str.format(String format,Object...args)
format:格式化字符串
args:格式化字符串中由格式说明字符引用的参数
2.format(Local I,String format,Object...args)
该方法使用指定的语言环境、格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用其指定语言环境。
语法:str.format(Local I,String format,Object...args)
I:格式化过程中要应用的语言环境。
format:格式字符串
args:格式字符串中由格式说明符引用的参数。可以为0
10.5.1日期和时间字符串格式化
1.日期格式化
例子:
Date data = new Date(); //创建Date对象date
String s = String.formate("%te",date); //通过format()方法对date进行格式化
常用的日期格式化转换符如下表:
例题10.13
代码:
package a;
import java.util.Date; //导入java.util.Date类
public class Eval1 { //新建类
public static void main(String[] args) { //主方法
// TODO Auto-generated method stub
Date date = new Date(); //创建Date对象date
String year = String.format("%tY",date); //将date进行格式化
String month = String.format("%tB",date);
String day = String.format("%td",date);
System.out.println("今年是:"+year+"年"); //输出信息
System.out.println("现在是"+month);
System.out.println("今天是:"+day+"号");
}
}
运行结果:
2.时间格式化
格式化时间的转换符如下表:
例题10.14
代码:
package a;
import java.util.Date; //导入java.util.Date类
public class GetDate { //新建类
public static void main(String[] args) { //主方法
// TODO Auto-generated method stub
Date date = new Date(); //创建Date对象date
String hour = String.format("%tH",date); //将date进行格式化
String minute = String.format("%tM",date);
String second = String.format("%tS",date);
System.out.println("现在是:"+hour+"时"+minute+"分"+second+"秒"); //输出的信息
}
}
运行结果:
3.格式化常见的日期时间组合
格式化日期与时间组合的转换符定义了各种日期时间组合的格式,其中最常见的如下表:
例题10.15
代码:
package a;
import java.util.Date; //导入java.util.Date类
public class DateAndTime { //创建类
public static void main(String[] args) { //主方法
// TODO Auto-generated method stub
Date date = new Date(); //创建Date对象date
String time = String.format("%tc",date); //将date进行格式化
String form = String.format("%tF",date);
System.out.println("全部的时间信息是:"+time); //将格式化后的日期时间输出
System.out.println("年-月-日格式:"+form);
}
}
运行结果
10.5.2常规类型格式化
常规类型格式化可应用于任何参数类型,如下表:
例题10.16
代码:
package a;
public class General { //新建类
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使用正则表达式
正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。
正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。
如下表:
注意:在正则表达式中,“.”代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符“.”,必须使用转移字符“\".
在正则表达式中,可以使用方括号括起若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。
方括号元字符还可以为其他格式,如:
1. [^456]:代表4、5、6之外的任何字符
2. [a-r]:代表a~r中的任何一个字母
3. [a-zA-Z]:可表示任意一个英文字母
4. [a-e[g-z]]:代表a~e或g~z中的任何一个字母(并运算)
5. [a-o&&[def]]:代表字母d、e、f(交运算)
6. [a-d&&[^bc]]:代表字母 a、d(差运算)
在正则表达式中允许使用限定修饰符来限定元字符出现的次数。
例题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 ="aaaa";
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();