Java基础(一)String、StringBuffer、StringBuilder

版权声明:本文为博主原创文章,转载请注明出处。欢迎关注公众号:Java笔记分享 (xiaosen_javashare) https://blog.csdn.net/qq_36447151/article/details/80392682
 

 

太长不看版

    字符串拼接速度:StringBuilder > StringBuffer > String

    StringBuilder 非线程安全 StringBuffer线程安全

正文

一、String类

    1、String类是不可变类,一旦String被创建,包含在这个对象中的字符串序列是不可变的,直至对象被销毁。

    

String类通过char数组存放字符串的。

/** 用于字符存储. */
    private final char value[];
/**
     * Initializes a newly created {@code String} object so that it represents
     * an empty character sequence.  Note that use of this constructor is
     * unnecessary since Strings are immutable.
     */
    public String() {
        this.value = "".value;
    }

在String的其他方法中,返回的都是new String(); 所以对String进行操作,返回的都是一个新的字符串。

2、字符串常量池

Java运行时会维护一个String Pool(String池),也叫字符串缓冲区。存储运行时产生的各种字符串,并且池中字符串不重复。

3、String对象创建原理

    1)当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个s在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则不在池中添加。

    2)Java中,只要是使用new关键字来创建对象,则一定会(在堆区)创建一个新的对象。

    3)使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,如果有就不会创建,但是绝对不会在堆栈区再去创建该String对象。

    4)使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。最后指向堆内存中的对象。

    @Test
    public void stringTest(){
        String s1 = "hello world";
        String s2 = "hello world";
        String s3 = new String("hello world");
        System.out.print(s1==s2);
        System.out.print(s1==s3);
        System.out.print(s2==s3);
    }

返回结果是true,false,false。

二、StringBuffer和StringBuilder

    都继承了AbstractStringBuilder类,实现方法和使用都一样。,唯一区别是,StringBuffer方法加synchronized关键字,线程安全,而StringBuilder是线程非安全的,但是StringBuilder字符串拼接速度比StringBuffer快

    StringBuilder相较于StringBuffer有速度的优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。

欢迎关注公众号:

猜你喜欢

转载自blog.csdn.net/qq_36447151/article/details/80392682