关于String类和StringBuffer类的区别

【史诗级】详细阐述借助AI实现对Windows蓝屏原因进行精确定位的方法 在解决问题的过程中我决定把这一切都记录下来,并整理出一套通用的方法,方便快速精确定位引起蓝屏的真实原因。今天我的蓝屏代码是0x000000ef,而你或许是遇到另一个蓝屏代码,代码本身代表的含义不是这里的讨论重点,重要的是解决问题的底层逻辑。 阅读详情

首先,String和StringBuffer主要有2个区别:

(1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,可以通过append()方法来修改值

(2)String类对象的性能远不如StringBuffer类。

关于以上具体解释如下:

在java中有3个类来负责字符的操作。

1.Character 是进行单个字符操作的,

2.String 对一串字符进行操作。不可变类。

3.StringBuffer 也是对一串字符进行操作,但是可变类。

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
注意:不能通过赋值符号对他进行赋值. 
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中赋值的时候可以通过它的append方法.
sb.append("hello");

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的. 

看看以下代码:
将26个英文字母重复加了5000次,

 String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 5000;
        long lstart1 = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < times; i++) {
            str += tempstr;
        }
        long lend1 = System.currentTimeMillis();
        long time = (lend1 - lstart1);
        System.out.println(time);

得到的结果每次不一定,一般为 1563左右。
我们再看看以下代码
String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 5000;
        long lstart2 = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < times; i++) {
            sb.append(tempstr);
        }
        long lend2 = System.currentTimeMillis();
        long time2 = (lend2 - lstart2);
        System.out.println(time2);

得到的结果为 16 有时还是 0
所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。

 

根据上面所说:

str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();

所以str += "here";可以等同于

StringBuffer sb = new StringBuffer(str);

sb.append("here");

str = sb.toString();

所以上面直接利用"+"来连接String的代码可以基本等同于以下代码

String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 5000;
        long lstart2 = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < times; i++) {
            StringBuffer sb = new StringBuffer(str);
            sb.append(tempstr);
            str = sb.toString();
        }
        long lend2 = System.currentTimeMillis();
        long time2 = (lend2 - lstart2);
        System.out.println(time2);

平均执行时间为1563左右。

 

总结: 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高



引用至笑rpp的博客


【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码) 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。 阅读详情

相关推荐

利用Python实现FGO自动战斗脚本

Fate/Grand Order(非的肝不过欧的)作为索尼为了拯救自己不倒闭而开发的面向月厨的骗氪养成抽卡爆肝游戏,居然没有像隔壁《阴阳师》的自动战斗系统(看看别人现在都自带脚本了)。毕竟是懒得肝,就不妨写一个脚本来肝算了,省时省力。 开始 一个战斗脚本,其实可以算是AI的初步了。虽然只是暴力算出造成最大伤害的方案orz。 我们在这里不考虑释放 技能 、 宝具 和 暴击星 这三样非常重要的东西。...

web开发与Python 5485

String 和StringBuffer的区别

2.String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。1.StringBuffer:StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。

m0_73784167的博客 3233

逆向工程实战:手把手教你破解药监局网站的动态数据加载机制(Python+Chrome开发者工具)

本文详细介绍了如何利用Python和Chrome开发者工具逆向破解药监局网站的动态数据加载机制。通过分析Ajax请求、解析JSON响应数据以及处理动态参数,帮助开发者高效采集动态加载内容,适用于爬虫开发与数据分析场景。

weixin_30832143的博客 68

String类和StringBuffer类的区别?

String类和StringBuffer类的区别? String类代表字符串类,字符串是常量,它们的值在创建之后不能更改。如果你修改了String的值,就相当于创建了一个新的对象,为不可变类。 StringBuffer类指的是String的字符串缓冲区,通过调用某些方法可以改变该序列的长度和内容,为可变类,所以说StringBuffer类对象是可修改修改对象。 String的特点: 1.为不可变对...

Soul_Ming的博客 5649

手势控制 Python !Leap Motion Python 开发教程 (二)

手势控制 Python !Leap Motion Python 开发教程 (二) 现在进入正题,我来给大家总结一下我在使用 Leap Motion 开发过程中的经验以及学到的东西,其中我会概括以及翻译官方给出的注释,为了让这些注释更加通俗易懂,让大家更好理解。 回顾 在上一篇文章中我们讲了如何配置 Leap Motion 的 Python 2.7 的开发环境,如果您还没有配置好您的开发环境,可以参...

成畅的博客 3195

LeGO-LOAM运行kitti数据集

文章目录1. kitti-lego-loam2. 改动3. 实验结果4. evo轨迹测评 1. kitti-lego-loam 链接:kitti-lego-loam kitti-lego-loam提供了将kitti序列转化成rosbag的代码,在kittibag中. 需要注意下数据文件的存放顺序,以00序列为例: datafolder          |____results          &

Zlp19970106的博客 8705

StringBuffer类与string类的区别

与String的区别:1.StringBuffer的运行效率更快,因为没有产生中间垃圾对象,一直在原来的值上修改。而String会产生很多中间对象,我们只关心最后的结果,所以这些中间对象都是垃圾,产生了中间变量,导致运行效率低。2.StringBuffer用于生成字符串,String用于表示字符串。3.StringBuffer是“可变化的量”,也就是在运行时可以修改,不必产生中间...

QYHuiiQ 3170

基于云平台的ATS系统微服务架构方案研究

在当前智慧地铁的升级转型过程中,城市轨道交通ATS系统面临着稳定性差、运维方 式繁琐和故障应急处理效率低等问题。为此,提出一种基于云平台的ATS系统微服务架构方案; 研究了ATS系统在云平台上的微服务总体架构、ATS应用的微服务划分和设计、容器部署方式 及通信交互模式,可实现系统松耦合和易扩展,达到节约计算资源、提高系统稳定性和运营效 率的目的

mi_lan1的博客 966

常用类基础题

4.关于字符串连接,说法不正确的是()) A.“+”运算符可以连接字符串和字符串 B.“+”运算符只能连接字符串和字符串 C.“+”运算符可以连接字符串和 int 类型 D.“+”运算符可以连接字符串和 double 类型。5.下面关于 String 类和 StringBuffer类的描述正确的是那一个(A) A:StringBuffer 类的对象可以调用tostring()方法将转换为String类型。C:可以直接将字符串“test”赋值给声明的 Stirng类和StringBuffer 类的变量。

Annmonth的博客 192

图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)

本文介绍了一种基于多尺度Retinex(MSR)和CLAHE的低照度图像增强算法。算法首先对图像进行多尺度Retinex处理,通过不同尺度的高斯核去除光照影响;然后采用CLAHE算法进行对比度增强。Matlab实现展示了算法流程,包含灰度转换、多尺度Retinex增强和CLAHE处理。实验结果显示,该方法能有效提升低照度图像的可见性,增强细节表现。最后提出了改进建议,包括引入深度学习方法和优化参数选择。

尘世冰封的专栏 953

【TC397第23篇】深度解析TC397 EB MCAL开发系列:UART配置与POLL模式数据交互

通过本文,我们深度解析了TC397 EB MCAL开发系列中UART配置的POLL模式下的数据交互。从技术要点的介绍到实际案例的演示,希望读者能够更好地理解UART在POLL模式下的配置与应用。这不仅是对嵌入式系统开发的一次深刻探索,更是为项目提供了一种高效通信的解决方案。在未来的文章中,我们将继续深入研究嵌入式系统开发的各个方面,为广大开发者提供更多实用的技术知识。敬请期待,一同迎接嵌入式技术的新篇章!

一直在水些技术小文 470

JAVA练习(错题)汇总(1)

JAVA练习(错题)汇总 在java中重写方法应遵循规则的包括() A 访问修饰符的限制一定要大于被重写方法的访问修饰符 B 可以有不同的访问修饰符 C 参数列表必须完全与被重写的方法相同 D 必须具有不同的参数列表 正确答案:BC 解析:方法的重写两同两小一大原则: 方法名相同,参数类型相同。 子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等...

weixin_43821614的博客 835

小红书urlscheme和Activity

本文档详细介绍了小红书App的Deeplink跳转规范,涵盖了多个功能模块的跳转协议。主要内容包括:主页各Tab(关注、发现、购买)的跳转方式;不同类型笔记(图文/视频/长笔记)的详情页跳转参数;用户相关页面(主页/绑定/资料/消息等)的跳转协议;搜索功能(输入页/结果页)的跳转方式;以及话题、标签、专辑、H5页面等特殊场景的跳转实现。文档还提供了各跳转协议所需的参数说明,包括参数类型、默认值、是否必填等详细信息,并标注了不同版本和平台的兼容性要求。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 786

详解String,StringBuilder类和StringBuffer类及其区别

文章目录一、StringBuilder类和String类的概述二、StringBuilder类和String类的区别三.tringBuilder类和String类的构造方法1.String类构造方法1.1创建字符串对象两种方式的区别- 通过构造方法创建2.StringBuilder类构造方法四.StringBuilder类添加和反转方法五.StringBuilder和String相互转换 一、StringBuilder类和String类的概述 String 类代表字符串,Java 程序中的所有字符串文字.

weixin_54226473的博客 995

Camera2Demo

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

举例说明string类和stringbuffer类的区别_String、StringBuffer和StringBuilder的区别

0. 说明今天看到了一个老的面试题就是:String、StringBuffer和StringBuilder之间的区别。这个面试题非常经典,其实现在大多数情况下都会考虑到性能为题,在我们写一个类的toString方法的时候,一般都是使用的IDE自动生成,无论生成的代码是"+"链接符,还是其他很么样式,一般情况下都会被IDE在编译的时候,变成性能相对最优的StringBuilder的append的形式...

weixin_39758041的博客 255

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

String 类和StringBuffer类的区别

String 和StringBuffer的区别

tong474372044的博客 929

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java String类的使用以及和StringBuffer和StringBuilder的区别

Java String类的使用以及和StringBuffer和StringBuilder的区别 目录索引绪论StringStringBufferStringBuilder 绪论 绪论:在Java语言中,为了处理字符串问题,Java提供了String,StringBuffer,StringBuilder三个类来封装处理字符串 String String类是不可变类,一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁 为什么说String类是不可变类??? 因为St

lidancsdn的博客 862

java = stringbuffer_Java String类和StringBuffer类有什么区别?

由于字符串是常量,因此一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。为了便于对字符串的修改,在JDK中提供了个StringBuffer类(也称字符串缓冲区)。StringBuffer类和String类最大的区别在于它的内容和长度都是可以改变的。StringBuffer类似一个字符容器,当在其中添加或删除字符时,并不会产生新的StringBuffer对象。针...

weixin_28730927的博客 359

String、StringBuffer和StringBuilder类的区别

在Java中字符串属于对象,Java 提供了 String 类来创建和操作字符串。String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。 Java 提供了两个可变字符串类 StringBuffer 和 StringBuilder,中文翻译为“字符串缓冲区”。 StringBuilder 类是 JDK 1.5 新增的类,它也代表可变字符串对象。实际上,StringBuilder 和 StringBuffer 功能基本相似,方法也差..

IT赵云的博客 225

Java基础-String类和StringBuffer类的区别。

String类 String类表示的字符串是常量,一旦创建后,字符串的内容和长度都无法改变,并且被声明为final class,不可以被继承,成员属性中除了hash之外都被final修饰,当通过String的构造函数初始化新的String对象时,也只是根据传入的引用对象的value和hashcode进行了赋值。下面是String的部分源码。 public final class String ...

xmy1208945213的博客 433

Java的String、StringBuilder 和 StringBuffer类详解及区别

java基础(jdk1.8) ** String相关 ** 字符串在Java基础中是比较重要的,这里我们对String及StringBuffer和StringBuilder进行研究       字符串的操作我们在String、StringBuffer、StringBuilder这里同时对这三个类进行分析 String 源码内容: &nb...

qq_43360780的博客 277

举例说明string类和stringbuffer类的区别_6、String,StringBuffer,StringBuilder的区别

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。String类的值是保存在value数组中的,并且是被private final修饰的private修饰,表明外部的类是访问不到value的,子类也访问不到,当然String类不可能有子类,因为类被final修饰了final修饰,表明value的引用是不会被改变的,而valu...

weixin_39662263的博客 150

Java String类和StringBuffer类的区别

关于java的字符串处理我们一般使用String类和StringBuffer类 那么String类和StringBuffer类的区别在什么地方呢? 1、String是不可变的、StringBuffer是可变的。在程序中如果定义String s = "this is a string".那么在以后的应用中不能对s进行任何修改只能进行诸如subString等操作

张晨光老师的播客 2635

String类和StringBuffer类的区别

String类和StringBuffer类的区别:StringBuffer类使用append和insert等方法改变字符串值时只是在原有对象存储的内存地址上进行连续操作,减少了资源的开销.String : 常量字符串,一旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储。可以使用栈存储,速度快,简单应用效率高;StringBuilder : 可变字符串构造器,典型的对象,堆中创建

Anthony88的专栏 936

浅谈String类和StringBuffer类的区别

浅谈String类和StringBuffer类的区别 简单来说就是一个常量和变量的关系,StringBuffer的内容可以修改;而 String对象一旦产生后便不可以被修改,如果重新赋值,那就是两个对象。 StringBuffer内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存上优于String类。 StringBuffer是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象它只能通过构造函数来建立,StringBuffer sb = ne

咕噜噜的博客 439

String类和stringBuffer类的区别

他们的区别是很大的,它们是两个独立的类,可以这么说吧,除了名字有些相似,完全不相干.String类是不可改变的,如果你更改了String类的实例,那么以前的就“不存在了”,所指向的是一个新的实例。而StringBuffer类是可以更改的。             看如下例子,体会这一点:                     String   s1="Hello";               

zhouruitao的专栏 812
上一篇: Spring 错误Cannot proxy target class because CGLIB2 is not available
下一篇: List接口、Set接口和Map接口
zcg_java
博客等级 码龄12年 15粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值