详解java中String、StringBuilder、StringBuffer的区别
作者:公众号勾玉技术 发布时间:2023-06-17 06:03:23
你知道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即可
来源:https://www.cnblogs.com/bronya0/p/14433310.html


猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧~<resultMap id="ParentMap" type="
- 在笔试编程过程中,关于数据的读取如果迷迷糊糊,那后来的编程即使想法很对,实现很好,也是徒劳,于是在这里认真总结了Java Scanner 类
- 本文实例讲述了C#使用GDI绘制直线的方法。分享给大家供大家参考。具体实现方法如下:Point p1=new Point(200,200);
- Menustrip控件是一个菜单栏控件,可以加载菜单栏,在很多系统中都有用到。本文介绍下该控件的一些属性的常用方式。在页面FormMain_
- 1.简介本教程将介绍如何在Spring Security中设置身份验证提供程序,与使用简单UserDetailsService的标准方案相比
- 前言最近在学习C# Socket相关的知识,学习之余,动手做了一个简单的局域网聊天器。有萌生做这个的想法,主要是由于之前家里两台电脑之间想要
- 本文实例讲述了winform绑定快捷键的方法。分享给大家供大家参考。具体分析如下:第一种:Alt + *(按钮快捷键)在大家给button、
- 在Controller层时,往往会需要校验或验证某些操作,而在每个Controller写重复代码,工作量比较大,这里在Springboot项
- Android 解决TextView排版参差不齐的问题在app中,展示数据时,里面有汉字、数字、特殊字符时,由于全角、半角问题导
- 本文实例讲述了C#遍历操作系统下所有驱动器的方法。分享给大家供大家参考。具体分析如下:这里先通过DriveInfo类的GetDrivers方
- 下载和上传附件、发送短信和发送邮件,都算是程序中很常用的功能,之前记录了文件的上传和下载还有发送短信,由于最近比较忙,邮件发送的功能就没有时
- 一、定时任务1、cron表达式语法:秒 分 时 日 月 周 年(其中“年”Spring不支持,也就是说在spring定时任务中只能设置:秒
- 实例如下:import java.util.ArrayList;import java.util.HashSet;import java.u
- 我就废话不多说啦,还是直接看代码吧!/** * 设置数据库是否自动提交事务 * @param flag
- 这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 用过ios的都知道ios上输入法关闭的同时会自动关闭输入框,那么在android上如何实现监听输入法弹出和关闭呢?本篇文章就为你提供了一种可
- 废话不多说了,直接给大家贴代码了,具体代码如下所述:/*** 把一个View的对象转换成bitmap*/private Bitmap get
- 前言Inotify会对工程内的所有文件夹设置”watch handle”。不幸的是,Linux默认的watch handle的限值不能满足实
- 本人工作有一个月多了。对于android很多东西,都有了新的了解或者说真正的掌握。为了让更多的像我这样的小白少走弯路,所以我会坚持将我在工作
- 实例如下所示:public class WebServiceHelper { /// <summary>