具体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);