叉烧店并不卖叉烧

String,StringBuilder,StringBuffer区别

java TTT 25℃ 0评论

参考

String

String是final类不能被继承,成员方法等也是final。在String的方法中concat,substring等都不是在原有的基础上进行操作,而是重新生成了一个字符串对象。也就是说进行这些操作后,最原始的字符串并没有被改变

String str="hello world"
String str=new String("hello world") 

上面的区别是什么

public class Main {
         
    public static void main(String[] args) {
        String str1 = "hello world";
        String str2 = new String("hello world");
        String str3 = "hello world";
        String str4 = new String("hello world");
         
        System.out.println(str1==str2); // false
        System.out.println(str1==str3); // true
        System.out.println(str2==str4); // false
    }
}

出现以上结果的原因是,在class文件中有一部分来存储编译期间生成的字面常量(")以及引用符号,这部分叫做class文件常量池,在运行期间对应着方法区的运行时常量池

因此在上述代码中,String str1 = "hello world"和String str3 = "hello world"都在编译期间生成了字面常量和符号引用,运行期间字面常量"hello world"被存储在运行时常量池(当然只保存了一个)。通过这种方式来将String对象跟引用绑定的话,JVM执行引擎会现在运行时常量池查找是否存在相同的字面常量,如果存在,则直接将引用指向已经存在的字面常量;否则在运行时常量池开辟一个空间来存储该字面常量,并将引用指向该字面常量

总所周知,通过new关键字来生成对象是在堆区进行的,而在堆区进行对象的生成的过程时不回去检测该对象是否已经存在的。因此通过new类来创建的对象,创建出的一定是不同的对象,即使字符串的内容是相同的

string += "hello";

上面语句的过程相当于将原有的String变量指向的内容取出来与hello做字符串相加的操作再存进另一个新的String对象中,再让String变量指向一个新生成的对象。所以缺点就体现出来了,如果循环10000进行相加操作,那么将会生成10000个String对象,如果这些对象没有被回收,将会造成内存资源的浪费。并且以上的操作会被JVM优化成

  StringBuilder str = new StringBuilder(string);

  str.append("hello");

  str.toString();

怎么看出来的可以使用javap -c ClassName对类进行反编译

StringBuilder

使用StringBuilder进行字符串拼接工作

public class Main {
         
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        for(int i=0;i<10000;i++){
            stringBuilder.append("hello");
        }
    }
}

进行反编译后发现值做了一次new的操作,意思就是只生成了一个对象,append操作是在原有对象的基础上进行的,因此在循环了10000次之后,这段代码所占的资源要比上面的小得多

StringBuffer

有了StringBuilder类为什么还需要StringBuffer类。查看源码就知道,StringBuilder和StringBuffer类拥有的成员属性以及成员方法基本相同,区别是StringBuffer类的成员方法前面多了一个关键字:synchronized,不用多说,这个关键字是在多线程访问时起到安全保护作用的,也就是说StringBuffer是线程安全的


对于

String a = "hello" + "world"

在编译期间,会自动将其拼接成helloworld

转载请注明:叉烧店 » String,StringBuilder,StringBuffer区别

喜欢 (0)
发表我的评论
取消评论

CAPTCHA Image
Reload Image
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址