Java之String类、StringBuilder类、StringBuffer类

String类

String str = "123abc";

str = str.concat("DEF123");//在末尾追加,并返回新的字符串
str = str.substring(2);//从开始下标处截取到字符串末尾,并返回新的字符串
str = str.substring(1, 7);//从开始下标处(包含)截取到结束下标处(排他),并返回新的字符串

str = str.toLowerCase();//转小写,并返回新的字符串
str = str.toUpperCase();//转大写,并返回新的字符串

//--------------------------------------------------------------------

str = "   123   abc   DEF   123         ";

str = str.trim();//去除首尾空格,并返回新的字符串
str = str.replace('2', '6');//替换字符,并返回新的字符串
str = str.replaceAll("163", "666888");//替换字符串,并返回新的字符串
str = str.replaceFirst("666", "7777");//替换第一次出现的字符串,并返回新的字符串

str = str.replaceAll(" ", "");//去除空格(将空格字符串替换成空内容的字符串)

System.out.println("判断两个字符串是否相同(区分大小写):" + str.equals("7777888abcDEF666888"));
System.out.println("判断两个字符串是否相同(不区分大小写):" + str.equalsIgnoreCase("7777888ABCDEF666888"));

System.out.println("判断字符串是否以某个字符串开头:" + str.startsWith("777"));
System.out.println("判断字符串是否以某个字符串结尾:" + str.endsWith("666888"));

System.out.println("查询出子字符串在字符串中第一次出现的下标:" + str.indexOf("88"));
System.out.println("查询出子字符串在字符串中最后一次出现的下标:" + str.lastIndexOf("88"));

System.out.println("获取指定下标上的字符:" + str.charAt(7));
面试题
  1. 描述下列代码会创建几个String对象一个:常量池里面的常量是唯一的

    String str1 = "abc";
    String str2 = "abc";
    System.out.println(str1);
    System.out.println(str2);
    
  2. 描述下列代码会创建几个String对象三个,常量池创建一个,堆内存中new了两个

    String str1 = new String("abc");
    String str2 = new String("abc");
    System.out.println(str1);
    System.out.println(str2);
    
String对象的拼接
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);//true

//两个常量在编译时直接拼接
String str3 = "ab" + "c";//反编译:String str3 = "abc";
System.out.println(str1 == str3);//true

//两个常量在编译时直接拼接
final String s1 = "ab";
final String s2 = "c";
String str4 = s1 + s2;//反编译:String str4 = "abc";
System.out.println(str1 == str4);//true

//变量拼接,底层会创建StringBuilder对象
String s3 = "ab";
String s4 = "c";
String str5 = s3 + s4;//底层实现:String str5 = (new StringBuilder(String.valueOf(s3))).append(s4).toString()
System.out.println(str1 == str5);//false

StringBuilder类(无参构造默认长度16)

//创建StringBuilder对象
StringBuilder sb = new StringBuilder();

//在末尾追加字符串
sb.append("123abc");
sb.append("DEF123");

sb.insert(6, "XXYYZZ");//将字符串插入到指定下标的位置
sb.setCharAt(6, 'x');//替换指定下标上的字符
sb.replace(3, 6, "aabbcc");//替换开始下标处(包含)到结束下标处(排他)的字符串
sb.deleteCharAt(3);//删除指定下标上的字符
sb.delete(3, 17);//删除开始下标处(包含)到结束下标处(排他)的字符串
sb.reverse();//反转字符串

System.out.println(sb.toString());//321321
面试题
  1. 面试题:如何减少容器的伸缩性?(如何减少容器的扩容次数)选择容器类的有参构造,直接指定容器长度

    StringBuilder sb = new StringBuilder(10000);
    

StringBuffer类(无参构造默认长度16)

//创建StringBuffer对象
StringBuffer sb = new StringBuffer();

//在末尾追加字符串
sb.append("123abc");
sb.append("DEF123");

sb.insert(6, "XXYYZZ");//将字符串插入到指定下标的位置
sb.setCharAt(6, 'x');//替换指定下标上的字符
sb.replace(3, 6, "aabbcc");//替换开始下标处(包含)到结束下标处(排他)的字符串
sb.deleteCharAt(3);//删除指定下标上的字符
sb.delete(3, 17);//删除开始下标处(包含)到结束下标处(排他)的字符串
sb.reverse();//反转字符串

StringBuffer与StringBuilder的区别

两者在使用方法上完全相同

底层源码有差异

//StringBuilder
public final class StringBuilder extends AbstractStringBuilder {
    
    public StringBuilder() {
        super(16);
    }
}
//StringBuffer
public synchronized final class StringBuffer extends AbstractStringBuilder {
    
    public StringBuffer() {
        super(16);
    }
}

StringBuffer是线程安全的,但是StringBuilder的效率比StringBuffer高,因为没有上锁和解锁的过程

应用场景:

​ 单线程:使用StringBuilder

​ 多线程:使用StringBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拖把湛屎,戳谁谁死

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值