全面深入学习Java中的字符串类

二、字符串类

(一)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

  • 34
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值