一、String 类
1.单个字符可以用char类型保存,多个字符组成的文本就需要保存在String对象中。
2.String通常被称为字符串,一个String对象最多可以保存(2^32-1)个字节(占用4GB空间大小)的文本内容。
1.声明字符串
1.在Java语言中,字符串必须包含在一对双引号(" ")之内。
例如
"23.23"、"ABCDE"、 "你好"
2.可以通过以下语法格式来声明字符串变量
String str;
String:指定该变量为字符串类型
str:任意有效的标识符,表示字符串变量的名称。
2.创建字符串
1.在Java语言中,将字符串作为对象来处理,因此可以像创建其他类对象一样来创建字符串对象。创建对象要使用类的构造方法。
2.String(char a[ ])
该方法用一个字符数组a创建String对象,代码如下:
char[] ch= {'g','o','o','d'};
str = new String(ch);
3.String(char a[ ],int offset,int length)
该方法提取字符数组a中的一部分创建一个字符串对象。参数offset表示开始截取字符串的位置,length表示截取字符串的长度。代码如下:
char[] c= {'s','t','u','d','e','n','t'};
String s=new String(c, 1,3);
4.String(char a[ ] value)
该构造方法可分配一个新的String对象,使其表示字符串数组参数中所有元素连接结果。代码如下:
char[] c= {'s','t','u','d','e','n','t'};
String s=new String(c);
代码
public class Test1 {
public static void main(String[] args) {
//10.1 String类
//字符串变量的申明
String str;
//System.out.println(str);
//字符串变量初始化
str = "你好";//直接传入内容
//单引号字符,双引号字符串
str = new String("你好");
System.out.println(str);
//字符串变量初始化,传入字符类型的数组
char[] ch= {'g','o','o','d'};
str = new String(ch);
System.out.println(str);
//字符串变量初始化,传入字符类型的数组,两个数字(前索引,个数)
char[] c= {'s','t','u','d','e','n','t'};
String s=new String(c, 1,3);
System.out.println(s);
}
}
二、连接字符串
1.连接多个字符串
1.使用“+”运算符可实现连接多个字符串的功能。
2.“+”运算符可以连接多个String对象并产生一个新的String对象。
例题10.1【先连接一副对联的上、下联,在分行输出在控制台上】
public class Join {//创建类
public static void main(String[] args) {//主方法
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输出
}
}
结果
2.连接其他数据类型
1.字符串也可同其他数据类型进行连接。
2.如果将字符串同其他数据类型进行连接,会将其他数据类型的数据直接转换成字符串。
例题10.2【统计每天的阅读和上机时间】
public class Link {//创建类
public static void main(String[] args) {//主方法
int booktime = 4;//声明的int类型变量booktime
float practice = 2.5f;//声明的float型变量practice
//将字符串于整型、浮点型变量相连,并将结果输出
System.out.println("我每天花费"+booktime+"小时看书"+practice+"小时上机练习");
}
}
结果
三、获取字符串信息
1.获取字符串长度
1.使用String类的length()方法可获取声明的字符串对象的长度。语法如下:
str.length();
其中,str为字符串对象。
2. 获取字符串长度,代码如下:
String str="We are students";//定义字符串str
int size = str.length();
2.字符串查找
1.String类提供了两种查找字符串方法,即IndexOf()和LastIndexOf()方法。
2.IndexOf(String s)
1.语法如下:
str.indexOf(substr)
str:任意字符串对象
substr:要搜索的字符串
2.查找字符a在字符串str中的索引位置,代码如下:
String str="We are students";//定义字符串str
int size = str.lastIndexOf("a");
3.LastIndexOf(String str)
1.该方法用于返回指定字符串最后一次出现的索引位置。语法如下:
str.lastindexof(substr)
str:任意字符串对象
substr:要搜索的字符串
例题10.3【用两种方法判断字符串的长度】
public class Text {//创建类
public static void main(String[] args) {//主方法
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的长度输出
}
}
3.获取指定索引位置字符
1.使用charat()方法可将指定索引处的字符返回。语法如下:
str.charAt(int index)
str:任意字符串
index:整数型,用于指定要返回字符的下标。
例题10.4【查找指定索引位置上的字符】
public class Ref {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
String str= "hello world";//定义字符串str
char mychar = str.charAt(6);//将字符串str中索引位置是6的字符返回
System.out.println("字符串str中索引位置是6的字符为:"+mychar);//输出信息【;
}
}
四、字符串操作
1.通过String类的substring()方法可对字符串进行截取。
2.substring()方法被两种不同的查找形式,来满足不同的需要。
1.获取子字符串
1.substring(int beginindex)【(前索引,后索引)前含后不含】
1.该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串。语法如下:
substring(int beginindex)
beginindex指定从某一索引处开始截取字符串。
截取字符串,代码如下:
String str= "hello world";//定义字符串str
String substr = str.substring(3);//获取字符串
2.substring(int beginindex,int endindex)
1.该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串。语法如下:
substring(int beginindex,int endindex)
beginindex:开始截取子字符串的索引位置
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);//输出截取后的字符串
}
}
2.去除空格
1.trim()方法返回字符串的副本,忽略前导空格和尾部空格。语法如下:
str.trim()
str:任意字符串
例题10.6【去掉字符串首,尾的空格】
public class Blak {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
String str = " java class ";//定义字符串str
System.out.println("字符串原来的长度:"+str.length());
//教案str原来的长度输出
//将str去掉前导空格和尾部空格后的长度输出
System.out.println("去掉空格后的长度:"+str.trim().length());
}
}
3.字符串替换
1.replace()方法可实现将指定的字符或字符串替换成新的字符或字符串。语法如下:
str.replace(charsquence target,charsquence replacement)
target:要替换的字符或字符串。
replacement:用于替换原来字符串的内容。
例题10.7【将单词中的字母a替换为字母A】
public class NewStr {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "address";//定义字符串str
String newstr = str.replace("a", "A");
//将str中“a”替换成“A”并返回新字符串newstr
System.out.println(newstr);//输出
}
}
4.判断字符串的开始与结尾
1.startswith()方法与endswith()方法分别用于判断字符串是否以指定的内容开始或结束。
2.这两个方法的返回值都为Boolean类型。
3.startswith()方法
1.该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。语法如下:
str.atartswith(String prefix)
prefix是指作为前缀的字符串
4.endswith()方法
1. .该方法用于判断当前字符串是否以给定的子字符串结束。语法如下:
str.endswith(String suffix)
suffix:是指作为后缀的字符串
例题10.8【判断字符串是否以指定的内容开始或结束】
public class StartOrEnd {
public static void main(String[] args) {
// TODO Auto-generated method stub
String num1 = "22045612";//定义字符串num1
String num2 = "21304578";//定义字符串num2
boolean b= num1.startsWith("22");//判断字符串num1是否以22开头
boolean b2 = num2.endsWith("78");//判断字符串num2是否以78开头
System.out.println("字符串num1是以'22'开始的吗?"+b);
System.out.println("字符串num2是以'78'结尾的吗?"+b2);//输出
}
}
5.判断字符串是否相等
1.对字符串对象进行比较不能简单地使用比较运算符“==”,因为比较运算符比较的是两个字符串的地址是否相同。
2.即使两个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符仍然会返回false。使用比较运算符比较两个字符串,代码如下:
String tom = new String("i am a student");
String jerry = new String("i am a student");
boolean b = (tom == jerry);
因此,要比较两个字符串内容是否相等,应使用equals()方法和equalsignorecase()方法。
3.equals()方法
1.如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。否则,返回false。语法如下:
str.equals(String otherstr)
4.equalsIgnoreCase()方法
1.忽略了大小写的情况比较两个字符串是否相等,返回结果为Boolean类型。语法如下:
str.equalsIgnoreCase(String otherstr)
例题10.9【判断“abc”与“ABC”是否相等】
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()方法比较s1s2
System.out.println(s1 +" equals "+ s2 +":"+ b);//输出信息
System.out.println(s1 +" equalsIgnoreCase "+ s2 +":"+ b2);
}
}
6.按字典顺序比较两个字符串
1.语法如下:
str.compearTo(String otherstr)
说明:compareTo()方法只有在equals()方法返回turn时才返回0.
例题10.10【判断字母b的位置】
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));
//比较结果输出
System.out.println(str +" compareTo "+ str3 +": "+str.compareTo(str3));
}
}
7.字母大小写转换
1.toLowerCase()方法【转换小写】
str.toLowerCase()
2.toUpperCase()方法【转换大写】
str.toUpperCase()
例题10.11【字母大小写转换】
public class UpAndLower {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = new String("Oh My God!");//创建字符串str
String newstr = str.toLowerCase();//小写转换
String newstr2 = str.toUpperCase();//大写转换
System.out.println(newstr);//输出
System.out.println(newstr2);
}
}
8.字符串分割
1.split()方法
str.split()
2.split(String sign,int limit)
str.split(String sign,int limit)
例题10.12【按要求分割】
public class Division {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "192.168.0.1";
String[] firstArray = str.split("\\.");
String[] secondArray = str.split("\\.",2);
System.out.println("str的原值为:["+ str +"]");
System.out.print("全部的分割结果: ");
for(String a :firstArray) {
System.out.print("[" + a +"]");
}
System.out.println();
System.out.print("全部两次分割结果: ");
for(String a :secondArray) {
System.out.print("[" + a +"]");
}
System.out.println();
}
}
五、格式化字符串
1.String类的静态format()方法用于创建格式化的字符串。
2.format()方法有两种重载形式。
str.format(String format,object...args)
str.format(local,String format,object...args)
1.日期和时间字符串格式化
1.日期格式化
1.返回一个月中的天数,代码如下:
Date date = new Date();//创建Date对象date
String time = String.format("%te", date);
2.常用的日期格式化修饰符
例题10.13【按照格式输出今年的年月日】
import java.util.Date;//导入
public class Eval {
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.时间格式化
1.使用format0方法不仅可以完成日期的格式化,也可以实现时间的格式化。时间的格式化转换符要比日期的格式化转换符更多、更精确,它可以将时间格式化为时、分、秒、毫秒等。
2.时间格式化转换符
例题10.14【按照格式输出当下的时分秒】
import 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【按照格式输出今年的年月日】
import 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);//输出信息
}
}
2.常规类型格式化
例题10.16【使用转换符获取表达式结果】
public class General {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = String.format("%d", 400/2);//将date格式化
String str2 = String.format("%b", 3>5);
String str3 = String.format("%x", 200);
System.out.println("400 的一半是:"+ str);//输出格式化字符串
System.out.println("3>5正确吗:"+ str2);
System.out.println("200的十六进制是:"+ str3);
}
}
六、使用正则表达式
正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。正则表达式是含一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。
1.正则表达式中的元字符
在正则表达式中,可以使用方括号括起若千个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。例如,reg =“[abc]4”,这样字符串 a4、b4、4 都是和正则表达式匹配的字符串。方括号元字符还可以为其他格式。如:
[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(差运算)。区
2.限定修饰符
例题10.17【验证E—mail地址是否”合法“】
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地址格式");
}
}
}
七、字符串生成器
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的 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++) {//利用for循环执行10000次
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++) {//利用for循环进行操作
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)
offset: 字符串生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。
arg:将插入至字符串生成器的位置。该参数可以是任何数据类型的数据或其他对象。
向字符串生成器中指定的位置添加字符,代码如下:
StringBuilder bf= new StringBuilder("hello")
bf.insert(5,"world");
System.out.println(bf.toString());
//创建字符生成器
//添加至字符生成器的位置及内容
//此时输出信息为helloworid
3.delete(int start , int end)方法【前删后不删】
移除此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end-1处的字符。如果不存在这种字符,则一直到序列尾部。如果 stat 等于 end,则不发生任何更改。语法如下:
delete(int start , int end)
start:将要删除的字符串的起点位置
end:将要删除的字符串的终点位置
删除指定位置的子字符串,代码如下:
StringBuilder bf= new StringBuilder("StringBuilder");
bf.delete(5,10);
System.out.println(bf.toString());
//创建字符生成器
//添加至字符生成器的位置及内容
//此时输出信息为Strinder