String,StringBuilder,StringBuffer三者的区别

String,StringBuilder,StringBuffer三者的区别,发现自己确实对这方面的知识不是很了解.所以学习了一下做个笔记.

String

  • String 类是一个常量,String类本身和其中存储字符的数组都是用final关键字修饰的,所以不能被继承
    /** The value is used for character storage. */
    private final char value[];

String str="hello world"和String str=new String(“hello world”)的区别

public class Main {

    public static void main(String[] args) {
        String string1 = "hello word";
        String string2 = new String("hello world");
        String string3 = "hello word";
        String string4 = new String("hello world");
        System.out.println(string1 == string2);
        System.out.println(string1 == string3);
        System.out.println(string2 == string4);
    }
}

上面代码的输出结果为:

false

true

false

我们发现 同样都都是"helllo world" string1 和 string3 相等.是因为string1 和 string3 都是赋值为一个字面常量"hello world",在JVM运行时候,会在常量池里寻找是否已经存在相同的常量,如果存在便直接将引用指向已有常量,否则就创建一个常量,并且将引用指向他,对于string2 和string4来说,两者都是采取了new 来创建的,是两个不同的对象,所以不相等.

StringBuilder

在第二点中,我们看到String是一个final类,打开StringBuilder,我们发现StringBuilder类是AbstractStringBuilder的子类,在AbstractStringBuilder类中,我们看到与String不同,StringBuilder存储字符的数组是可变的

  /**
     * The value is used for character storage.
     */
    char[] value;

StringBuilder和String 区别

对于实际应用来说 假设有如下代码

public class Main {

    public static void main(String[] args) {
        String string = "";
        for (int i = 0; i < 1000; i++) {
            string += "A";
        }


        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 1000; i++) {
            stringBuilder.append("A");
        }
    }
}

上述代码进行了一个1000次的循环,每次在字符串string后面追加一个字符A,无论使用的是String,还是StringBuilder,最后的结果都为长度为1000的字符全为A的字符串.而不同的是,如果使用StringBuilder,append操作是在原有的对象基础上进行的,而使用String每次循环都会新建一个StringBuilder对象,进行append操作,通过toString方法返回String对象,如果这些对象没有被回收会浪费大量资源,

StringBuilder和StringBuffer区别

对比StringBuilder和StringBuffer源码,我们发现在StringBuffer中很多方法都加上了synchronized关键字,所以StringBuffer是线程安全的,不过相应的,在提升了安全的同时对资源的消耗也会增大

        /**
         * StringBuffer append方法
         */
        @Override
        public synchronized StringBuffer append (String str){
            toStringCache = null;
            super.append(str);
            return this;
        }
        
        /**
         * StringBuilder append方法
         */

        @Override
        public StringBuilder append (String str){
            super.append(str);
            return this;
        }

结论

三个类应当根据不同的情况来进行选择使用:

当字符串相加操作或者改动较少的情况下,建议使用 String str="hello"这种形式

当字符串相加操作较多的情况下,建议使用StringBuilder

如果采用了多线程,则使用StringBuffer。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值