面试:一文搞懂String、StringBuilder、StringBuffer 区别
1、三者之间的区别
区别 | String | StringBuilder | StringBuffer |
---|---|---|---|
【值】 | 不可变 | 可变 | 可变 |
【效率 】 | 最低 | 最高 | 中等 |
【线程】 | 非线程安全 | 非线程安全 | 线程安全 |
不同点:StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象,而string类会产生新的对象。
2、String
String 是一个常量,是不可变的,所以对于每一次+=赋值都会创建一个新的对象,操作String很耗资源,所以性能最低。
通过源码可知:底层是一个由final修饰的字符串数组,这一点就验证了他的值不可变这一特性。
首先我们来看一个面试题:String str = new String(“abc”) 到底创建了几个对象?
首先String str是定义了一个字符串变量,并未产生对象,也就是不产生对象,那么只有后面的new String(“abc”)了才会产生对象。把它拆分成"abc"和new String(),首先在字符串常量池去寻找有没有"abc"这个字符串,没有就创建一个“abc”字符串对象在栈中,然后new String把这个字符串对象拷贝一份到堆中,返回这个对象的引用。所以一共产生两个对象。
3、StringBuilder和StringBuffer
首先他们最本质的区别就是:StringBuilder线程安全、StringBuffer 非线程安全。
最明显的共同之处:字符串拼接直接在字符串后追加
那我们来看一下这两个的append方法源码:
StringBuffer之所以是线程安全的,我们从底层源码中可以看到该类被synchronized同步块修饰。
4、效率高低
效率高低也就是他们的运行速度,或者说是执行速度,在这方面运行速度从快到慢为:
StringBuilder > StringBuffer > String
public class School {public static void main(String[] args) {long a = new Date().getTime();String cc = "";int n = 10000;for (int i = 0; i < n; i++) {cc+="."+i;}System.out.println("String使用的时间"+(System.currentTimeMillis()-a)/1000.0+"s");long s1 = System.currentTimeMillis();StringBuilder sb = new StringBuilder();for (int i = 0; i < n; i++) {sb.append("."+i);}System.out.println("StringBuilder使用的时间"+(System.currentTimeMillis()-s1)/1000.0+"s");long s2=System.currentTimeMillis();StringBuffer sbf = new StringBuffer();for (int i = 0; i < n; i++) {sbf.append("."+i);}System.out.println("StringBuffer使用的时间"+(System.currentTimeMillis()-s2)/1000.0+"s");}
}
Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
5、什么场景下使用呢?
- String:适用于少量的字符串操作的情况
- StringBuffer:在多线程情况下操作大量的数据推荐使用
- StringBuilder:在单线程情况下操作大量的数据推荐使用
最后
如果你觉得DT_小白文章写的还不错,请微信搜索并关注「 Java云社 」微信公众号,和DT_小白一起学习Java、分布式、微服务、大数据技术,并且「 Java云社 」收集了大量的大厂面试题目集,等你来挖掘,为了提升自己的能力,实现技术能力的飞跃,每天定时更新超硬核技术干货,我在「 Java云社 」等您的加入,让我们共同学习吧!
面试:一文搞懂String、StringBuilder、StringBuffer 区别相关推荐
- 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 一文搞懂Win10和Win11区别在哪里!
Windows10于2015年7月发布,Windows11于2021年6月发布.除了视觉效果的差异外,在性能.稳定性和功能上也存在显着差异.因此,请您详细阅读以下内容,充分了解Windows 10和1 ...
- Java 源码出发彻底搞懂String与StringBuffer和StringBuilder的区别
导读 在Java中数据类型分为基本数据类型与引用数据类型.其中String属于引用类型,也是最常见的一种类型.但是我们对于String了解多少呢?String对象的内存地址?如何创建String对象? ...
- string 包含_一文搞懂String常见面试题,从基础到实战,到原理分析和源码解析...
01 string基础 1.1 Java String 类 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 1.2 创建字 ...
- string substring的用法_夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战...
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 一文搞懂ChatGPT相关概念和区别:GPT、大模型、AIGC、LLM、Transformer、羊驼、LangChain…..
ChatGPT横空出世后,伴随而来的是大量AI概念,这些概念互相之间既有联系也有区别,让人一脸懵逼,近期大鱼做了GPT相关概念的辨析,特此分享给你. 1)Transformer 2)GPT 3)Ins ...
- 一文搞懂 checkpoint 全过程
前言 前面我们讲解了 一文搞懂 Flink 处理 Barrier 全过程 和 一文搞定 Flink Checkpoint Barrier 全流程 基本上都是跟 checkpoint 相关.这次我们就具 ...
- python语言语句快的标记是什么_一文搞懂Python程序语句
原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...
- String ,StringBuilder,StringBuffer的区分
String ,StringBuilder,StringBuffer的区分 一.区别 String是字符串常量,而StringBuffer和StringBuilder是字符串变量.由String创建的 ...
最新文章
- 以前写的canvas 小游戏 贪吃蛇代码
- 解决神州数码校园上网客服端软件不能在Windows 7 (5956版)安装的问题
- BootStrap导航栏的使用
- 2020蓝桥杯省赛---java---A---2(既分数组)
- 关于ZipOupputStream添加压缩包常见问题
- 7-10 任务调度的合理性 (8 分)
- Python中的split()函数
- python中的doctest_Python测试框架doctest
- 4. ubuntu php composer
- 集合框架-ArrayList,Vector,Linkedlist
- 雄伟到惊世骇俗的黄羊山超级相控阵雷达
- powerdesign导出表结构
- yum install 命令报错Could not retrieve mirrorlist
- python一维数组定义,python如何定义数组
- 华东 1、华东 2、华北 1、华北 2、华南 1 服务器分别都在哪个城市
- C++中vector<int> nums和vector<int> nums的区别
- 期货客户开户手续费(期货开户最低手续费)
- tomcat轻量级服务器
- 集群使用calico的bgp+ipip混合模式部署
- 自己写的ajax通用 脚本
热门文章
- android gradle abi mips x86,NDK android Error:Expected caller to ensure valid ABI: MIPS
- $.post把表单对象传递过去_FormData对象
- 信息学奥赛一本通 1132:石头剪子布 | OpenJudge NOI 1.7 04
- 白细胞计数(信息学奥赛一本通-T1114)
- 56 SD配置-科目分配-定义物料科目设置组
- C语言 strcpy函数实现
- pix2pix, CycleGAN和pix2pixHD(没有公式,容易理解)
- 5-10transformation中部分函数使用
- react16.8+的生命周期
- boolean android.content.SharedPreferences.getBoolean(String key, boolean defValue)