String特性
public final class String 不可变
String字符串一旦被创建即不可被改变,所有对字符串的操作都会创建新的String对象,就不是改变原字符串本身
字符串常量池
每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串。
优点:减少内存中重复的字符串,优化jvm性能
String对象的创建方式
运行期创建,存在堆中
编译期创建,存在字符串常量池中
String a = "abc";
String a = new String("abc");
String类常用方法
字符串与其他基本类型间的转换
字符串比较 equals()
字符串替换 replace()
字符串查找 indexOf("aa")
字符串拆分 split("#")
字符串截取 substring(0, 5)
字符串拼接 +(不建议)
字符串拼接
注意:String c = "xx" + "yy " + a + "zz" + "mm" + b; 实质上的实现过程是: String c = new StringBuilder("xxyy ").append(a).append("zz").append("mm").append(b).toString();由此得出结论:当使用+进行多个字符串连接时,实际上是产生了一个StringBuilder对象和一个String对象。
直接“+”实现拼接
StringBuffer 线程安全
StringBuilder 非线程安全,非多线程条件下,效率更高
深入分析String a = new String("abc")
采用new关键字新建一个字符串对象时,JVM首先在字符串池中查找有没有"abc"这个字符串对象,如果有,则不在池中再去创建"abc"这个对象了,直接在堆中创建一个"abc"字符串对象,然后将堆中的这个"abc"对象的地址返回赋给引用a,这样,a就指向了堆中创建的这个"abc"字符串对象;如果没有,则首先在字符串池中创建一个"abc"字符串对象,然后再在堆中创建一个"abc"字符串对象,然后将堆中这个"abc"字符串对象的地址返回赋给a引用。
领取专属 10元无门槛券
私享最新 技术干货