一 字符串的特点
1、String类是final声明的
2、字符串的对象也是不可变对象,意味着一旦进行修改,就会产生新对象
我们修改了字符串后,如果想要获得新的内容,必须重新接受。
如果程序中涉及到大量的字符串的修改操作,那么此时的时空消耗比较高。可能需要考虑使用StringBuilder或StringBuffer。
3、String对象内部是用字符数组进行保存的
JDK1.9之前有一个char[] value数组,JDK1.9之后byte[]数组
4、String类中这个char[] values数组也是final修饰的,意味着这个数组不可变,然后它是private修饰,外部不能直接操作它,String类型提供的所有的方法都是用新对象来表示修改后内容的,所以保证了String对象的不可变。
5、就因为字符串对象设计为不可变,那么所以字符串有常量池来保存很多常量对象
常量池在方法区。
如果细致的划分:
(1)JDK1.6及其之前:方法区
(2)JDK1.7:堆
(3)JDK1.8:元空间
二 String类的常用api
(1)boolean isEmpty()
(2)int length()
(3)String concat(xx):拼接,等价于+
(4)boolean contanis(xx)
(5)int indexOf():从前往后找,要是没有返回-1
(6)int lastIndexOf():从后往前找,要是没有返回-1
(7)char charAt(index)
(8)new String(char[] ) 或new String(char[] ,int, int)
(9)char[] toCharArray()
(10)byte[] getBytes():编码,把字符串变为字节数组,按照平台默认的字符编码进行编码
byte[] getBytes(字符编码方式):按照指定的编码方式进行编码
(11)new String(byte[] ) 或 new String(byte[], int, int):解码,按照平台默认的字符编码进行解码
new String(byte[],字符编码方式 ) 或 new String(byte[], int, int,字符编码方式):解码,按照指定的编码方式进行解码
(12)String subString(int begin):从[begin]开始到最后
String subString(int begin,int end):从[begin, end)
(13)boolean matchs(正则表达式)
(14)String replace(xx,xx):不支持正则
String replaceFirst(正则,value):替换第一个匹配部分
String repalceAll(正则, value):替换所有匹配部分
(15)String[] split(正则):按照某种规则进行拆分
(16)boolean startsWith(xx):是否以xx开头
boolean endsWith(xx):是否以xx结尾
(17)String trim():去掉前后空白符,字符串中间的空白符不会去掉
(18)String toUpperCase():转大写
(19)String toLowerCase():转小写
三 String Stringbuffer Stringbuilder
1、可变字符序列:StringBuilder和StringBuffer
StringBuffer:老的,线程安全的(因为它的方法有synchronized修饰)
StringBuilder:线程不安全的
2、面试题:String和StringBuilder、StringBuffer的区别?
String:不可变对象,不可变字符序列
StringBuilder、StringBuffer: 可变字符序列
3、常用的API,StringBuilder、StringBuffer的API是完全一致的
(1)append(xx):拼接,追加
(2)insert(int index, xx):插入
(3)delete(int start, int end)
deleteCharAt(int index)
(4)set(int index, xx)
(5)reverse():反转
… 替换、截取、查找…