String,StringBuffer以及StringBuilder之间的区别

news2024/11/30 18:30:41

文章目录

  • 区别一:字符串内容是否可变
  • 区别二:线程安全
  • 区别三:性能
  • 区别四:使用场景

“String,StringBuffer以及StringBuilder之间的区别的区别” 这个问题是面试官比较常问的一个Java基础题。在日常的开发中,也常常会用到它们。

区别一:字符串内容是否可变

String不可变,StringBuffer、StringBuilder可变

String类是不可变类,对String类的修改实际上是生成了一个新的对象,并将原来的String类对象指向这个对象;意思就是它本身并没有改变,只是它的引用变了。String不可修改指的是对象本身不可修改,而不是引用不可修改。

StringBufffer 和 StringBuilder 是可变的,它是通过提供的append,insert,reverse,setCharAt,setLength等方法来改变这个字符串;它的改变不是重新生成对象,而是对原字符串进行处理。

代码示例:

在这里插入图片描述

为什么String不可变?

我们可以来看下String的源码

在这里插入图片描述
从源码中我们可以得知,String 类以及它的成员变量都是用关键字 final 修饰的,这里扩展一下final关键字的知识点 final 关键字修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是基本类型则初始化后不能被改变

所以我们得出String不可变的原因有两点:

1.被 final 修饰导致其不能被继承,因此无法有子类能继承它,避免了子类破坏String的不可变
2.保存字符串的数组被 final 修饰且为私有的,并且String 类没有向外提供修改这个字符串的方法

为什么StringBuffer和StringBuilder可变?

主要是得益于它们对外提供/暴露的append等方法。append的原理就是改变了StringBuffer或者StringBuilder内部的字符数组内容,因此是可变的

源码:
在这里插入图片描述
在这里插入图片描述

区别二:线程安全

StringBuffer是线程安全的,StringBuilder是线程不安全的

String就不用说了,它肯定是线程安全的,因为它是不可变的。

因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,用关键字synchronized 修饰后,就是加锁同步,能保证同一时刻只能有一个线程访问共享资源。而 StringBuilder 并没有。从下图中它们各自的源码中就可以看出来了

在这里插入图片描述

区别三:性能

StringBuilder >> StringBuffer >> String

因为StringBuilder 是没有对方法加锁同步的,既然 StringBuffer的所有公开方法都是同步的,因此StringBuilder 的性能要远远大于StringBuffer。

代码示例:
在这里插入图片描述

区别四:使用场景

String:适用于少量的字符串操作的情况。

StringBuffer:适用于多线程下进行大量操作的情况。

StringBuilder:适用于单线程下进行大量操作的情况。

点赞、收藏不迷路!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1255786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue轻松入门,附带学习笔记和相关案例

目录 一Vue基础 什么是Vue? 补充:mvvm框架 mvvm的组成 详解 Vue的使用方法 1.直接下载并引入 2.通过 CDN 使用 Vue 3.通过npm安装 4.使用Vue CLI创建项目 二插值表达式 什么是插值表达式? 插值表达式的缺点 解决方法 相关代…

Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式

By: Ailson Jack Date: 2023.11.26 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/165.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…

MyBatis Generator使用总结

MyBatis Generator使用总结 介绍具体使用数据准备插件引入配置条件构建讲解demo地址 介绍 MyBatis Generator (MBG) 是 MyBatis 的代码生成器。它能够根据数据库表,自动生成 java 实体类、dao 层接口(mapper 接口)及m…

OpenCV检测圆形东西是否存在缺口?

文章目录 前言一、试过的方法二、最终使用的方法1.先极坐标变换2.计算斜率 总结 前言 想了挺久,一直没解决这个问题。后面勉强解决了。 一、试过的方法 1.想用圆度来解决,后来发现圆度差值很小,完整的圆圆度0.89,然后有缺角的圆圆…

性能测试【二】:nmon的常用操作

性能测试【二】:nmon的常用操作 1、nmon介绍说明2、软件下载2.1、Nmon下载地址2.2、Nmonanalyser下载地址 3、nmon使用3.1、将nmon上传至/usr/local/src目录下,并解压3.2、解压后根据自己系统的实际版本查找相应的使用命令,并给命令赋予可执行…

springboot函数式web

1.通常是路由(请求路径)业务 2.函数式web:路由和业务分离 一个configure类 配置bean 路由等 实现业务逻辑 这样实现了业务和路由的分离

Yolov8训练自己的数据集过程

做自己第一次使用Yolov8的记录。 1、下载代码 官网的我没找到对应的视频教程,操作起来麻烦,一下这个链接的代码可以有对应bilibili教程:完整且详细的Yolov8复现训练自己的数据集 选择这个下载: 2、安装需要的包: 按…

2018年10月16日 Go生态洞察:App Engine新Go 1.11运行时发布

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

项目中启用Log4j2日志框架

在实际的项目开发中,日志十分重要,无论是记录运行情况还是定位线上问题,都离不开对日志的分析。日志记录了系统行为的时间、地点、状态等相关信息,能帮助我们了解并监控系统状态,并在发生错误或者接近某种危险状态时能…

emu8086汇编语言输出“Hello World!“

输出Hello world 首先我们尝试用C语言来实现该功能&#xff1a; #include <stdio.h>int main() {printf("Hello World!"); // 输出“Hello World!”return 0; } 将这行代码翻译成汇编语言... ; DS 数据段定义 DATA SEGMENTZIFU DB Hello World!,$ ;字符串…

歌曲《兄弟情深》:歌手荆涛歌曲中的真挚情感

在人生的道路上&#xff0c;有时我们会遇到迷茫、失落、困惑等种种情境。而在这些时刻&#xff0c;身边有一个真挚的兄弟&#xff0c;其意义是无法估量的。歌手荆涛演唱的《兄弟情深》即是对这种深厚情感的美妙歌颂。 一、迷茫时的指引 “当我迷茫时&#xff0c;有你帮目标重新…

安卓系统修图软件(二)

晚上好&#xff0c;自上一次博主分享修图软件之后&#xff0c;今天博主将带来第二期安卓修图软件的推送&#xff0c;个个都是宝藏&#xff0c;建议大家赶紧体验哦。 1.canva可画 如果说有一款手机APP可以与PS媲美&#xff0c;那么一定非canvas莫属。这款强大的修图软件支持海报…

【面试题】介绍一下类加载过程,什么是双亲委派模型

背景 java 文件在运行之前&#xff0c;必须经过编译和类加载两个过程&#xff1a; 编译过程&#xff1a;把 .java 文件 编译成 .class 文件类加载过程&#xff1a;把 .class 文件加载到 JVM 内存里&#xff0c;加载完成后就会得到一个 class 对象&#xff0c;我们就可以使用 n…

将本地项目上传到gitee

本文详细介绍如何将本地项目上传到gitee 1.登录gitee创建一个与本地项目名相同的仓库 2.进入本地项目所在路径&#xff0c;打开Git Bash 3.执行初始化命令 git init4.添加远程仓库 4.1 点击复制你的HTTPS仓库路径 4.2 执行添加远程仓库命令 git remote add origin 你的…

顺序查找(线性查找),折半查找(二分或对分查找),分块查找(索引顺序查找)

文章目录 查找查找的基本概念 线性表的查找一、顺序查找&#xff08;线性查找&#xff09;二、折半查找&#xff08;二分或对分查找&#xff09;三、分块查找&#xff08;索引顺序查找&#xff09; 查找 查找的基本概念 查找表 查找表是同一类型的数据元素&#xff08;或记录…

C#文件操作File类vsFileInfo类和Directory类vsDirectoryInfo类

目录 一、File类vsFileInfo类 1.File类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 2.FileInfo类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 二、 Directory类vsDirectoryInfo类 1.Directory类 &#xff08;…

怎么在哔哩哔哩上引流?分享五个b站引流推广必备的几个方法

大家好&#xff0c;我是 小刘今天为大家分享的是抖音引流知识分享&#xff0c;今天咱们聊一些干货知识&#xff0c;绝对会让你们有一个重新的认知。哔哩的流量大&#xff0c;是毋庸置疑的&#xff0c;哔哩也是最早一批短视频平台。哔哩于2017年上线&#xff0c;一开始主要是通过…

基于SSM的企业订单跟踪管理系统(有报告)。Javaee项目

演示视频&#xff1a; 基于SSM的企业订单跟踪管理系统&#xff08;有报告&#xff09;。Javaee项目 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringM…

Kotlin学习——kt入门合集博客 kt里的委派模式Delegation kt里的特性

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

2023年【N1叉车司机】新版试题及N1叉车司机作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机新版试题参考答案及N1叉车司机考试试题解析是安全生产模拟考试一点通题库老师及N1叉车司机操作证已考过的学员汇总&#xff0c;相对有效帮助N1叉车司机作业考试题库学员顺利通过考试。 1、【多选题】《中华…