Java基础---String、StringBuilder和StringBuffer的区别

news2024/11/17 0:53:19

目录

典型回答

String的"+"是如何实现的

StringBuffer和StringBuilder

不要在for循环中使用+拼接字符串


  • 典型回答

  • 本质上都是char[]字符数组的实现
  • 在Java9之后,String类的实现改用byte数组存储字符串
  • 使用final关键字修饰字符数组来保存字符串,String是不可变的
  • 没有使用final关键字修饰,StringBuilder和StringBuffer是可变的
  • String中的对象是不可变的,也就可以理解为常量,线程安全
  • StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,是线程安全的
  • StringBuilder并没有对方法进行加同步锁,是非线程安全的
  • 每次要对String类型进行改变时,都会生成一个新的String对象,然后将指针指向新的String对象
  • StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用
  • 相同情况下使用StringBuilder相比使用StringBuffer仅能获得10%-15%左右的性能提升,但却要冒多线程不安全的风险
  • 使用场景:
    • 操作少量的数据用String,但是常改动内容且操作数据多情况下最好不要用String,因为每次生成中间对象性能会降低
    • 单线程下操作大量的字符串用StringBuilder,虽然线程不安全但是不影响
    • 多线程下操作大量字符串,且需要保证线程安全,则用StringBuffer
  • String的"+"是如何实现的

  • 使用+拼接字符串,其实只是Java提供的一个语法糖,那么就来解一解这个语法糖,看看他的内部原理到底是如何实现的
  • 还是这样一段代码
  • 把他生成的字节码进行反编译,看看结果

  • 反编译后的内容如下,反编译工具为jad

  • 通过查看反编译以后的代码,可以发现,原来字符串常量在拼接过程中,是将String转成了StringBuilder后,使用其append方法进行处理的
  • 那么也就是说,Java中的+对字符串的拼接,其实现原理是使用StringBuilder.append
  • StringBuffer和StringBuilder

  • 与 String 不同,字符数组中不一定所有位置都已经被使用,它有一个实例变量,表示数组中已经使用的字符个数,定义如下:

  • 其append源码如下:

  • 该类继承了`AbstractStringBuilder`类,看下其`append`方法:

  • append会直接拷贝字符到内部的字符数组中,如果字符数组长度不够,会进行扩展
  • 不要在for循环中使用+拼接字符串

  • 前面分析过,其实使用`+`拼接字符串的实现原理也是使用的`StringBuilder`,那为什么不建议在for循环中使用呢?

  • 反编译后代码如下:

  • 可以看到,反编译后的代码,在 for 循环中,每次都是 new 了一个 StringBuilder ,然后再把 String 转成 StringBuilder ,再进行 append
  • 而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费
  • 所以,阿里巴巴Java开发手册建议:循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展;而不要使用 +

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

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

相关文章

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)四:用户注册界面及对应功能实现

一、本章内容 本章实现用户注册功能,包括短信注册界面、邮箱注册界面、短信注册修改接口、邮箱注册修改接口等相关内容,实现用户注册的完整流程。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管理系统合…

打造 API 接口的堡垒

前言 伴随互联网革命快速创新发展,API 需求的日益剧增,针对 API 的攻击几乎遍布各个行业,据报道 2022 年全年平均每月遭受攻击的 API 数量超过 21 万,游戏、社交、电商、制造等行业依然是攻击者主要目标。例如社交软件某特&#…

cuda优化

希望用GPU解决更大的问题,更多的程序在同等的设备商运行 最大化单个kernel的运算强度, 最小化内存的操作时间 在第一步分析的时候,不要依赖直觉 类似CPU,单个线程处理这个事情,串行 把读取全局内存的地方合并以后…

7.2 文件系统的简单操作

7.2.1 磁盘与目录的容量 磁盘的整体数据是在superblock区块中,但是每个个别文件的容量在inode当中记载的。 df:列出文件系统的整体磁盘使用量; du:评估文件系统的磁盘使用量(常用在推估目录所占容量) d…

Postman是个好用的工具,不试一下?

忘了 postman 是被谁种草的,很长一段时间内 postman 都是我做接口测试的首选工具,之前也有小伙伴跟我安利过 IDEA 中的 RestfulToolkit 插件,但是一直没机会体验,最近抽空玩了一把,感觉在某些场景下还蛮不错的(不需要认…

互联网SaaS产品的账户体系应该如何设计-账户分析

在进行账户体系设计之前,需要先理清产品使用群体、付费群体,这两个统称为用户群体,还需要了解产品的使用场景、产品功能以及产品的商业模式。从产品战略顶层进行SaaS产品的用户体系设计。 我们首先对人的本质和价值进行深入的分析&#xff1b…

你的测试技术这么烂,不学几招怎么跳槽?

最近几年我一直担任着软件测试面试官的角色,正好过年回来,马上就要金三银四求职季了,所以想写点面试的经验分享给大家,希望能对大家有些帮助。碍于才疏学浅,又是理工出身,字里行间未免词不达意,…

ubuntu20.04 使用pip安装配置Pytorch

关于pytorch的安装,我之前其实写过一篇博客:解决问题:import torch失败和torch.cuda.is_available()返回false 但是那是在windows下的,在ubuntu双系统下好像情况有点不一样,但是所幸踩的坑不算多,这里总结如…

2023全云在线联合微软AIGC专场沙龙:人工智能与企业创新,促进创造力的数字化转型

6月29日,由全云在线平台和微软联合主办的人工智能与企业创新:促进创造力的数字化转型——2023AIGC微软专场沙龙在广州天河区正佳万豪酒店举行。 关于2023AIGC微软专场沙龙 GPT翻开了AGI新的一页,也翻开了各行各业的新篇章。 2022年11月30日…

当心僵尸:过时Linux内核的安全风险

导读设备年年新,内核永不换。早该被淘汰的Linux内核版本,依然阴魂不散地扎根在各种各样的设备中,驱动着这些设备如同《行尸走肉》的丧尸游荡在世界各地。 Linux内核安全漏洞是新闻头条常客。最近又有一个隐身十年之久的严重内核漏洞被曝光了…

layer做阻塞式弹出层的方法

今天遇到一个问题:文章来源地址https://www.yii666.com/article/301050.html?actiononAll layer弹出一个confirm提示窗,然后confirm还没有点击对应的按钮的时候,就已经执行了后续代码,我这里做出的判断是,是否需要进行…

vue新特性

vue3 ref、reactive toRefs setup ref reactive 实现了数据响应式,不能使用 ES6 解构,会消除响应特性。所以需要 toRefs 解构,使用时,需要先引入。 let me reactive({single:true,want:"暖的像火炉的暖男" }) //运…

小黑收到阿黄宴请潮汕牛肉火锅,跟淹哥包鹏拉面,明日飞新疆乌鲁木齐地窝堡的leetcode之旅:剑指 Offer II 016. 不含重复字符的最长子字符串

小黑代码&#xff08;与官方题解思路一致&#xff09; class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 字符串长度n len(s)# 定义双指针head 0tail 0# 窗口集合set_ set()# 结果变量result 0while tail < n:# 该字符不在集合里if s[tail] no…

【数据结构】队列——顺序实现+链式实现(带头结点+不带头结点)入队 出队 初始化 判空 双端队列 完整代码

文章目录 四 队列1.基本概念2.队列的顺序存储3.队列的链式实现3.1 定义3.2 带头结点3.2.1 初始化3.2.2 判空3.2.3 入队3.2.4 出队3.2.5 完整代码 3.3 不带头结点3.3.1 初始化3.3.2 入队3.3.3 出队3.3.4 完整代码 4.双端队列 四 队列 1.基本概念 定义 只允许在一端进行插入&…

代理服务器拒绝连接怎么办

在使用代理服务器时&#xff0c;有时我们可能会遇到代理服务器拒绝连接的问题。这种情况可能会阻止我们访问被封锁的内容或绕过地理限制。下面&#xff0c;我们来一起探讨一下。 1. 配置错误 代理服务器拒绝连接的一个常见原因是配置错误。请确保您已正确输入代理服务器的地址和…

64MHz 闪存STM32G0B1CEU6(STM32G0B1CCU6)STM32G0B1CBU6引脚配置图、32位微控制器

STM32G0B1 32位微控制器具有最高512KB嵌入式闪存和144kB RAM存储器。该器件采用48-UFQFPN 引脚封装。它支持USB全速主机/设备、集成USB Type-C控制器和收发器、FDCAN协议以及多达8个UART。 STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用&#xff0c;并可随时…

el-carousel和el-image组合实现swiper左右滑动图片,点击某张图片放大预览的效果

<template><el-carousel class"image-swiper" :height"100%" :indicator-position"swiperItems.length < 1 ? none : ":arrow"swiperItems.length < 1 ? never : "><el-carousel-item v-for"(a, $i) in s…

尚硅谷Docker实战教程-笔记06【Docker容器数据卷】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【理念简介、官网介绍、平台入门图解、平台架构图解】尚硅谷Docker实战教程-笔…

移动端H5实现自定义拍照界面

一、实现思路 手机端 H5 实现自定义拍照界面也可以使用 MediaDevices API 和 <video> 标签来实现。 首先&#xff0c;使用 MediaDevices.getUserMedia() 方法获取摄像头媒体流&#xff0c;并将其传递给 <video> 标签进行渲染。 接着&#xff0c;使用 HTML 的 <…

手把手教你搭建SpringCloudAlibaba之Sentinel注解SentinelResource

SpringCloud Alibaba全集文章目录&#xff1a; 零、手把手教你搭建SpringCloudAlibaba项目 一、手把手教你搭建SpringCloud Alibaba之生产者与消费者 二、手把手教你搭建SpringCloudAlibaba之Nacos服务注册中心 三、手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心 …