String 和 StringBuffer

TypeScript的安装与使用 阅读详情
 

一:我声明了什么!

String s = "Hello world!";

许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:

String string = s;

我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。

二:String到底变了没有?

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:

String s = "Hello";
s = s + " world!";

s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。

用 CL_ABAP_ZIP 在 ABAP 里打包任意文件:从前端多选到 ZIP 交付的一条龙实践 本文介绍了在SAP ABAP中实现文件打包交付的完整解决方案。文章首先区分了ZIP和GZIP的不同用途:ZIP用于多文件归档,GZIP用于单数据流压缩。核心流程包括四个步骤:文件选择、二进制上传、内存打包和ZIP输出,并提供了关键对象与函数的速查表。针对实际项目中常见的乱码、大文件处理等问题给出了解决方案,最后展示了一个完整的可运行示例代码,涵盖了从文件选择到下载的全流程实现。该方案适用于财务、质量、运维等多种业务场景,能够有效解决多文件交付的最后一公里问题。 阅读详情

相关推荐

谷歌倾斜摄影数据获取以及转换3DTiles介绍

解析谷歌倾斜模型数据,再一键设置无人值守的情况下,快速将谷歌倾斜摄影模型数据转成3DTiles数据,并在Cesium上进行流畅漫游缩放显示,效果优于官方3DTiiles格式数据

cyber_room的博客 5338

String、StringBuffer和StringBuilder

在java中String、StringBuffer和StringBuilder都可以对字符串进行操作,但各自具有不同的应用场景。 (1)String和StringBuffer String是不可变类,也就是说String一旦被创建,其值就不能够被修改,因此其在那些不需要修改的共享变量中比较适合;StringBuffer则是可以改变的。 String初始化方式有两种方式,分别是赋值(Strin...

LMR的博客 9248

STM32平台中ARM架构向量表配置:手把手教程

深入讲解STM32平台下arm架构的向量表配置方法,结合实际操作步骤,帮助开发者掌握中断向量的定位与初始化,提升嵌入式系统开发效率。

weixin_42514540的博客 802

String 和StringBuffer的区别

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

m0_73784167的博客 3233

数字IC设计避坑指南:为什么477条net的DRV问题无法修复?解析don‘t touch hierarchy的影响

本文深入解析了数字IC后端实现中,因“don't touch hierarchy”约束导致大量DRV违规(如477条net)无法自动修复的根本原因。文章以Cadence Innovus工具为例,详细阐述了DRV修复机制与设计保护约束的冲突原理,并提供了从日志定位、风险评估到分级解除约束的完整实战策略,帮助工程师有效解决此类设计收敛难题。

hope8的博客 290

OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,将首次通过简单示例了解轮廓的基本概念,然后通过实际示例来了解如何检测和压缩轮廓,最后利用介绍如何利用图像矩描述检测到的轮廓属性。

盼小辉丶的博客 3万+

String和Stringbuffer和Stringbuilder的区别

JAVA 中String和Stringbuffer和Stringbuilder的区别** java 中String和StringBuffer与StringBuilder的区别及使用方法 String 类  String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。 String a = “a”; //假设a指向地址0x0001 a = “b”;//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不

bxl1998720的博客 1万+

【AutoSAR】【诊断栈】传输层CANTP

一、功能介绍 数据包发送放拆包分段发送 数据包接收方重组 流控 错误检测 二、参考协议 ISO 15765-2 三、数据帧格式 1、协议数据单元(PDU)格式 2、协议数据单元 - PCI格式 四、数据帧传输 1、单帧传输 CAN帧数据长度小于8字节(包括PCI信息) 无流控握手 PCI包含帧类型、数据长度和数据域 未使用字节填充 2、多帧传输 数据长度超过8字节 流控握手 定时控制 CAN帧类型包括: 首帧 流控帧 后继帧 3、多..

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 1554

String和StringBuffer

是可变的(mutable),适合频繁修改字符串内容的场景。是不可变的(immutable),即一旦创建,其内容就不能被修改。:返回指定子字符串最后一次出现的索引。:根据给定的字符串创建一个新字符串。:返回指定子字符串第一次出现的索引。:将指定字符串连接到当前字符串末尾。:返回当前容量(可存储的字符数)。:从指定索引开始截取子字符串。:根据正则表达式替换字符串。

weixin_45037690的博客 731

深度强化学习在足式机器人中的应用 (一):基础原理与仿真环境

我们将首先深入探讨其背后的核心挑战与技术栈,然后详细推导机器人学和强化学习的基本数学原理,特别是剖析在机器人控制领域表现卓越的PPO算法。下面的独立Python脚本展示了Isaac Gym的基本API用法,加载一个Go1机器人(假设URDF已准备好),并让它执行一个简单的预设动作(正弦波运动),以此来熟悉仿真流程。:代码的核心是直接操作GPU上的PyTorch张量,避免了CPU和GPU之间的数据拷贝,这是实现高性能的关键。:所有计算(如伪策略中的正弦波计算)都应该是向量化的,一次性为所有。

VectorShift的博客 228

【100%通过率】华为OD机试真题 Java&Go 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

String 和 StringBuffer区别

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供的字符串进行修改.当你知道字符数据要改变的时候你就可以使用 StringBuffer.典型地,你可以使用 StringBuffers来动态构造字符数据. 一、String的使用方法:

每天进步一点点。。。 4196

Python-自动化绘制股票价格通道线

创建更强大、更可靠的价格通道检测算法。

探索人工智能领域 948

JavaAPI-String和StringBuffer

1.String是一个类,可以new对象。 StringBuffer中的方法比StringBuilder中的方法多了一个关键字:synchronized 所以说,StringBuffer要比StringBuilder安全;但是性能要比StringBuilder低

m0_53499553的博客 1150

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

String 、StringBuilder和StringBuffer

1 String 、StringBuilder和StringBuffer String StringBuilder StringBuffer 底层 final byte[] value; byte[] value; byte[] value; 线程安全 安全 不安全 安全 超类 Object(顶层类) AbstractStringBuilder(抽象类) AbstractStringBuilder(抽象类) 可变性 不可变 可变 可变 拼接效率 低 高 较高(相比于Str

qq_46329780的博客 226

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

String和StringBuffer和StringBuilder的区别

1:StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都 会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。 2: HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。 3: StringBuffer和StringBuilder类的区..

Java后端技术栈 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

String和StringBuffer及StringBuilder的区别

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

qq_57181249的博客 5813

String和StringBuffer类的常用方法

在敲代码的时候,我时常忘记一些简单的方法,因此,后续我也会在我的博客中写一些最简单的代码.所以大家不要嫌我太水文章(笑).对于这些方法,我想尽可能的以最简洁的形式给大家分享出来.因为很对时候,我们不是不会用,而是忘了怎么敲.还有一些不了解的新朋友,也可以看一眼就很明了,这就是我写这类博客的初衷.那么废话不多说,我们来看代码.前文有讲过String和StringBuffer类的对比和分析如果大家有需求可以翻看我之前的博客,这里不再赘述了.那么今天的分享就到这里吧.

2301_79175212的博客 1093

String和StringBuffer相互转换

1、String类特有方法,比如:valueOf()、getBytes()等。 2、StringBuffer类特有方法,比如:拼接append、插入insert、删除delete、反转reverse等。 3、String >>> StringBuffer:a.构造方法:new StringBuffer(String s) b.append(String s)。 4、StringBuffer >>> String:a.构造方法:new String(StringBuffer s) b.toString()。

weixin_40017062的博客 1万+

关于StringBuffer和String

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 一、String x="abc";和String y=new String("abc")区别: String x="abc":变量x指向的是常量池的字符串常量对象。 String y=new String("abc...

孤云博客 1459

String、StringBuffer和StringBuilder的区别

String、StringBuffer和StringBuilder 我们为什么要引入StringBuffer和StringBuilder? String的局限性: String不是基本数据类型,在创建的字符串属于对象,一种是new()创建对象,一种是创建String类对象的引用变量。 但是,String是被final修饰的,它的值是不可改变的,这导致每次对String字符串进行操作,都会生成新的String对象,然后再将指针指向新的String对象,这样不仅导致效率低下,还会浪费内存空间。 我们来看下St

qq_49180959的博客 441

String和StringBuilder和StringBuffer

本文对比分析Java中String、StringBuilder和StringBuffer的特性与适用场景。String具有不可变性,线程安全但性能较差;StringBuilder线程不安全但性能最优,适合单线程拼接;StringBuffer线程安全但性能稍逊。源码层面,String在JDK9+改用byte[]存储以节省空间,字符串拼接通过编译器优化为StringBuilder操作。StringBuilder/StringBuffer基于可扩容char[]实现,后者通过synchronized保证线程安全。

NingMaoKing的博客 1024

String、StringBuilder 和 StringBuffer 的区别

String、StringBuilder 和 StringBuffer,SpringBoot,SpirngCloudAlibaba,SpringBoot+Vue

QQ903275718的博客 1108

String,StringBuffer和StringBuilder的区别及StringBuffer和StringBuilder的扩容原理

String字符串类型String是我们开发中最常使用的引用类型,我们用双引号"..."引起来的内容是字符串。1.String 不可变性​ String类型的字符串值是不可改变的,String底层是final修饰的char[],String也是一个final类,内部声明的变量也是final类型的所以String类型的值不可变,只会重新生成新的对象,指针指向新的地址,修改String字符串的值实际上是重新创建一个新的存储空间来存值,然后指针重新指向新的存储空间。

m0_65334245的博客 1072

String和StringBuffer的详解,联系和区别

StringBuffer是一个具有对象引用传递特点的字符串对象。 StringBuffer对象可以调用其方法动态的进行增加、插入、修改和删除操作,且不用像数组那样事先指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串非常灵活方便。 一旦通过StringBuffer生成最终想要的字符串,就可调用它的toString方法将其转换为一个String对象。 那么有人就问StringBuff...

xxx 5889

string,stringbuffer和stringbuilder的区别

string和stringbuffer和stringbuilder的区别: String:不可变字符序列;底层使用char[]存储; StringBuffer:可变字符序列;线程安全的,效率低;底层使用char[]存储; StringBuilder:可变字符序列;线程不安全的,效率高;底层使用char[]存储; 在单线程情况下执行效率大部分情况为:StringBuilder>StringBuffer>String – StringBuilder与StringBuffer有公共父类Abstr..

mofeigege的博客 487
上一篇: final关键字
下一篇: struts2.0深入理解
java05
博客等级 码龄18年 21粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值