String,StringBuffer与StringBuilder的区别

ASP.NET(C#) String, StringBuilder 与 StringWriter性能比较 直观认识:正面交锋  性能测试1:StringBuilder  第 1 轮测试:用时 312.5 毫秒  第 2 轮测试:用时 421.875 毫秒  第 3 轮测试:用时 453.125 毫秒  第 4 轮测试:用时 421.875 毫秒  第 5 轮测试:用时 453.125 毫秒  性能测试2:StringWriter  第 1 轮测试:用时 406.25 毫秒  第 2 轮测试:用时 453.125 毫秒  第 3 轮测试:用时 421.875 毫秒  第 4 轮测试:用时 437.5 毫秒  第 5 轮测试:用时 437.5 毫秒  性能测试3:String(1/100 数据量)  立即下载

一、Java String 类——String字符串常量

字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:

我们可以看到,初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“hello world”字符串也相应的需要开辟内存空间,这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费。为了应对经常性的字符串相关的操作,谷歌引入了两个新的类——StringBuffer类和StringBuild类来对此种变化字符串进行处理。

二、Java StringBuffer 和 StringBuilder 类——StringBuffer字符串变量、StringBuilder字符串变量

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

三者的继承结构

三者的区别:

(1)字符修改上的区别(主要,见上面分析)

(2)初始化上的区别,String可以空赋值,后者不行,报错

①String

String s = null;   

String s = “abc”;   

②StringBuffer

StringBuffer s = null; //结果警告:Null pointer access: The variable result can only be null at this location

StringBuffer s = new StringBuffer();//StringBuffer对象是一个空的对象

StringBuffer s = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象,对象的内容就是字符串”

小结:(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。

 

一:StringBuffer的底层

(1)线程安全的字符串操作类

(2)通过synchronized关键字声明同步方法,保证多线程环境下数据安全

    public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
    }
(3)底层存储数据的Char[]数组,初始化时,该数组的长度是16。如果构造函数有新传入字符转str,则16基础上加str.length.
    public StringBuffer() {
        super(16);
    }
    public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }
(4)添加字符串的过程

-->先检查内部char[]数组是否需要扩容

-->如需要扩容则进行扩容,然后将原来元数据copy到新数组中。

-->再将新添加的元数据加入到新char[]数组中

public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        //检查char[]数组是否需要扩容,扩容,并将原来的数据copy进去新扩容的数组中
        ensureCapacityInternal(count + len);
        //将新添加的数据添加到StringBuilder中的char[]数组中,实现字符串的添加
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
 
 
/**
*元数组char[]的扩容过程
*/
    void expandCapacity(int minimumCapacity) {
        int newCapacity = value.length * 2 + 2;
        if (newCapacity - minimumCapacity < 0)
            newCapacity = minimumCapacity;
        if (newCapacity < 0) {
            if (minimumCapacity < 0) // overflow
                throw new OutOfMemoryError();
            newCapacity = Integer.MAX_VALUE;
        }
        value = Arrays.copyOf(value, newCapacity);
    }
 
 
/**
*扩容实现
*/
   public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
二:StringBuillder的底层

 (1)线程非安全的字符串操作类

 (2)字符串的添加没有加同步处理,涉及到数组扩容,容易产生脏数据,破坏数据正确性

 (3)底层结构和StringBuffer实现基本一样,只是没有做同步处理。

--->StringBuffer和StringBuillder都继承抽象类AbstractStringBuilder,该抽象类实现了字符串操作的方法。

--->StringBuffer和StringBuillder的实现,运用了模板方法的设计模式,将核心数据操作放在父类方法里,子类实现自己的独有特色的功能,涉及核心操作,调用父类方法。

 

三:String的底层

String类没有提供用于修改字符串的方法。String类对象为不可变字符串,如字符串string=”HELLO”永远只包含HELLO这几个字母,而不能修改其中任何一个字符。当然可以修改字符串变量string的引用,让它引用另一个字符串。 
不可变字符串有一个优点:编译器可以让字符串实现共享。实际上只有字符串常量(使用“ ”声明,存储在字符串常量池中)是共享的,subStrng,+等操作产生的结果不能共享。 
比较字符串值是否相等时使用equals()方法,不能使用==,==比较的是字符串的地址是否相同。如果字符串在常量池中,可以使用==比较,因为指向的都是同一个字符串。

直接使用 ” ” 声明的String对象会直接存储在常量池中,(可以实现共享) 
1.String str1=”first”; 
jvm在运行时先查找常量池中是否有该字符串,如果有则直接返回该字符串的引用给first(实现了字符串 的共享) ;否则先在常量 
池中创建该字符串并返回引用。 
此时只会在常量池中创建String对象,不会在堆中创建。 
2.String str2=new String(“second”); 
该代码生成了两个String对象。因为使用了“”会现在常量池中查找是否存在second对象,没有则创建 
否则不创建;在常量池创建完成后,由于使用了new,jvm会在堆中创建内容相同的String对象,并将引用 
返回给str2. 
3.String str3=”what”; String str4=str3+”a nice day”; 
运行时,+ 相当于new,所以堆中会有“what a nice day”对象;常量池中会有”what” “a nice day”两个对象,而不会有”what a nice day”对象。

4.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

Python爬虫实战:5分钟搞定大众点评评论数据抓取(附完整代码) 本文详细介绍了使用Python爬虫高效获取大众点评评论数据的5个关键技巧,包括环境配置、智能页面解析、反反爬策略、数据存储与容错设计以及性能优化。通过实战案例和完整代码,帮助开发者快速掌握文本挖掘技术,适用于市场分析和商业决策。 阅读详情

相关推荐

日志异常检测详细整理,看这一篇就够了(附各项目代码链接)

对于不用的日志键,用它们的参数值向量训练一个参数值异常检测模型来检测有这些参数值反映的系统性能异常。与标准的GAN框架一样,D和G的参数是基于D的输出来更新的,因此鉴别器D可以被训练为尽可能敏感地将正确的标签分配给真实和虚假序列,而生成器将被训练为尽可能聪明地在经过足够多轮的迭代后欺骗鉴别器,即误导D将真实标签分配给虚假序列。LR:逻辑回归是有监督的模型,将处理后的特征矩阵以及标记作为模型的输入,得到训练后的模型,用此模型预测新出现的特征向量,以此判断特征向量是否为异常的,进而判断日志异常。

qq_20368489的博客 1万+

StringWriter vs StringBuilder vs StringBuffer

StringWriter,StringBuilder和StringBuffer都可以动态构建一个String,那么三者在性能上谁最好呢? 从jdk的源码中可以看出,StringWriter的内部实现是通过StringBuffer来实现的,所以性能上应该和StringBuffer差不多,而StringBuffer是线程安全的,所以性能上稍逊一点。 而StringBuilder不是线程安全的,...

linychuo 532

uni-app刮奖

uni-app的刮奖效果,要注意的点: 1.小程序的canvas层级问题(可用cover-view规避) 2.不能操作dom 以下是uni-app刮奖效果的代码: <template> <!-- 刮奖 --> <view v-else class="scratch"> <view class="box"> &lt...

qq_40101922的博客 4307

String的兄弟姐妹和亲戚:StringBuilder,StringBuffer,StringReader,StringWriter,StringBufferInputStream

java字符串家族:String,StringBuilder,StringBuffer。貌似成员:StringReader,StringWriter,StringBufferInputStream,但其实这三个是io流。StringReader 继承自Reader,StringWriter继承自Writer,StringBufferInputStream继承自InputStream。String官方

Blog for 明月依希 1734

盘点军工行业软件研发的那些常用GJB标准

GJB5000、2786、438、141、102、8114等...

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 9439

构建高效的LLM应用测试框架

《构建高效的LLM应用测试框架》 关键词:LLM,测试框架,应用测试,效率优化,测试原理 摘要:本文将深入探讨构建高效LLM应用测试框架的必要性、方法与步骤,旨在为开发者提供一套系统化、可操作的测试解决方案,从而提升LLM

AI天才研究院 1046

String和StringBuffer及StringBuilder的区别

String和StringBuffer及StringBuilder的区别 1、String类的内容是不可改变的。能改变的只是其内存指向。 2、String对象不可修改指的是对象本身不可修改,而不是引用不可修改。 3、StringBuffer类的对象内容是可以修改的。 4、String可以直接通过赋值的方式实现对象实例化,而StringBuffer只能通过构造方法的方式对象实例化。 5、StringBuffer在处理字符串的时候,不会生成新的对象。从内存这个角度来说,StringBuffer要比String更

qq_57181249的博客 5813

ESD防护设计宝典(十一):CE(传导发射)超标问题排查与解决

(Conducted Emission, CE),亦称为传导骚扰,是电子电气设备或系统内部的电压、电流通过信号线、电源线或地线向外传输,对其他电子电气设备或系统造成电磁干扰的物理现象。其。

m0_56451176的博客 856

String、StringBuffer和StringBuilder之间的区别

1、相同点: String,StringBuffer,StringBuilder最终底层存储与操作的都是char数组,StringBuffer和StringBuilder都继承了AbstractStringBuilder 2、不同点: String:char数组是final的,不可变,修改String时实际上是new一个新String对象返回,线程安全,频繁的增删操作时不建议使用 S...

KWMax 4149

SAP ABAP SSSLERR_PEER_CERT_UNTRUSTED 证书过期+证书导入+案例详解+注意事项

出于 IT 审计与安全管理,外部系统间通讯发布的 API 主流都是 HTTPS 协议,SAP 支持 SSL 证书。SSL 证书是有效期的,当证书失效时将返回错误 SSSLERR_PEER_CERT_UNTRUSTED ,此时需要导入新效期的证书。这篇文章完整讲解了证书过期处理的全过程。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 2362

手把手教你学Simulink--基于飞行控制与稳定性的场景实例:固定翼无人机的自动起飞与降落控制

本文介绍了使用Simulink对固定翼无人机自动起飞与降落控制系统进行建模与仿真的完整流程。首先构建了包含飞行器动力学模型、控制系统、环境模拟等模块的系统结构,详细阐述了简化动力学方程的推导和实现。重点讲解了PID控制器设计,包括起飞阶段的速度控制和降落阶段的高度控制策略。通过添加环境干扰和输入信号,建立了完整的仿真模型,并利用输出显示模块评估系统性能。该实例为无人机自主控制系统的开发提供了有效的仿真验证方法,有助于优化参数提高飞行稳定性。

MHD0815的博客 4308

Java基础:String、StringBuffer、StringBuilder的区别

这篇文章主要介绍了String、StringBuffer、StringBuilder的区别详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。放假在家里休息,闲来无事,想巩固巩固自己的基础知识。Java基础这个我会一直更新的,希望大家关注 收藏 点赞。

weixin_42188778的博客 3万+

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析 ,人工智能,计算机视觉,大模型,AI,本文聚焦基于强化学习的目标检测与跟踪技术,先介绍相关技术基础,包括目标检测、跟踪及强化学习的算法等。接着阐述强化学习在目标检测与跟踪中的应用思路、框架及典型算法,解析三篇相关论文的背景、方法、实验结果。还探讨了该技术面临的样本效率、奖励函数设计等挑战,以及结合迁移学习等的未来发展方向,为该领域研究提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

String、StringBuffer、StringBuilder 三个的区别

在Java中都是用于处理字符串的类,它们在等方面都有明显的区别。

2301_78125917的博客 2030

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数学建模模型总结

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

String StringBuffer StringBuilder之间的区别

在学习String、StringBuffer、StringBuilder三者时,首先给出必要的结论,后面详细分析。 在执行速度上: StringBuilder > StringBuffer > String .这是在一般情况下的结果 在安全性上: String、StringBuilder 线程非安全 || StringBuffer 线程安全 【参考文章】 https:...

奔跑的蜗牛 3288

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

String、Stringbuilder与Stringbuffer的区别,String、Stringbuilder与Stringbuffer的适用场景

没循环情况下用String的加号拼接,有循环情况下使用StringBuilder,任何场景都不推荐使用StringBuffer。

weixin_68472181的博客 1650

关于String、StringBuffer、StringBuilder的区别

最近看到了一道题目: 正确答案:C 下面就这题的其他选项给出解析: String String不可变!先来看看String的源码: public final class String implements Serializable, Comparable<String>, CharSequence { private final byte[] value; priva...

江璇Up 4548

String、StringBuilder、StringBuffer的区别

可变性:String不可变,StringBuffer和StringBuilder可变。线程安全性:String和StringBuffer是线程安全的,StringBuilder不是线程安全的。性能:在单线程环境下,StringBuilder > StringBuffer > String;在多线程环境下,应优先考虑StringBuffer。使用建议如果要操作少量的数据,使用String;单线程环境下操作大量数据,使用StringBuilder;多线程环境下操作大量数据,使用StringBuffer。

weixin_56018532的博客 1276

String,StringBuffer,StringBuilder的区别

String、StringBuffer和StringBuilder都是用于处理字符串的类,它们之间的区别如下: String:String类是不可变的,也就是说一旦创建了一个String对象,它的值就不能被修改。每次对String对象进行操作(拼接、替换等),都会创建一个新的String对象,这会产生大量的临时对象,影响性能。 StringBuffer:StringBuffer是可变的,可以对其进行修改操作。在对字符串进行频繁操作时,使用StringBuffer比直接使用String效率更高,因为Str

4万+

简述String、StringBuilder和StringBuffer的区别

三个都是java平台提供的字符串,都是可以用于存储和操作字符串。以下是他们的区别: 1、String是只读字符串,底层是被final修饰了,意味着String引用的字符串内容是不能被改变的; String str = “abc”; str = “bcd”; 实际上,这时候的str并不说是之前的str,由于第二步操作是直接创建新的对象然后进行赋值的,此时两个str所指向的地址是不同的; ...

qq_32003379的博客 4757

String, StringBuffer,StringBuilder的区别

String, StringBuffer,StringBuilder的区别 java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。 ...

xiaos_的博客 335

String、StringBuffer、StringBuilder有什么区别?

今天我会聊聊日常使用的字符串,别看它似乎很简单,但其实字符串几乎在所有编程语言里都是个特殊的存在,因为不管是数量还是体积,字符串都是大多数应用中的重要组成。今天我要问你的问题是,理解Java的字符串,String、StringBuffer、StringBuilder有什么区别?

qq_33240556的博客 1022

String、StringBuffer、StringBuilder的区别

java操作字符串的类有:String、StringBuffer、StringBuilder。 String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以...

qq_37557563的博客 2166

浅谈String、StringBuffer、StringBuilder的区别

大家好,我是Morning,在优快云写文,分享一些Java基础知识,一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。感兴趣的欢迎关注博主,和博主一起学习Java知识。大家还可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。 今天和大家一起来探讨一个很基础的知识,可能在之前你了解的不是很清晰,希望这篇文章可以帮助到你。 String是Java中很基础的一个引用类型,它封装了对一个字符串对象的创建和一些基本操作。相信大家对这个类有一定的了解,同样Java提供的常用的.

正在探索 Java 海 718

String,StringBuilder,StringBuffer区别

1.String、StringBuffer、StringBuilder比较。 三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用

落的博客 431
上一篇: finalize()
下一篇: 汽车之家基于 Flink 的数据传输平台的设计与实践
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值