zoukankan      html  css  js  c++  java
  • 面试必知:String、StringBuilder、StringBuffer的区别

    你知道String、StringBuilder、Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗?

    别急,这篇文章带你解决这些问题。

    可变性

    首先,String是字符串,我们一般这样声明:

    String s = "abc";
    

    String类使用被final修饰的char数组来存储字符串的内容,它的一大特性就是不可变,怎么理解这个不可变呢?

    我们知道,一个类被final修饰,那么这个类无法被继承,方法也不能被重写,属性也不能改变。

    看看这段代码:

    String s = "abc";
    s = s+1;
    System.out.print(s);  // 输出: abc1
    

    表面上s的值由abc变成了abc1,其实并不是这样,而是在进行+1的操作时,重新创建了一个新的String对象,并给它赋值为abc1.

    StringBuilder和StringBuffer这俩货同样用char数组存字符串,但并没有用final修饰,因此它们创建的内容的可变的,并不像String那样创建了一个新的对象。

    线程安全性

    String是常量,自然没有线程不安全的问题,但是StringBuilder和StringBuffer是变量,就需要考虑这个。

    我们查看StringBuilder的源码:

        @Override
        public int compareTo(StringBuilder another) {
            return super.compareTo(another);
        }
    
        @Override
        public StringBuilder append(Object obj) {
            return append(String.valueOf(obj));
        }
    

    再看看StringBuffer的:

        @Override
        public synchronized int compareTo(StringBuffer another) {
            return super.compareTo(another);
        }
    
        @Override
        public synchronized int length() {
            return count;
        }
    
        @Override
        public synchronized int capacity() {
            return super.capacity();
        }
    

    发现没有,StringBuffer的每个方法都加了synchronized同步锁,保证了线程安全,而StringBuilder没加。

    性能比较

    StringBuilder>StringBuffer>String

    String作为常量,每次更改都创建新对象,性能最低;StringBuilder没有StringBuffer身上的锁,因此性能更好。

    总结

    • 如果是单线程场景,因为不用考虑线程安全,推荐使用StringBuilder
    • 如果是多线程场景,推荐使用StringBuffer
    • 如果操作的数据不需要改变,使用String即可。

  • 相关阅读:
    .netcore返回HellowWorld四种方式(管道配置,管道扩展方法,中间件,IStartupFilter 使用中间件的升级扩展)
    Mysql分页大数据量查询优化
    swagger发布本地的调试的时候没事,发布服务器提示500 : {"Message":"出现错误。"}
    DBeaver的使用(impala和数据库)
    mysql远程连接问题
    java+thymeleaf-layout-dialect+thymeleaf的使用
    springboot+thyemeleaf+swagger项目的创建和问题的解决
    ffmpeg实践
    Camera.main
    python双曲线拟合
  • 原文地址:https://www.cnblogs.com/bronya0/p/14433310.html
Copyright © 2011-2022 走看看