你知道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即可。

无意中发现了一位清华大佬的算法刷题笔记,关注公众号『勾玉技术』回复『清华算法』领取

面试必知:String、StringBuilder、StringBuffer的区别的更多相关文章

  1. String Stringbuilder Stringbuffer的区别

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  2. java中string stringbuilder stringbuffer 的区别

    1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a&qu ...

  3. String StringBuilder StringBuffer区别

    String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ...

  4. Java面试必知必会:基础

    面试考察的知识点多而杂,要完全掌握需要花费大量的时间和精力.但是面试中经常被问到的知识点却没有多少,你完全可以用 20% 的时间去掌握 80% 常问的知识点. 一.基础 包括: 杂七杂八 面向对象 数 ...

  5. Java面试必知必会(扩展)——Java基础

    float f=3.4;是否正确? 不正确 3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失: 因此需要强制类型转换: 方式一:float f=(float)3.4 方式二:float ...

  6. String, StringBuilder, StringBuffer问题

    1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...

  7. 转载 java基础题(面试必知)

    1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包 ...

  8. JDK源码分析系列---String,StringBuilder,StringBuffer

    JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ...

  9. java中String StringBuilder StringBuffer比较和效率(性能)测试

    string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...

  10. JAVA中String与StringBuffer的区别

    String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结. 在java中有3个类来负责字符的操作. 1.C ...

随机推荐

  1. 自定义tree

    function YpTreeMenu(ypTreeMenu,treeObj) { this.ypTreeMenu=ypTreeMenu; this.treeObj=treeObj; this.tre ...

  2. java封装详解

    三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能 ...

  3. 3. Linear Regression with Multiple Variables

    前面还有一章主要讲解,基本的Linear Algebra线性代数的知识,都比较简单,这里就直接跳过了. Speaker: Andrew Ng 1. Multiple featues 训练集的特征变成了 ...

  4. 最短Hamilton路径(状压dp)

    最短Hamilton路径实际上就是状压dp,而且这是一道作为一个初学状压dp的我应该必做的题目 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 ...

  5. Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) A. Kids Seating (规律)

    题意:给你一个正整数\(n\),在\([1,4n]\)中找出\(n\)个数,使得这\(n\)个数中的任意两个数不互质且不能两两整除. 题解:这题我是找的规律,从\(4n\)开始,往前取\(n\)个偶数 ...

  6. PowerShell多任务

    代码 foreach ($server in $servers) { $running = @(Get-Job | Where-Object { $_.State -eq 'Running' }) i ...

  7. Python3.5 配置MySql数据库连接

    #!coding:utf-8 import pymysql ''' Python3之后不再支持MySQLdb的方式进行访问mysql数据库: 可以采用pymysql的方式 连接方式: 1.导包 imp ...

  8. CF1474-A. Puzzle From the Future

    CF1474-A. Puzzle From the Future 题意: 有两个由\(0,1\)组成的.长度相等字符串\(a, b\),两个字符串按位相加得到一个新的字符串\(s\),对\(s\)取\ ...

  9. Kubernets二进制安装(13)之部署Flannel

    Flannel简介 ​ Flannel是CoreDNS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址 ...

  10. codeforces 903D

    D. Almost Difference time limit per test 2 seconds memory limit per test 256 megabytes input standar ...