String与StringBuffer、StringBuilder对比

java StringBuilder详解 NULL 博文链接:https://hui-jing-880210.iteye.com/blog/2173195 立即下载

1. String

1.1不变性

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

从上述String的源码中,可以看出如下两点:

  • String类被final修饰,String类不能再被继承,也即对String 的操作方法,不会再被继承重写;
  • String的底层实现是通过char类型的字符数组value而实现,value同时也被final修饰,也即在赋值后无法修改;且访问权限是private,外部无法访问,而String本身也无修改的方法,所以value赋值后,内存地址无法修改;

因为String 的不变性所以String 的大多数操作方法都会返回新的String,如:

		String aString = "123aaaaabbb";
		aString.replace("3", "b");
		System.out.println(aString); // 输出 "123aaaaabbb"
		String repStr =aString.replace("3", "b");
		System.out.println(repStr);// 输出 "12baaaaabbb"
  • 意义及应用

1.满足字符串常量池的设计
只有字符串是不可变的,字符串池才能实现,字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现,(String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。
字符串常量池在Java堆内存中的体现2.安全性考量
在应用方面:如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。
在线程安全方面:因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。
3.允许String对象缓存HashCode
因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。

1.2相等判断

		repStr.equals(aString);
//equals源码
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

如上为String类中的equals方法,首先判断对象是引用是否相同,然后判断是否为String对象,判断长度,最后逐位对比。

2.与StringBuffer及StringBuilder对比

通常情况,执行速度 StringBuilder > StringBuffer > String;

2.1 String 类型和 StringBuffer 的主要性能区别:

String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
在某些特别情况下, String 对象的字符串拼接其实是被 Java Compiler 编译成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,例如:

String s1 = “This is  a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is  a”).append(“ simple”).append(“ test”);

生成 String s1 对象的速度并不比 StringBuffer 慢。其实在 Java Compiler 里,自动做了如下转换:

Java 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。

2.2 StringBuilder 类型和 StringBuffer 的主要性能区别:

StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

2.3 使用原则

(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();

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

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

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

文章来源:
https://blog.youkuaiyun.com/kingzone_2008/article/details/9220691
https://www.imooc.com/read/47

Superpowers与 OpenSpec、Spec Kit 对比 按照官方仓库定义,Superpowers 是一套构建在 composable skills 之上的完整软件开发工作流。它不是单纯的 prompt 集合,而是把一系列工程动作做成默认流程。一个需要明确的点:Superpowers 并不只偏 Claude Code,根据。 阅读详情

相关推荐

乐鑫WIFI芯片开发流程梳理-工具链、编译和下载

最近开始基于乐鑫ESP32的WIFI模组的软件开发,首先要做整套流程的梳理,乐鑫官网以及安信可上已经有了较为系统的资料,但是在实现过程中也遇到了一些问题,花了几天去解决,所以为了总结,也为了给其他人提供一些借鉴,把流程分享一下,官网上相对比较完善的,就不在赘述。 1. 开发方案选择 目前网上有两套较为成熟的方案: (1)基于乐鑫官网推荐的开发方式,原网页:https://docs.espress...

一名嵌入式软件工程师的自我成长 3926

String类和StringBuffer/StringBuilder常用方法

关Java JDK中内置的一个类:java. lang. String的介绍 1、String表示字符串类型,属于引用数据类型,不属于基本数据类型。 2、在java 中随便使用双引号括起来的都是String对象。例如: “abc”,“def”, “hello world!” ,这是3个String对象。 3、java 中规定,双引号括起来的字符串,是不可变的,也就是说"abc"自出生到最终死亡,不可变,不能变成"abcd",也 4、在JDK 当中双引号括起来的字符串,例如: “abc” “def” 都是直接

weixin_46489622的博客 578

Centos7搭建OpenStack+创建iaas云主机

主要说明在控制节点和计算节点上,通过脚本的形式,安装OpenStack的iaas安装步骤和创建可运行的云主机。提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。

weixin_48218106的博客 1万+

String StringBuffer StringBuilder

String类 String类是java.lang包下的类,他是封装char[ ]的类,他不是基本类型,但却是使用最为普遍的类之一。 String实现了三个接口 序列化java.io.Serializable,比较Comparable<String>,和数组可读序列Comparable<String> 他是一个final类, ...

i的博客 245

Mann-Kendall检验全解析:从原理到11种变体及Python实现

本文全面解析Mann-Kendall检验,从基础原理到应对自相关、季节性等复杂数据的11种关键变体,如Hamed-Rao修正、季节性MK和趋势自由预白化(TFPW)。详细阐述各方法的适用场景与数学原理,并提供完整的Python实战代码,帮助研究者针对不同数据特性选择最稳健的趋势分析方法。

weixin_29050271的博客 459

VINS-Mono 时延估计论文翻译

Online Temporal Calibration for Monocular Visual-Inertial Systems 摘要 精确的状态估计是机器人导航、自主驾驶、虚拟现实和增强现实等各种智能应用的基础模块。视觉惯性融合是近年来流行的六自由度状态估计技术。记录不同传感器测量值的时刻对系统的鲁棒性和准确性至关重要。在实践中,每个传感器的时间戳通常会受到触发和传输延迟的影响,从而导致不同传感器之间的时间偏差(时间偏移)。这种时间偏移严重影响传感器融合的性能。为此,我们提出了一种标定视觉和

weixin_39061796的博客 1255

java中关于字符串String和StringBuilder的用法及代码

1.输入一个字符串,要求遍历字符串,求出字符串的长度和打出它的每个字符。 import java.util.Scanner; public class Practice16 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入一个字符串:"); String line=sc.nextLine();

weixin_57748215的博客 508

RK3568开发笔记- (TX/RX) RGMII delayline 功能调试

本文详细介绍了RK3568芯片RGMII接口delayline功能的调试过程。针对千兆以太网通信不稳定问题,通过分析RGMII时序要求,利用RK3568内置的delayline功能补偿信号延迟。调试方法包括扫描delayline窗口、测试中间值配置、优化硬件设计等步骤。文章还总结了常见问题解决方案,如PHY选型建议和自动扫描功能配置。最终实现了千兆速率下丢包率降至0.01%以下的目标,为类似开发场景提供了实用参考。

flypig has a dream! 317

String与StringBuilder辨析

            首先要知道String是一个不可变字符串类型,StringBuilder是一个可变字符串类型,StringBuilder的可变机制是字符串扩容。StringBuilder最先指定长度是17,一旦超过这个长度,StringBuilder便会生成另一个数组而且长度是上一个数组的2倍+2。Eclipse:源码如下图append()函数里有ensureCapacityInterna...

Liu_Fangyuan的博客 308

液滴碰撞壁面的过程背景论文——bouncing反弹,spreading扩展,splashing飞溅。铺展过程介绍。还存在很多未解之谜。

【1993-德国-Phenomena of liquid drop impact on solid and liquid surfaces】液滴碰撞壁面的过程背景——bouncing反弹,spreading扩展,splashing飞溅。还存在很多未解之谜。还存在很多未解之谜。不同液滴形状碰撞过程。

qq_15963745的博客 200

人工智能训练师三级考试题型全解析|190道真题样例+30天备考路线

人工智能训练师三级考试并不神秘:理论考190道选择题(刷题就能过),实操考代码+方案设计(练练就会)。核心是花时间——30天系统备考,足以从容通过。如果你想从零开始系统备考,覆盖所有考点和实操技能,欢迎查看我的专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程六大模块知识点逐个击破,每个考点都讲透实操代码题手把手教学,附带完整参考代码高频考点速记 + 易错题精讲 + 3套模拟试卷30天备考计划 + 冲刺复习策略。

白话机器学习 6083

String及常用方法、StringBuilder及常用方法

*检索给定字符串在当前字符串中的开始位置----根据字符串找对应位置(下标)检索给定字符串在当前字符串中最后一次出现的位置// 111111---和下面数连起来为10,11,12,13,14,15 // 0123456789012345 String str = "thinking in java";//检索in在str中第1次出现的位置 System . out . println(index);

weixin_51140686的博客 723

2026 AI浏览器Agent终极对比:BrowserAct、agentBrowser、PP-Browser 谁更适合落地?(安装+实战+场景全覆盖)

1.不要盲目追求最新框架:很多人跟风用agentBrowser,结果业务是多步骤复杂办公流程,反而不如BrowserAct稳定;2.风控场景优先PP-Browser:但凡需要登录账号、频繁访问正规平台,无脑选PP-Browser,能避开99%的封禁问题;3.AI批量解析优先agentBrowser:做知识库爬取、网页内容总结、批量问答,省Token就是省成本,长期使用性价比碾压另外两者;4.个人开发调试优先BrowserAct:容错高、日志全、调试简单,新手上手最快,不容易报错翻车。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 335

Java--String、StringBuilder及StringBuffer区别及性能对比

【学习背景】 主要是想通过OpenJDK提供的JMH工具测试下String、StringBuilder及StringBuffer字符串拼接的效率如何~ 关于JMH的介绍及具体使用,我的这篇博文中有介绍: Java–☀️面试官:LinkedList真的比ArrayList添加元素快?❤️‍本文通过Open JDK JMH带你揭开真相《⭐建议收藏⭐》 当然,除了主要验证三者的字符串拼接效率之外,还会对三者做一些区别分析及常见面试问题总结,希望加深自己对这三者的认知,分享出来,也希望能帮助到有需要的小伙伴~

JustinQin 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

String StringBuilder StringBuffer 对比 总结得非常好

转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论。还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸裸的站在我们这些Java色狼面前了。嘿嘿.... 众所周知,

clam_clam的专栏 3万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

String StringBuilder StringBuffer 对比 总结得非常好

效率比较String 但是在 String S1 = “This is only a” + “ simple” + “ test”时,String效率最高。针对这个问题表示有点晕,多方查资料进行一下解惑。 接下来的内容转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论。还是觉得有必要让这个

Happy_wu的专栏 422

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java面试-String、StringBuilder 和 StringBuffer 的区别与性能对比

《Java面试200问:String、StringBuilder与StringBuffer深度解析》是一篇针对Java字符串处理核心知识的专业指南。文章通过一个实际案例揭示字符串拼接的性能陷阱,系统对比了String、StringBuilder和StringBuffer三大类的特性差异: String的不可变性导致拼接性能极差,适合存储常量 StringBuilder采用可变字符数组,单线程下性能最优 StringBuffer通过synchronized实现线程安全,但性能折中。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

String StringBuffer StringBuilder 区别详解与对比分析

String:适合处理少量的字符串操作,或需要线程安全的场景。:适合在多线程环境下进行大量的字符串操作。:适合在单线程环境下进行大量的字符串操作,性能最佳。在实际开发中,应根据具体场景选择合适的字符串处理类,以平衡性能和线程安全性的需求。

yt94832的博客 625

Stringbuilder,Stringbuffer,String速度对比

对比 String和StringBuilder的对比在于String的字符是存储在一个被final修饰的char数组(类似于c中的指针常量)中的,而StringBuilder的字符是存储在一个普通的char数组中的。所以String要比StringBuilder慢很多。 而StringBuilder和StringBuffer对比又在于: StringBuffer类会加锁,它为了多线程而设计的,这样...

NinoSun的博客 451

String、StringBuffer、StringBuilder的对比

String、StringBuffer、StringBuilder三者的比较 String、StringBuffer、StringBuilder三者的异同? String:不可变的字符序列;底层使用char[]存储 StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储 StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储 String str = new String();//char[] value = new c

qq_45922060的博客 135

String,StringBuffer,StringBuilder三者区别及其对比测试

速度的快慢,用实验来说话,(针对100000个随机字符)如图: 1.首先是运行速度:StringBuilder &gt; StringBuffer &gt; String Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢,而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对...

l8947943的博客 1539

Java面试要点03 - String、StringBuilder与StringBuffer全面对比

通过深入理解String、StringBuilder和StringBuffer的特性,我们可以在开发中做出更好的选择。String的不可变性使其适合作为常量和安全性要求高的场景;StringBuilder的高性能使其成为单线程字符串操作的首选;而StringBuffer的同步特性则使其适用于多线程环境。在实际应用中,应该根据具体需求,权衡性能和安全性,选择最合适的字符串处理类。今天的内容就到这里了,希望可以对你有帮助。

程序媛学姐的博客 1011

String,StringBuffer,StringBuilder对比

运行结果是:分析原因:String是java里面一个不可变化字符串,如果有修改,要新开辟内存空间,废除过去的内存空间,这会导致大量的GC回收,性能在拼接过多字符串的时候会越来越差。而StringBuffer,StringBuilder都是动态字符串,可以随意拼接。

weixin_42924400的博客 432

String/StringBuffer/StringBuilder对比

java当中的字符串涉及到三个类String、StringBuffer和StringBuilder,他们特点不同,使用的场景也不同。

Monkey__z的博客 1925

String,StringBuilder,StringBuffer性能对比

循环1000次 String StringBuilder StringBuffer 循环100000次 String StringBuilder StringBuffer 可以看到String拼接字符串的时候已经很慢了 那为什么StringBuffer和StringBuilder的速度差不多呢?StringBuffer不是线程安全的吗?不是应该更慢吗?试下...

24号的救赎 386

String、StringBuffer、StringBuilder对比

String、StringBuffer、StringBuilder对比 String类型 源码: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; ... ... }

不问世事的码农 365
上一篇: 算法OJ—回溯(二)_三阶幻方
下一篇: Java中Comparable与Comparator的原理及使用
GuoMell
博客等级 码龄11年 30粉丝 29原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值