二、字符串类
(一)String
String:字符串
concat() --- 在末尾追加字符串,返回新的字符串
substring(int begindex) --- 从指定下标处截取到字符串末尾,并返回新的字符串
substring(int begindex,endindex) --- 从开始下标(包含)处截取到结束下标(排他)处,并返回新的字符串
toLowerCase() --- 转小写,并返回新的字符串
toUpperCase() --- 转大写,并返回新的字符串
trim() --- 去除首位空格,并返回新字符串
replace() --- 替换字符,并返回新字符串
replaceFirst() --- 替换第一次出现的字符串,并返回新字符串
replaceAll() --- 替换字符串,并返回新字符串
indexOf() --- 获取字符串第一次出现的下标
lastIndexOf() --- 获取字符串最后一次出现的下标
charAt() --- 获取指定下标上的字符
equals() --- 判断两个字符串是否相同
equalsIgnoreCache() --- 判断两个字符串是否相同(不区分大小写)
startwith() --- 判断是否以某字符串开头
endwith() --- 判断是否以某字符串结束
toCharArry() --- 将字符串转换为字符数组
valueOf() --- 将其他类型转换为字符串类型
(二)StringBuffer
StringBuffer:变长字符串
append() --- 将字符串追加到末尾
insert() --- 将字符串插入到指定下标的位置
replace() --- 从开始下标(包含)处替换到结束下标(排他)处的字符串
delete() --- 从开始下标处(包含)删除到结束下标处(排他)的字符串
deleteCharAt() --- 删除指定下标处的字符
reverse() --- 反转字符串
(三)StringBuilder
使用与StringBuffer相同。
(四)深入String
1、创建对象
(1).描述下列代码创建多个少String对象?
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);//true
只有一个String对象。因为abc为字面值常量,存放在常量池中,又常量值不能重复,因此只有一个abc字符串对象
(2).描述下列代码创建多个少String对象?
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str3 == str4);//false
有三个对象,分别是“abc”+new出来的两个String对象
2、字符串拼接问题
(1).常量拼接
//两个常量,在编译时直接拼接
String str3 = "ab"+"c";
System.out.println(str1 == str3);//true
"ab"、"c"作为常量在编译过程中直接拼接,最终为“abc”。从中也可以看出,在此过程中一共有三个常量“ab”、“c”、“abc”
//两个常量,在编译时直接拼接
final String s1 = "ab";
final String s2 = "c";
String str4 = s1+s2;
System.out.println(str1 == str2);//true
final修饰变量,使变量变成常量,和上一个情况一样
(2).变量拼接
String s3 = "ab";
String s4 = "c";
String str5 = s3 + s4;//底层:new StringBuidler(String.valueOf(s3)).append(s4).toString();
System.out.println(str1 == str5);//false
两个变量,底层创建StringBuilder对象做拼接,"=="则判断两个对象的内存地址是否相同,显然不同
3、字符串频繁拼接问题
对于多次拼接的情况下,如果使用“+”来进行拼接,那么当次数达到一定时,程序运行的速度将会非常慢
//获取1970.1.1 0:0:0到现在的毫秒数(1000毫秒=1秒)//long currentTimeMillis = System.currentTimeMillis();
long startTime = System.currentTimeMillis();
String str = "hh";
for (int i = 0; i < 100000; i++) {
str += "yyyyy";
//底层实现:
// str = str + "yyyyy";
// str = new StringBuilder(String.valueOf(str)).append("yyyyy").toString();
}
long endTime = System.currentTimeMillis();
System.out.println("运行时间:"+(endTime-startTime));//13752
对于拼接,其底层逻辑是不断创建StringBuilder对象,当拼接次数过多时,程序运行时间就会过长
采用append方法来解决这个问题
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
sb.append("hhh");
for (int i = 0; i < 100000; i++) {
sb.append("yyyy");
}
long endTime = System.currentTimeMillis();
System.out.println("运行时间:"+(endTime-startTime));//5
但是,使用append方法对于特别大量的数据时,还是不能解决该问题。因为appen方法中,当元素个数超过数组容量时,就会进行扩容,扩容创建新的数组,浪费时间
最好的解决方法是,根据需求,一开始就初始化一个比需求大的数组容量,从而避免减少底层容器的伸缩性(减少底层容器的扩容次数)
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder(10000000);
sb.append("hhh");
for (int i = 0; i < 100000; i++) {
sb.append("yyyy");
}
long endTime = System.currentTimeMillis();
System.out.println("运行时间:"+(endTime-startTime));//0