java记录-String、StringBuilder和StringBuffer

文章详细介绍了Java中String类型的不可变性及其优点,如字符串常量池的复用和线程安全性。同时,对比了StringBuilder和StringBuffer,指出它们的可变性以及在多线程环境下的差异,建议在需要频繁修改字符串时使用StringBuilder。还列举并解释了多个String和StringBuilder/StringBuffer的相关方法。
摘要由CSDN通过智能技术生成

具体API还是看文档

String

String类型的底层实现是char[],打不死股
字符串一旦创建不会更改,字符串的改变其实是创建了一个新的字符串复制给了这个字符串引用变量
String不适合频繁修改,需要频繁修改要使用StringBuffer和StringBuilder来操作。

String不可变的优点:

  • 用字符串常量池完成了字符串的复用,字符串常量池里的String必须是不变的,否则每次引用变量去找它都不是同一个字符串
  • String不变它的哈希码也不会变,计算一次就加入缓存随时复用,方便使用哈希码的对象
  • 无法修改所以线程安全

创建字符串,不过是在字符串池里创建了一个字符串并且指向它(推荐方式):

String s1 = "this is a good day";

创建字符串,先在字符串池创建一个字符串,然后给堆分配内存(因为用了new就要分配,多此一举)。
s2的指向顺序是:引用变量s2(地址)->堆内存(地址)->字符串池(字符串内容)

String s2 = new String("Bad day");

String的方法

s1.length();
s1.equals();
s1.equalsIgnoreCase();//忽略大小写比较相等
s1.charAt(5);//获取某索引的字符char
s1.indexOf("好");//找第一个匹配的字符的下标
s1.indexOf("好"3);//从3开始找第一个匹配的字符的下标
s1.lastIndexOf("坏");//找最后一个
s1.split("-");//分割字符串返回结果字符串数组
s1.replace("-", ",");//字符替换
s1.substring(3,6);//切割子串(含前不含后)
s1.substring(3);//切割子串
s1.contains("好的很");//是否包含
s1.toUpperCase();//转大写
s1.toLowerCase();//转小写
s1.toCharArray();//字符串转字符数组
new String(char[]);//字符数组合成字符串

StringBuilder

StringBuilder和StringBuffer可以改底层的char[],是可变字符序列
StringBuilder用起来和StringBuffer操作一致

  • StringBuilder的速度是最快的,之后是StringBuffer
  • StringBuilder是线程不安全的,而StringBuffer是线程安全的
  • 循环拼接数组用StringBuilder和StringBuffer,用+会不停地在字符串池创造新字符串,效率很低
StringBuilder sbuilder = new StringBuilder("Hello");
sbuilder.append("Word");

StringBuffer

可变的底层实现用的是System.arraycopy();,在有的方法也用了Arrays.copyOf()
可以想到,ArrayList的容量增长用的是grow(),grow的实现用了Arrays.copyOf(),而System.arraycopy()就是Arrays.copyOf()调用的方法。可知StringBuffer的可变实现,在底层也是通过在内存里复制更大的char[ ]来完成的,像一个字符串版的ArrayList

StringBuffer的方法

"""
	没有split方法,但有replace, subString, charAt(), 
"""
StringBuffer sbuffer = new StringBuffer(CharSequence数据);
StringBuffer sbuffer = new StringBuffer(1024);
StringBuffer sbuffer = new StringBuffer();
StringBuffer sbuffer = new StringBuffer("Hello");

sbuffer.capacity();//容量
sbuffer.reverse();//翻转

sbuffer.append("Word");//追加字符串
sbuffer.append(100);
sbuffer.append({'W', 'o', 'r', 'd'});
sbuffer.append(CharSequence数据, start, end);

sbuffer.insert(5, "word");//在指定位置插入

sbuffer.delete(start, end);//删一部分
sbuffer.deleteCharAt(5);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值