字符串
参考资料:《Java从入门到精通》/明日科技编著. 4版. 北京:清华大学出版社,2016
在Java语言中,字符串作为String类的实例来处理。以对象的方式来处理字符串,使字符串更加灵活、方便。
一、String类
前面介绍了,char类型变量只能表示单个字符,不能表示由多个字符连接而成的字符串。在java语言中将字符串作为对象处理,可以通过java.lang包中的String类来创建字符串对象。
1、声明字符串
在Java语言中,字符串必须包含在一对双引号("")中。声明一个字符串的方式如下:
String str; //声明字符串
String str1 = "hello"; //声明字符串,并赋初值
注意:声明字符串变量必须经过初始化才能使用,否则编译器会报出“变量未经过初始化”。
2、创建字符串
Java语言中将字符串作为对象来处理,因此可以像创建对象一样来创建字符串对象。
(1)String(char a[])
- 用一个字符数组a创建String对象
char a[] = {'a','b','c','d'}; 等价于
String s = new String(a); -----------> String s = new String("abcd");
(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("uden");
除了上面的两种方式,还可以通过引用字符串常量来创建字符串变量。
String str1, str2;
str1 = "hello world";
str2 = "hello world";
此时,str1和str2引用相同的字符串变量,因此具有相同的实体。
public class StringTest {
public static void main(String[] args) {
String s = new String("hello");
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println("s=s1? " + (s == s1));
System.out.println("s1=s2? " + (s1 == s2));
System.out.println("s=s3? " + (s == s3));
}
}
输出结果:
s=s1? false
s1=s2? true
s=s3? false
3、连接字符串
- 可以对多个字符串进行连接,也可以使字符串与其他数据类型进行连接。
- 使用“+”运算符可以实现多个字符串的连接。
public class StringJoin {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("world");
String s3 = s1 + " " + s2;
System.out.println(s3); //输出hello world
}
}
字符串同其他基本数据类型进行连接时,会自动调用toString()方法,将这些数据直接转换成字符串。
public class ToString {
public static void main(String[] args) {
int num = 10;
float f1 = 2.34f;
String s1 = num + " " + f1;
System.out.println(s1);
}
}
三、获取字符串信息
(1)获取字符串长度
使用String类的length()方法可以获取声明的字符串对象的长度。
String str = "hello world";
System.out.println( str.length() ); //输出11
注意:字符串的长度包括字符串中的空格。
(2)字符串查找
String类提供了两种查找字符串的方法,即indexOf()和lastIndexOf()方法。
- indexOf()方法返回的是搜索的字符或字符串首次出现的位置。
- lastIndexOf()方法返回的是搜索的字符或字符串最后一次出现的位置。
String str = "hello world";
System.out.println( str.indexOf("o") ); //输出4
System.out.println( str.lastIndexOf("l") ); //输出9
注意:计算机中String对象是数组表示的,字符串的下标从0开始。
说明:如果lastIndexOf()方法中的参数为空字符串""(注意没有空格),则返回字符串的长度。
(3)获取指定索引位置的字符
使用charAt()方法可以将指定索引位置的字符返回。
String str = "hello world";
char c = str.charAt(6);
System.out.println( c ); //输出w
四、字符串操作
(1)获取子字符串
通过String类的substring()方法可以对字符串进行截取。这些方法的共同点就是利用字符串的下标进行截取。
- substring(int beginIndex)
返回从指定的索引位置开始截取至该字符串的结尾。
String str = "hello world";
String substr = str.substring(3);
System.out.println(substr); //输出lo world
- substring(int beginIndex, int endIndex)
返回从指定的索引位置开始截取至指定的索引位置结束的字符串。
String str = "hello world";
String substr = str.substring(3,9);
System.out.println(substr); //输出lo wor
(2)去空格
trim()方法返回字符串的副本,忽略前导空格和尾部空格。
String str = " hello world ";
String substr = str.trim();
System.out.println(substr);
输出结果:
hello world
注意:中间的空格保留
(3)字符串替换
replace()方法可实现将指定的字符或字符串替换成新的字符或字符串。格式如下:
replace(char oldChar, char newChar)
- replace()方法返回一个新的字符串。
- 如果要替换的字符oldChar在原字符串中反复出现,replace()方法会将所有oldChar全部替换成newChar。
- oldChar必须和原字符串中的字符大小写一致。
String str = "hello world";
String substr = str.replace('l','L');
System.out.println(substr);
输出结果:
heLLo worLd
(4)判断字符串的开头与结尾
- startsWith()
该方法用于判断字符串对象的前缀是否为参数指定的字符串,返回值为boolean类型。
String str = "hello world";
boolean bool1 = str.startsWith("he");
boolean bool2 = str.startsWith("hE");
System.out.println(bool1); //输出true
System.out.println(bool2); //输出false
- endsWith()
该方法用于判断当前字符串是否为以指定的子字符串结束,返回值为boolean型。
String str = "hello world";
boolean bool1 = str.endsWith("ld");
boolean bool2 = str.endsWith("Ld");
System.out.println(bool1); //输出true
System.out.println(bool2); //输出false
(5)判断字符串是否相等
对字符串对象的比较不能简单地使用比较运算符“==”,因为比较运算符比较的是两个字符串的内存地址是否相同。即使两个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符仍然会返回false。
String str1 = "i love java";
String str2 = "i love java";
System.out.println(str1 == str2) //输出true
String str3 = new String("i love java");
String str4 = new String("i love java");
System.out.println(str3 == str4); //输出false
因此,要比较两个字符串的内容是否相等,应该使用equals()和equalsIgnoreCase()方法。
- equals()方法
该方法比较两个字符串是否具有相同的字符和长度,结果返回boolean类型。注意:进行字符比较是区分大小写。
- equalsIgnoreCase()方法
该方法和equals()类似,但是不区分大小写。
String str1 = "i love java";
String str2 = "i love java";
String str3 = "I LOVE JAVA";
boolean res1 = str1.equals(str2);
boolean res2 = str1.equals(str3);
boolean res3 = str1.equalsIgnoreCase(str3);
System.out.println(res1); //返回true
System.out.println(res2); //返回false
System.out.println(res3); //返回true
(6)按字典顺序比较两个字符串
compareTo()方法是按照字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值。
- 如果按照字典顺序,String对象位于参数字符串之前,则比较结果是一个负整数。
- 如果按照字典顺序,String对象位于参数字符串之后,则比较结果是一个正整数。
- 如果这两个字符串相等,则结果为0。
String str4 = new String("bb");
String str5 = new String("ac")
int res = str4.compareTo(str5)
System.out.println(res); //输出1
注意:
- 先比较第一位字符,若在之前,则返回-1;若在之后,则返回1;
- 若第一位字符相同,则比较第二位字符,以此类推。
- 如果所有字符相同,则返回0。
(7)字母大小写转换
- toLowerCase()方法
将字符串中的所有字母转换为小写字母。
- toUpperCase()方法
将字符串中的所有字母转换为大写字母。
String str6 = "I Love Java"
String str7 = str6.toLowerCase();
String str8 = str6.toUpperCase()
System.out.println(str7);
System.out.println(str8);
输出结果:
i love java
I LOVE JAVA
(8)字符串分割
split()方法可以使字符串按照指定的分割符或字符串对内容进行分割,并将分割后的结果存放在字符串数组中。split()方法提供了两种字符串分割形式。
- split ( String sign )
其中,sign为字符串的分割符,也可以是正则表达式。如果想定义多个分割符,可以使用“|”符号。例如,“,|?”表示使用“,”和“?”进行分割。
String str6 = "Do you Love Java?Yes";
String[] a = str6.split(" |\?")
//定义空格和问号作为分割符,问号要作转义
for(int i=0; i<a.length; i++) {
System.out.println(a[i]);
}
输出结果:
Do
you
Love
Java
Yes
五、格式化字符串
String类的静态format()方法用于创建格式化的字符串。format()有两种重载的方式:
- format ( String format, Object...args )
- format ( Local 1, String format, Object...args )
1、日期格式化
import java.util.Date;
public class Format {
public static void main(String[] args) {
Date date = new Date();
String day = String.format("%te",date);
String year = String.format("%tY",date);
String mouth = String.format("%tm",date);
System.out.println(year + "-" + mouth + "-" + day);
} //输出2020-05-4
}
其中,"%te、%tY、%tm是转换符。
2、时间格式化
import java.util.Date;
public class Format {
public static void main(String[] args) {
Date date = new Date();
String day = String.format("%te",date);
String year = String.format("%tY",date);
String mouth = String.format("%tm",date);
String hour = String.format("%tH",date);
String minute = String.format("%tM",date);
String second = String.format("%tS",date);
System.out.println("当前时间:" + year + "-" + mouth + "-" + day + " " + hour + ":" + minute + ":" + second);
} //输出:当前时间:2020-05-4 20:19:09
}
3、常见的日期时间格式化组合
import java.util.Date;
public class Format {
public static void main(String[] args) {
Date date = new Date();
String time = String.format("%tT",date);
String year = String.format("%tF",date);
System.out.println("当前时间:" + year + " " + time);
} //输出:当前时间:2020-05-04 20:23:09
}
六、正则表达式
正则表达式通常被用于判断语句中,用来检测某一字符串是否满足某一格式。
七、字符串生成器
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复对字符串进行修改,将极大地增加系统开销。使用可变地字符序列类StringBuilder类,可以大大提高频繁增加字符串地效率。
public class Jerque {
public static void main(String[] args) {
String str = "";
//记录开始时间
long startTime = System.currentTimeMillis();
for(int i=0; i<10000; i++){
str = str + i;
}
//记录结束时间
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
System.out.println("String消耗时间:" + time);
StringBuilder builder = new StringBuilder("");
//记录开始时间
startTime = System.currentTimeMillis();
for(int i=0; i<10000; i++){
builder.append(i);
}
//记录结束时间
endTime = System.currentTimeMillis();
time = endTime - startTime;
System.out.println("StringBuilder消耗时间:" + time);
}
}
输出结果:
String消耗时间:300
StringBuilder消耗时间:0
StringBuilder类的常用方法如下:
- append ( )
该方法用于向字符串生成器中追加内容,可以实现接受任何类型的数据。
- insert ( )
该方法用于向字符串生成器的指定位置插入数据内容,可以接受int、float、char和boolean等数据类型或其他对象。
public class ToString {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("hello");
builder.insert(5," world");
System.out.println( builder.toString() );
//输出:hello world
}
}
- delete ( int start, int end )
该方法删除字符串中指定的字符,从指定的start位置开始,直到end-1的位置。如果start等于end,则不发生任何改变。
public class ToString {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("hello world");
builder.delete(2,5);
System.out.println( builder.toString() );
//输出:he world
}
}