学习String前必须了解JVM内方法区、堆、栈的概念,可看前一篇文章--《JVM速记笔记》
一、String
1. ==与equals
- ==:8中基本数据类型,比“值”;引用类型,如string,比指向对象的地址
- equals:Object类才有,基本数据类型没有。 若未重写,比指向对象地址;若重写,如String\Double\Date\Integer等比“值”
2. String
- String a=”chenssy”
- String b=”chenssy”
- String c=new String(”chenssy”)
- String d=”che”+”nssy”
- String e=new String(“che”)+”nssy”
- String f=”che”
- String g=f+”nssy”
- a==b true 因为指向地址相同,都是常量池中的chenssy;
- a==c flase 因为c指向堆里的对象,尽管堆里对象也是指向常量池;
- a==d true 因为d也是字符串常量,而常量池里不能有两个相同的对象;
- a==e flase 因为new了,有自己指向地址,所以e整体地址不一样;
- a==g flase 因为f是引用存在,引用的值无法在编译时确定,只能在运行期Ok
- 除非f被final修饰,因为被final修饰的会提前解析好,当然,如果f被final修饰但是通过方法调用返回的,它的值还是只能在运行期被解析,就是flase了
- ab:方法区(字符串常量池)创建一个chenssy对象,ab是引用,存在栈中,指向常量池中的chenssy
- c:因为是New,所以堆中会开辟一个空间,常量池中有chenssy,创建一个堆对象,将常量池中的chenssy拷贝过来,并同时指向常量池中的chenssy
3. String常用方法
- .length
- .concat 连接字符串。可直接只用+
- .charAt
- .equals
- .indexOf 第一次出现的下标
- .split
- .trim 去除字符串两端空格
- .reverse 反转
- .substring(start,end) 截取字符串
- .toCharArry
- .toString
- .valueOf
4. StringBuilder、StringBuffer 后者线性安全
常用方法:
- .append(字符串)
- .insert(下标,字符串)
- .delete(始,终)
- .setCharAt(位置,char)
- .replace(始,终,字符串)
- .reverse
- .charAt
- .indexOf
- .length
- .substring
- .toString
5. 转换
- String-->char[] String.toCharArray()
- char[]-->String String.valueOf(char[])
- StringBuilder/StringBuffer-->String sb.toString())
- String-->StringBuilder/StringBuffer new StringBuilder(string)