String,String Buffer 与 String Builder三者的区别

RK3568 OpenHarmony3.2 蓝牙模块AP6275S适配(已更新) OpenHarmony3.2 Release版默认是适配AP6275s这款蓝牙芯片的,但是打开蓝牙,发现无法扫描到设备、连接设备。目前平台soc为RK3568,根据项目要求,自定义外设。接下来将以解决bug为目的,学习和记录OpenHarmony平台下蓝牙模块的适配流程。RK809 CLK:32.768KHzUART1M1:与蓝牙模块通讯的串口:GPIO4_B6:GPIO4_A5WAKE_GPIO:未定义,硬件拉高1.8V: 未定义,悬空主要是打开串口,/dev/ttyS1,得到文件描述符fd。 阅读详情

一. 概述

Java中String是一个重要的类,它存在于java.lang包中,出于某种安全性考虑,String类被final修饰,致使它不能被继承,同时成员方法无法被重写。所以String类型的变量被称之为字符长常量,字符串长度不可变,且只能被赋值一次,不可修改。为了需要修改String类型的变量从而有了StringBuffer和StringBulider。

二. String

String类型的数据是不可变的,每次改变String类型数据时,就会生成一个新的String对象。而且String类型的数据时被存放在常量池中,如果一个新建的String数据在常量池中存在就直接使用常量池中的数据,如果不存在,就会重写建立一个内存空间保存这个新建的数据。

三. StringBuffer(JDK1.0)

StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。

Java.lang.StringBuffer 线程安全的可变字符序列。在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。

  • append 方法始终将这些字符添加到缓冲区的末端;

  • insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容是 start 的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含 startle ,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含 starlet 。

注意:java中的数组,或者是字符串位数的第几位都是从0开始算。

四. StringBuilder(JDK5.0)

StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder 对象被当作是一个包含字符序列的变长数组。

java.lang.StringBuilder 是一个可变的字符序列,是 JDK5.0 新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。

其构造方法如下:

构造方法描述
StringBuilder()创建一个容量为16的StringBuilder对象(16个空元素)
StringBuilder(CharSequence cs)创建一个包含cs的StringBuilder对象,末尾附加16个空元素
StringBuilder(int initCapacity)创建一个容量为initCapacity的StringBuilder对象
StringBuilder(String s)创建一个包含s的StringBuilder对象,末尾附加16个空元素

在大部分情况下,StringBuilder > StringBuffer。这主要是由于前者不需要考虑线程安全。

三者区别

String 类型和 StringBuffer 的主要性能区别:String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。

使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

在某些特别情况下, String 对象的字符串拼接其实是被 Java Compiler 编译成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,例如:

String s1 = “This is only a” + “ simple” + “ test”;//字符串常量拼接
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

进行字符常量的拼接生成 String s1 对象的速度并不比 StringBuffer 慢。其实在 Java Compiler 里,自动做了如下转换,即ava Compiler直接把上述第一条语句编译为:
String s1 = “This is only a simple test”;  

所以速度很快。但要注意的是,如果拼接的字符串来自另外的 String 对象的话,Java Compiler 就不会自动转换了,速度也就没那么快了,例如:

String s2 = “This is only a”;  
String s3 = “ simple”;  
String s4 = “ test”;  
String s1 = s2 + s3 + s4;//进行字符串对象的拼接  

这时候,Java Compiler 会规规矩矩的按照原来的方式去做,String 的 concatenation(即+)操作利用了 StringBuilder(或StringBuffer)的append 方法实现,此时,对于上述情况,若 s2,s3,s4 采用 String 定义,拼接时需要额外创建一个 StringBuffer(或StringBuilder),之后将StringBuffer 转换为 String,若采用 StringBuffer(或StringBuilder),则不需额外创建 StringBuffer。

使用策略

  • (1)基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。

  • (2)不要使用String类的"+"来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。例如:

String result = "";
for (String s : hugeArray) {

    result = result + s;
}

// 使用StringBuilder
StringBuilder sb = new StringBuilder();
    for (String s : hugeArray) {

        sb.append(s);
    }

String result = sb.toString();
  • 当出现上面的情况时,显然我们要采用第二种方法,因为第一种方法,每次循环都会创建一个String result用于保存结果,除此之外二者基本相同(对于jdk1.5及之后版本)。

  • (3)为了获得更好的性能,在构造 StringBuffer 或 StringBuilder 时应尽可能指定它们的容量。当然,如果你操作的字符串长度(length)不超过 16 个字符就不用了,当不指定容量(capacity)时默认构造一个容量为16的对象。不指定容量会显著降低性能。

  • (4)StringBuilder 一般使用在方法内部来完成类似 + 功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer 主要用在全局变量中。

  • (5)相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用 StringBuilder;否则还是用 StringBuffer。

学Simulink--基础储能管理场景实例:基于Simulink的储能SOC均衡控制策略仿真 本文完成了基于 Simulink 的储能 SOC 均衡控制策略仿真,实现了:✅掌握并联系统 SOC 分化机理✅构建基于电流重分配的主动均衡架构✅验证均衡对系统可用容量的显著提升✅实现 SOC 偏差 < 2% 的高精度控制。 阅读详情

相关推荐

AF3 ProteinDataset类的_patch方法解读

AlphaFold3 protein_dataset模块 ProteinDataset 类  _patch 方法的主要目的是围绕锚点残基(anchor residues)裁剪蛋白质数据,提取一个局部补丁(patch)作为模型输入。

qq_27390023的博客 1148

String、StringBuilder和StringBuffer三者区别

一、字符串的连接效率问题   Java当中对数组初始化之后,该数组所占的内存空间、数组长度的都是不可变的,我们在编写程序的时候,对于数组的初始化都需要给定长度才行。对于创建一个字符串,为字符串对象分配内存空间,会耗费掉一定的时间与空间的代价,也即CPU和内存的代价消耗,作为最基础的数据类型,大量频繁的创建字符串,会极大程度地影响程序的性能。   每次连接字符串时都会创建一个新的String对象,随着拼接次数的增多,这个对象会越来越大。比如说,进行100次拼接需要创建100个String对象才能够达到目的,对

hpf_coding的博客 9998

VGG16

VGG16学习笔记

一去不复返的通信er 1178

String、StringBuilde、StringBuffer区别

String、StringBuilde、StringBuffer区别 String不可变性 StringBuilder可变字符串,线程不太安全,但效率高,推荐使用。 StringBuffer可变字符串,线程安全,但效率低,不推荐使用。 1)StringBuilder效率高,线程不安全,StringBuffer效率低,线程安全。 2)String是不可变字符串,StringBuilder是可变字符串。 为什么有这样的差异,可以深入源码去解析, 比如String类内的 priver final char v

fenghanfenghan的博客 421

量化交易——量化选股(多因子选股)

就是用过去的股票的收益率对多因子进行回归,得到一个回归方程,然后再把最新的因子值代入回归方程得到一个对未来股票收益的预判,然后再以此为依据进行选股。的方法是建立在市场无效或弱有效的前提之下,随着使用多因子选股模型的投资者数量的不断增加,有的因子会逐渐失效,而。就是根据各个因子的大小对股票进行打分,然后按照一定的权重加权得到一个总分,根据总分再对股票进行筛选。另一方面,一些因子可能在过去的市场环境下比较有效,而随着市场风格的改变,这些。波动的影响,避免在市场极度狂热或悲观的情况下作出非理性的。

jiucaixiuyang的博客 1791

K8S证书过期解决办法之替换证书

k8s证书过期解决方案之替换证书

q_hsolucky的博客 1万+

Java中String,StringBuffer和StringBuilder的区别

一、简单来说 String,StringBuffer和StringBuilder都是Java中关于字符串处理的类。 三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。 StringBuffer是线程安全,可以不需要额外的同步用于多线程中; StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了; StringBuffer与StringBui

weixin_43916896的博客 2280

uniapp [全端兼容] - 实现内网使用天地图离线地图,详解项目加载天地图的离线地图服务器部署与使用教程示例源码,Uniapp如何实现天地图的离线加载部署在内网访问(兼容H5、微信小程序、App)

uniapp天地图如何离线访问,无需网络调用天地图API,天地图离线地图,天地图——内网使用离线地图,uniapp中加载天地图的离线地图,uniAPP实现天地图离线访问,在内网中无法直接使用外网天地图资源怎么办,在uni-app中加载地图 -使用天地图的瓦片数据。UNIAPP天地图离线怎么使用,内网部署天地图,天地图离线瓦片,部分瓦片数据,天地图如何离线,下载天地图离线服务,并用Uniapp+天地图离线部署,天地图私有化部署,实现离线加载天地图,Java+uniapp天地图离线开发,uniapp项目中无网络

🏆 前端领域优质创作者 4908

String、StringBuffer和StringBuilde的区别

StringBuffer 和 StringBuilder 类提供了操作字符串的方法。 String为字符串常量,即String对象一旦创建之后该对象是不可更改,final 修饰,可以被不同线程共享,是线程安全的。在涉及多线程操作中不需要同步操作。 StringBuilder和StringBuffer均为字符串变量,是可以更改的 StringBuilder是线程不安全的, StringBuffer是线程安全的,StringBuffer中很多方法可以带有synchronized关键字 ...

yao583224426的博客 417

控制算法研发工程师(博士)职位深度解析与面试指南

摘要:广东万和新电气股份有限公司招聘控制算法研发工程师(博士),工作地点佛山顺德。职位要求2026届博士学历,电子信息工程或控制科学与工程专业。主要职责包括:1)燃气热水、热泵等系统的电控软件设计与优化;2)开发PID、模糊控制、ADRC、MPC等智能算法,应用于恒温控制、变频调节等场景。重点考察算法研发能力、系统稳定性优化及嵌入式实现经验。该职位提供三年资深工程师培养计划,需具备扎实的控制理论基础和工程实践能力,能够处理非线性系统、多工况自适应等复杂控制问题。

郑伟强dev的专栏 140

网络变更:APIC 节点替换

Fabric Name,Controller ID,TEP Address Pool 等信息必须相同;如果故障设备是 APIC1 还需要重新配置管理密码。此过程可能需要 10 分钟左右,在此期间目标 APIC 可能在 Available/Unavailable 状态翻滚。APIC 获取 TEP 地址后,进入 fully-fit。通过 CLI 以及配置的密码登录目标 APIC。

m0_54931486的博客 322

String、StringBuild、StringBuffer三者详解及区别

在栈内存中存放了 String a 及地址值001,在堆内存中存放了"a",而在a=a+b;时,堆内存中的"a"就会被清除出堆内存,进来了 a+b的结果,即"ab",然后赋予String类的a及。String是字符串常量,如果有去看它底层的人都知道,它的底层是由final修饰,所以其值明面上是不可变的,可能会有很多人开始疑惑了,没事,等我接下来一一细说。上面我用到了地址比较是"==",有人说,这不是比较内容的嘛,怎么变成比较值了?这俩者的区别就在于内容相同时,地址不相同,我们先说通过构造对象创建。

qq_21313581的博客 2563

从 Material Requirements Planning 看 SAP 物料计划的底层控制逻辑

文章摘要:SAP中的MRP(物料需求计划)不仅仅是运行一个程序(如MD01N),其关键在于主数据和组织层级的正确配置。MRP的核心是解决"何时需要多少物料"的问题,涉及采购、生产、库存等多种供应来源。物料主数据的MRP视图必须在组织层级(如工厂、存储位置)下维护,不同层级的计划逻辑可能完全不同。S/4HANA更强调MRP Area作为细分计划单位,取代传统存储位置MRP。实施时需注意MRP Profile的合理使用,避免批量错误,并特别关注物料生命周期管理(如停用物料和替代件),这些因素共同决定了MRP能否

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1417

String、String Builder、和String Buffer三者之间的区别

一.String类 是自定义数据类型,不是基本数据类型,String一共有11中数据类型 1.length方法 String str = new String("王巍"); System.out.println(str.length());二.StringBuffer和StringBuilder(方法都相同) 与String的区别是StringBuild...

蓝色的青春_巍 1831

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

String,StringBuffer,StringBuilde三者的区别

String,StringBuffer,StringBuilde三者的区别 最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。 1.三者在执行速度方面的比较:      StringBuilder &amp;gt; StringBuffer &amp;gt; String 2.String &amp;lt;(St...

Freya_zyc的博客 1306

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

String/ StringBuffer/ String Builder的区别

String/StringBuffer/StringBuilder心得: 1 String (1) String的创建机理 由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。其运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对象引用;如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。但是,通过new方法创建的String对象是不检查字符串池的,而是直接在堆区或栈

baihehua_1988的博客 206

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

String,StringBuffer,StringBuilder三者的区别

String,StringBuffer,StringBuilder三者的区别

TimeTDIT的博客 491

String,StringBuffer,StringBuilder三者的区别

先上一张图 1:StringBuilder的执行效率要高于StringBuffer和String; 2:String是一个常量,长度不可以发生变化,它对于每次+=赋值都会创建一个新的对象,而StringBuffer和StringBuilder长度都是可以发生变化的,当进行字符串拼接时才用append方法,在字符串原本的基础上进行追加,所以效率就要比string高,又因StringBuff...

Yao_shen_yun的博客 294

Java中的String,StringBuilder,StringBuffer三者的区别

1.首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder &gt; StringBuffer &gt; String。String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。2. StringBuffer与String...

lukabruce的博客 211

String、StringBuffer和StringBulider的区别

的

w18377940962的博客 477

String,StringBuffer,StringBuider的区别

1.String字符串常量 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String 。因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的..

今晚会有星星么 337

StringBuilder、StringBuffer和String三者的联系和区别

1. String 类     String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。     String a = "a"; //假设a指向地址0x0001     a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。 

zs的博客 267

java中的String,StringBuffer和StringBuilder的区别和联系的详细解释

String 字符串常量StringBuffer 字符串变量(线程安全)      StringBuilder 字符串变量(非线程安全),不能在多线程情况下使用。    String 是一个常量,他的值在创建之后不能改变,字符串缓冲区支持修改,因为字符串对象是不可变的,所以支持共享   当多个线程使用字符串缓冲区时,使用StringBuffer保证正确的操作,如果是单线程的,建议使用StringB...

常庆伟的博客 174

String,StringBuffer,StringBulider的区别

(1)可变不可变: String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。 StringBuffer:在修改时会改变对象自身,每次操作都是对StringBuffer对象本身进行修改,不会生成新的对象。使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。 (2)线程是否安全: String:对象定义后不可变,线程安全。 Strin...

RourouYue的博客 327

【Java扫盲篇】String、String Buffer和String Builder的区别

你在面试时,面试官让你讲讲r的区别,你是否能流畅的、完整的叙述出他们三者的区别?

daydayup 1453

String、String Buffer、String Builder有啥子区别?

String、String Buffer、String Builder有啥子区别? jdk 1.8 String String类 是我们平时用的最多的一个类,它提供了构造和管理字符串的各种基本逻辑。 public final class String implements java.io.Serializable, Comparable<String>, CharSequ...

weixin_43519048的博客 2045
上一篇: JDK1.8新特性之接口中的静态方法与默认方法
下一篇: SpringBoot常见注解分类及解析
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值