String、StringBuffer、StringBuilde
区别
1,从运行速度上看:StringBuilder > StringBuffer > String
2,从长度上看:StringBuilder 和StringBuffer 是字符串变量,长度可变,String 创建后不可更改
3,从线程安全上看:StringBuilder是线程不安全的,StringBuffer是线程安全的
4,使用区别
当操作String时,需要不断创建和回收对象
String 适合少量字符串操作情况
StringBuffer:适用于多线程在字符缓冲区进行大量操作情况
StringBuilder:适用于在单线程在字符缓冲区进行大量操作的情况
深入
引用:https://www.jianshu.com/p/8fbd55d6e369
String 特点:
1.String不可继承,支持序列化,支持自然排序
String 是由final修饰的类,且实现了Serializable和Comparable接口
2.String底层实现用的final char[ ]
3.String可以采用直接赋值的形式进行操作,这一点像基本数据类型的赋值操作一样。范例:String str = "hello";
4.String重写了equals()方法,变成内容的比较而不是地址
5.String类的设计使用了一个共享设计模式:
在JVM中,为了减少字符串对象的重复创建,维护了一块特殊的内存空间,这块内存就被称为字符串常量池
6.字符串一旦创建,对他任何操作都不能改变
String a="abc"
先去常量池中遍历,如果有"abc"字符串,则直接返回当前地址,如果没有,则先在常量池中创建"abc",然后返回其地址,此过程创建零个或一个对象
String a=new String("abc"))
先在池中遍历,,如果有"abc"字符串,则进行下一步,如果没有,则先在常量池中创建"abc",然后在堆中创建String对象,指向池中"abc"的地址,此过程创建一个或两个对象,一定会创建对象
题目:
String s1="abcd"; //在常量池创建"abcd"
String s2="abcd"; //引用常量池中的"abcd"
String s3=new String("abcd"); //堆中创建String对象 s3 值指向常量池中的"abcd"
String s4=new String("abcd"); //堆中创建String对象 s4 值指向常量池中的"abcd"
System.out.println(s1==s2); //true
System.out.println(s1==s3); //fallse
System.out.println(s1==s4); //fallse
System.out.println(s3==s4); //fallse