Javase | StringBuffer、StringBuilder

目录:

    • 思考:进行字符串的频繁拼接,会有什么问题?
    • 思考:为什么StringBuffer是可变的?StringBuffer是可追加字符串的?
    • StringBuffer
    • 思考:如何优化StringBuffer的性能?
    • StringBuilder
    • StringBuffer 和 StringBuilder的区别?

思考:进行字符串的频繁拼接,会有什么问题?

  • 我们在实际的开发中,如果需要进行字符串的频繁拼接,会有什么问题?

  • Java中的字符串不可变的,一经创建,便不可修改,每一次拼接都是产生新的字符串,这样会占用大量的的方法区内存,同时会造成内存空间的浪费

    例子如:

      String s = "abc";s = s +"hello";/*就以上代码就导致“方法区”中的“字符串常量池”中创建了三个“字符串对象”,分别为: "abc"、“hello”、“abchello”。此番操作占用大量的方法区内存,同时也造成内存空间的浪费*/
    
  • 如果要进行大量的字符串的“拼接操作”,可以用JDK自带的:
    Java.lagn.StringBuffer(字符串缓冲区对象)
    StringBufferString底层都是byte[ ]数组,但String底层是是final修饰的byte[ ]数组,是不可变的。而StringBuffer底层是可变的byte[ ]数组,自然是可追加的,是可变的。)

思考:为什么StringBuffer是可变的?StringBuffer是可追加字符串的?

  • 首先,StringBufferString底层都是byte[ ]数组,但String的的byte[ ]数组有final 关键字修饰,这也是它是 不可变的 的原因,这导致了String字符串一经创建,便不可修改
  • StringBuffer ( 字符串缓冲区 对象 )的 byte[ ]数组没有final 关键字修饰的,是可对数组进行扩容的,因而StringBuffer可变的,同时可通过append( )方法向StringBuffer中追加字符串。

StringBuffer

  • StringBuffer字符串缓冲区(对象),底层实际上是一个 byte[ ]数组
    StringBuffer中放字符串,实际上是放到byte数组中。StringBuffer的byte[ ]数组是没有final关键字修饰的,数组是可扩容的,因而可以通过append( Object o )方法StringBuffer追加字符串。

  • StringBuffer的默认初始化容量16。即底层的byte[ ]数组的初始化容量/长度为16

  • StringBuffer可用append( Object o )方法进行字符串数据的追加。在追加时,如果byte数组满了,会自动扩容

  • StringBuilder的方法中都有synchronized关键字修饰。表示StringBuffer在多线程环境下运行安全 的。

  • 拓展:
    其实String底层也是byte[ ]数组,但其前面有一个final关键字修饰,是不可变的,导致字符串也是不可变一经创建,变不可修改。
    StringBuffer底层是一个可变的byte[ ]数组,自然其是可变的,可追加字符串数据的。

    例子如:

     		/*创建一个(默认)初始化容量为16的byte[]数组(字符串缓冲区对象)“符串缓冲区”底层为: byte[]数组,可实现字符串的追加,而不会因为“字符串对象”的频繁		  增加而占用大量的内存空间。*/StringBuffer stringBuffer = new StringBuffer();/*往“字符串缓冲区”中追加字符串 (因为其底层是byte[]数组,避开了String不可变的特		  性,能追加字符串数据)*/// append方法底层在进行追加的时候,如果byte数组满了,会自动扩容。stringBuffer.append("a");stringBuffer.append("b");stringBuffer.append("c");stringBuffer.append(3.14);stringBuffer.append(true);stringBuffer.append(100L);//StringBuffer重写了toString()方法,输出的StringBuffer中的字符串本身System.out.println(stringBuffer); //abc3.14true100
    

思考:如何优化StringBuffer的性能?

  • 在创建 StringBuffer 的时候尽可能给定一个较大的初始化容量。较大的初始化容量能减少底层数据的扩容次数提高StringBuffer的性能

  • 给一个合适的初始化容量,可以提高程序的执行效率

    例子如:

       //指定初始化容量的StringBuffer对象(字符串缓冲区对象)//创建指定字节数组容量为100的StringBuffer对象/***  给一个合适的初始化容量,可以提高程序的执行效率 (优化StringBuffer的性能)*/StringBuffer stringBuffer = new StringBuffer(100);stringBuffer.append("apple");stringBuffer.append("hello");stringBuffer.append(123);//输出StringBuffer对象System.out.println(stringBuffer); //applehello123
    

StringBuilder

  • StringBuilder字符串生成器(对象),底层也是是一个 byte[ ]数组
  • StringBuilder中放字符串,实际上是也是存放到byte数组中。
  • StringBuilder初始化容量是16,即底层的byte[ ]数组的初始化容量/长度为16
  • StringBuffer可用append( Object o )方法进行字符串数据的追加。在追加时,如果byte数组满了,会自动扩容
  • StringBuilder的方法中都没有 synchronized关键字修饰。表示StringBuilder在多线程环境下运行不安全 的。

StringBuffer 和 StringBuilder的区别?

  • StringBuilder的方法中 都“有”synchronized 关键字修饰。表示StringBuffer在多线程环境下运行安全 的。
    StringBuilder的方法中 都“没有”synchronized 关键字修饰。表示StringBuilder在多线程环境下运行不安全 的。
  • StringBuffer线程安全 的,StringBuilder非线程安全 的。

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

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

相关文章

IDEA控制台取消悬浮全局配置SpringBoot配置https

IDEA控制台取消悬浮 idea 全局配置 SpringBoot(Tomcat) 配置https,同时支持http 利用JDK生成证书 keytool -genkey -alias httpsserver -keyalg RSA -keysize 2048 -keystore server.p12 -validity 3650配置类 Configuration public class TomcatConfig {Value(&quo…

数仓问答篇(一)

数仓架构(即席查询) 总体来说,Hadoop架构在数据量较低的情况下,运行速度远不及MPP架构,但数据量一旦超过某个量级,Hadoop架构在吞吐量方面将非常有优势。有些大数据数据仓库产品也采用混合架构,…

【数据结构】——排序的相关习题

目录 一、选择填空判断题题型一(插入排序——直接插入排序)题型二(插入排序——折半插入排序)题型三(插入排序——希尔排序)题型四(交换排序——冒泡排序)题型五(交换排序…

时空预测 | 线性时空预测模型、图时空预测

目录 线性时空预测图时空预测 线性时空预测 这篇文章在时空预测领域,搭建了一个简单高效的线性模型,且使用了channel-independence的方式进行建模。 模型的整体结构如下图所示,是一个级联的结构。输入分为三个部分:temporal embed…

2核2G3M带宽服务器腾讯云和阿里云价格、性能对比

2核2G云服务器可以选择阿里云服务器或腾讯云服务器,腾讯云轻量2核2G3M带宽服务器95元一年,阿里云轻量2核2G3M带宽优惠价108元一年,不只是轻量应用服务器,阿里云还可以选择ECS云服务器u1,腾讯云也可以选择CVM标准型S5云…

【网络安全】图解 Kerberos:身份认证

图解 Kerberos:身份认证 1.什么是 Kerberos ?2.Kerberos 基本概念2.1 基本概念2.2 KDC 3.Kerberos 原理3.1 客户端与 Authentication Service3.2 客户端与 Ticket Granting Service3.3 客户端与 HTTP Service Kerberos 是一种身份认证协议,被…

Java事件机制简介 内含面试题

面试题分享 云数据解决事务回滚问题 点我直达 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮…

预推免,保研------长安大学保内,附加分面试准备【记录帖】

🚀长安大学——人工智能系——程惠泽 🚌前六学期专业排名:9/82 🚌信息门户GPA:3.94 🚌平均成绩:89.83 🚌加权成绩:89.15 / ☁️本人比较菜,只能保研本校&…

centos 端口被占用的快速排查方式

问题笔记 centos 端口被占用的快速排查方式 centos 端口被占用的快速排查方式 这里说一个我刚刚遇到的问题,解决步骤用来记录,方便以后自己查询。 nginx配置完index.html测试文件,发现一直显示的404页面。 我跑到服务器上想重启一下nginx …

强大易用的开源 建站工具Halo

特点 可插拔架构 Halo 采用可插拔架构,功能模块之间耦合度低、灵活性提高。支持用户按需安装、卸载插件,操作便捷。同时提供插件开发接口以确保较高扩展性和可维护性。 ☑ 支持在运行时安装和卸载插件 ☑ 更加方便地集成三方平台 ☑ 统一的可配置设置表…

《自然语言处理(NLP)的最新进展:Transformers与GPT-4的浅析》

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

2023年9月11日-9月16日(上午熟悉公司代码,周一到周五晚上优先工作所急视频教程,其他业余时间进行ue视频教程,为独立游戏做准备)

按照规划,上午熟悉公司源码,下午进行filament和ue渲染,晚上写工作代码。回家后泛读pbrt或者其他书籍催眠。 业余学习ue的各种视频教程,为独立游戏做准备(公司也实行末位淘汰,给自己留条后路)。累…

openGauss学习笔记-65 openGauss 数据库管理-创建和管理数据库

文章目录 openGauss学习笔记-65 openGauss 数据库管理-创建和管理数据库65.1 前提条件65.2 背景信息65.3 注意事项65.4 操作步骤65.4.1 创建数据库65.4.2 查看数据库65.4.3 修改数据库65.4.4 删除数据库 openGauss学习笔记-65 openGauss 数据库管理-创建和管理数据库 65.1 前提…

解决deepspeed框架的bug:不保存调度器状态,模型训练重启时学习率从头开始

deepspeed存在一个bug,即在训练时不保存调度器状态,因此如果训练中断后再重新开始训练,调度器还是会从头开始而不是接着上一个checkpoint的调度器状态来训练。这个bug在deepspeed的github中也有其他人提出:https://github.com/mic…

k8s中的容器

目录 容器容器的状态容器的重启策略pause容器init容器 容器 容器的状态 Running(运行中):容器正在运行并且正常工作。Waiting(等待中):容器正在等待某些条件满足,例如等待其他容器就绪、等待网…

微信小程序——如何获取到输入框的值

在微信小程序中&#xff0c;可以通过以下几种方式来获取输入框的值&#xff1a; 使用 bindinput 绑定输入事件&#xff0c;通过 event.detail.value 获取输入框的值。具体操作如下&#xff1a; <input bindinput"onInput" placeholder"请输入内容">…

Google 开源库Guava详解(集合工具类)—Maps、Multisets、Multimaps

一、Maps Maps有许多很酷的实用程序&#xff0c;值得单独解释。 1、uniqueIndex Maps.uniqueIndex&#xff08;Iterable&#xff0c;Function&#xff09;解决了一个常见的情况&#xff0c;即有一堆对象&#xff0c;每个对象都有一些唯一的属性&#xff0c;并希望能够根据该…

Neo4j 基本语法

一、基本语法 1、新建节点 &#xff08;1&#xff09;基本语法&#xff1a; () 代表节点 示例&#xff1a; CREATE (u:User {uid:970939424 }) // 节点类型为User&#xff0c;属性值为uid970939424CREATE (u:Round {rid:7194842697444819113 }) // 节点类型为Rou…

【广州华锐互动】AR技术在配电系统运维中的应用

随着科技的不断发展&#xff0c;AR(增强现实)技术逐渐走进了我们的生活。在电力行业&#xff0c;AR技术的应用也为巡检工作带来了许多新突破&#xff0c;提高了巡检效率和安全性。本文将从以下几个方面探讨AR配电系统运维系统的新突破。 首先&#xff0c;AR技术可以实现虚拟巡检…

数据仓库-核心概念

数据仓库 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。它是单个数据存储&#xff0c;出于分析性报告和决策支持目的而创建。为需要业务智能的…