String、StringBuffer、StringBuilder的区别

2023-11-18

转载:极客时间-JAVA核心技术36讲
     https://www.cnblogs.com/ygj0930/p/6581009.html
一、String创建机制

    JAVA语言在创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建,而是直接从池中刚查找到
的对象引用;如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。但是,通过new方法创建的String对象
是不检查字符串池的,而是直接在堆区或栈区创建一个新的对象,也不会把对象放入池中。上述原则只适用于通过直接量给String
对象引用赋值的情况。


二、String对象创建的两种方式:

    1、String str = "str" ;//通过直接量赋值方式,放入字符串常量池。
        
    2、String str = new String("str");//通过new方式赋值方式,不放入字符串常量池。

    注:String提供了intern()方法。调用该方法时,如果常量池中包括了一个等于此String对象的字符串(由equals方法确定),
则返回池中的字符串。否则,将此String对象添加到池中,并且返回此池中对象的引用。


public final class String implements Serializable, Comparable<String>, CharSequence {}

private final char value[];

private int hash; // Default to 0

从上述代码中可以看到:String类是一个final类型的类,所以String类不可被继承,同时String对象的值也不能进行修改。

三、String的特性

    [A] 不可变。是指String对象一旦生成,则不能再对它进行改变。不可变的主要作用在于当一个对象需要被多线程共享,并且访
问频繁时,可以省略同步和锁等待的时间,从而大幅度提高系统性能。不可变模式是一个可以提高多线程程序的性能,降低多线程
程序复杂度的设计模式。
    [B] 针对常量池的优化。当2个String对象拥有相同的值时,他们只引用常量池中的同一个拷贝。当同一个字符串反复出现时,这
个技术可以大幅度节省内存空间。


四、String “+”的中作用

    用String类重载的 “+” 拼接字符串时,可以在 “+” 前后跟其他数据类型,不一定是string类型。其他类型数据会自动
“向高看齐”转化为String类型。
    重载的 “+” 操作符,其实是创建一个StringBuffer或StringBuilder对象,用append方法对字符串进行连接,最后调用
toString方法返回String字符串。 


注意用 + 拼接字符串的两种情况:

    4.1)用 “+” 拼接两个字符串变量:

        String str_1 = "str" ;
        String str_2 = "ing" ;
        String str_1_1 = str_1 + str_2;
        String str_1_2 = "string";

    解析:这里用 “+” 拼接的是两个字符串变量,所以会首先创建一个StringBuffer/StringBuilder,然后 append(str_1)
.append(str_2) 把str_1和str_2拼接起来,最后通过toString()生成一个新的String对象并把引用返回,赋值给str。所以,
这里的 str_1_1==str_1_2 结果是false。这里创建了新的String对象。

    4.2)用 “+” 拼接两个字符串字面量:

        String str1="str"+"ing";
        String str2="string";

    解析:用 + 拼接两个字符串字面量时,JVM会自动把这两个字面量的合并值作为一个完成的字符串常量值,保存到常量池
的字符串常量表中。因此,这里 str1==str2 结果是true。这里没有创建新的String对象,只是把拼接结果作为拘留字符串的
保存地址返回。
    
一、StringBuffer/StringBuilder

    StringBuffer和StringBuilder都实现了AbstractStringBuilder抽象类,拥有几乎一致对外提供的调用接口;其底层在
内存中的存储方式与String相同,都是以一个有序的字符序列(char类型的数组)进行存储,不同点是StringBuffer/
StringBuilder对象的值是可以改变的,并且值改变以后,对象引用不会发生改变;两者对象在构造过程中,首先按照默认大小申
请一个字符数组,由于会不断加入新数据,当超过默认大小后,会创建一个更大的数组,并将原先的数组内容复制过来,再丢弃旧
的数组。因此,对于较大对象的扩容会涉及大量的内存复制操作,如果能够预先评估大小,可提升性能。唯一需要注意的是:
StringBuffer是线程安全的,但StringBuilder是线程不安全的。可参看Java标准类库的源代码,StringBuffer类
中方法定义前面都会有synchronize关键字。为此,StringBuffer的性能要远低于StringBuilder。

    1.1、应用场景
    [A]在字符串内容不经常发生变化的业务场景优先使用String类。例如:常量声明、少量的字符串拼接操作等。如果有大量
的字符串内容拼接,避免使用String与String之间的“+”操作,因为这样会产生大量无用的中间对象,耗费空间且执行效率低下
(新建对象、回收对象花费大量时间)。

    [B]在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程环境下,建议使用StringBuffer,
例如XML解析、HTTP参数解析与封装。

    [C]在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程环境下,建议使用StringBuilder,
例如SQL语句拼装、JSON封装等。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String、StringBuffer、StringBuilder的区别 的相关文章

  • PHP 的 mb_internal_encoding 实际上是做什么的?

    根据 PHP 网站 http www php net manual en function mb internal encoding php它这样做 coding 是用于 HTTP 输入的字符编码名称 字符编码转换 HTTP输出字符编码 转
  • 如何在字符串vba中包含引号

    我想存储以下文本 Test1 Monday Test Abcdef 全部在字符串中包含引号 我知道要在字符串中包含引号 我必须包含 之前 但在这里这不是一个很好的解决方案 因为我在文本中有太多这样的解决方案 知道如何一次完成这一切吗 您有两
  • Swift:检查 UISearchBar.text 是否包含 url

    如何检查 UISearchBar text 是否包含 URL 我想做这样的事情 if searchBar text NSTextCheckingType Link 但我收到错误 String is not convertible to NS
  • 静态字符串文字表?

    在 C 中创建全局静态字符串表的正确方法是什么 我所说的 全局 是指 可从包含标头的任何文件中使用 但不是某些运行时创建的单一对象的一部分 我所说的 静态 是指 尽可能少地设置运行时间 只读内存页中的数据 每个应用程序只有 1 个数据实例
  • 如何在Python中按AaB而不是ABa顺序对字符串进行排序

    我正在尝试对字符串进行排序 为 punnetsquare 制作基因型 我目前的实现是 unsorted genotype ABaB sorted genotype sorted list unsorted genotype sorted s
  • C 中的指针、数组、字符串和 Malloc

    我目前正在学习 C 语言中的字符串 指针和数组 我尝试编写一个程序 其中数组保存三个指向字符串地址的指针 这一切似乎都有效 但程序的行为很奇怪 这是代码 char getUserDetails char host localhost cha
  • strtok - 如何避免换行并放入字符串数组?

    如果我欺骗了主题 我真的很抱歉 我在这里搜索但没有结果 我有代码 void split char str char splitstr char p char splitbuf 32 int i 0 p strtok str while p
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • XSL字符串多重替换功能

    如何让这个函数进行多重替换 经验 替换aaa with 111并替换bbb with 222 etc
  • 清洁琴弦的更好方法?

    我正在使用这种方法来清理字符串 public static string CleanString string dirtyString string removeChars lt gt string result dirtyString f
  • .join() 方法到底是做什么的?

    我对 Python 还很陌生 并且完全困惑 join 我读过的是连接字符串的首选方法 I tried strid repr 595 print array array c random sample string ascii letters
  • PHP:将多字节字符串(单词)拆分为单独的字符

    尝试使用 mb split 将这个字符串 主楼怎么走 分割成单独的字符 我需要一个数组 但没有成功 有什么建议吗 谢谢你 例如 尝试使用带有 u 选项的正则表达式 chars preg split u string 1 PREG SPLIT
  • 返回类型时 c_str() 与 data()

    在C 11之后 我想到了c str and data 同等地 https stackoverflow com questions 194634 string c str vs data C 17 为后者引入了一个重载 它返回一个非常量指针
  • 如何从 JavaScript 中的字符串中删除空白字符?

    如何从 JavaScript 中的字符串中删除空白字符 修剪很容易 但我不知道如何将它们从inside字符串 例如 222 334 gt 222334 您可以使用正则表达式 如下所示来替换所有空格 var oldString 222 334
  • 使用信用卡号的字符串格式

    我正在尝试将信用卡号显示为类似 的字符串 I tried txtbox Text string Format 0 ccNumber 但它不起作用 有任何想法吗 String Format 0 0000 0000 0000 0000 numb
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 如何使用正则表达式将字符串分成相同字符的组?

    我有一个这样的字符串 var string AAAAAAABBBCCCCCCDD 并喜欢将字符串分割成这种格式的数组 same characters gt same group 使用正则表达式 Array AAAAAAA BBB CCCCC
  • 检查 PHP 中的字符串长度

    我有一个长度为 141 个字符的字符串 使用下面的代码我有一个if如果字符串大于或小于 140 则语句返回一条消息 libxml use internal errors TRUE dom new DOMDocument dom gt loa
  • 将名称字符串编码为唯一的数字

    我有一大堆名字 数以百万计 他们每个人都有一个名字 一个可选的中间名和一个姓氏 我需要将这些名称编码为唯一代表这些名称的数字 编码应该是一对一的 即一个名称只能与一个数字相关联 一个数字只能与一个名称相关联 对此进行编码的明智方法是什么 我
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网

随机推荐

  • java代理

    静态代理 import java util logging Level import java util logging Logger 定义接口 代理类和被代理类都要实现这个接口 interface IHello public void h
  • KALI中Arping的使用方法(2023)

    一 介绍 ARP协议是 Address Resolution Protocol 地址解析协议 的缩写 在同一以太网中 通过地址解析协议 源主机可以通过目的主机的IP地址获得目的主机的MAC地址 arping程序就是完成上述过程的程序 arp
  • 【YOLOv5-6.x】解决加入CA注意力机制不显示FLOPs的问题

    1 问题描述 问题源自之前写的一篇博客 魔改YOLOv5 6 x 中 加入ACON激活函数 CBAM和CA注意力机制 加权双向特征金字塔BiFPN 尝试在YOLOv5的backbone中加入Coordinate Attention 虽然加入
  • 程序员应了解的那些事(5)C++迭代器之iterator_traits/iterator_category

    lt 1 gt traits 所谓traits 可以理解为 萃取机 作用就是 你丢给他什么东西 他会给你拿出你想要的特性 迭代器的特性 iterator traits lt gt lt 2 gt 迭代器的属性迭代器是沟通算法和容器的桥梁 一
  • 小程序获取链接中的参数

    onLoad function options if options null options undefined options sharetype null options sharetype gt 0 console log opti
  • 【Android入门到项目实战-- 7.3】—— 如何调用手机摄像头和相册

    目录 一 调用摄像头拍照 二 打开相册选择照片 学完本篇文章可以收获如何调用手机的摄像头和打开手机相册选择图片功能 一 调用摄像头拍照 先新建一个CameraAlbumTest项目 修改activity main xml 代码如下 按钮打开
  • 零基础学习hadoop到上手工作线路指导(不断更新)

    本帖最后由 pig2 于 2014 2 23 10 22 编辑 零基础学习hadoop 没有想象的那么困难 也没有想象的那么容易 在刚接触云计算 曾经想过培训 但是培训机构的选择就让我很纠结 所以索性就自己学习了 整个过程整理一下 给大家参
  • python处理excel数据

    文章目录 前言 一 用到的模块是什么 二 execl表格的样式 三 模块的使用 1 引入模块 2 读取excel表数据 3 将写入excel表 四 代码分析 1 代码逻辑 2 选出有用的股票号并与回报率关联 3 将全部数据按照所需要的股票号
  • safari无法打开网页是什么原因?mac上的Safari浏览器打不开网页怎么办?

    只要是MacOS系统的都会附带一个Safari浏览器 完美兼容Mac PC 及 iPod touch iPhone iPad 功能和性能自然是不错的 但是也会出现如safari浏览器无法打开网页的情况 那么safari无法打开网页是什么原因
  • 快速构建一个免费的IP代理池

    文章使用的代理ip链接为 云代理 http www ip3366 net stype 1 page 1 验证IP网站为 http http httpbin org ip get方式请求进去 要设置好请求头 cookie self faker
  • 2019上半年勒索病毒专题报告

    2019上半年由勒索病毒攻击造成的国内外大小事件 可发现伴随着传统行业逐渐数字化 网络化 智能化 逐步拥抱产业互联网化的大浪潮中 暴露出一系列网络安全问题 勒索病毒也乘机发难 疯狂敛财 影响日渐扩大 全球范围内的交通 能源 医疗等社会基础服
  • thinkpad计算机快捷键,Thinkpad笔记本键盘F1-F12功能键详细介绍

    Thinkpad笔记本电脑F1 F12快捷键的功能是什么 笔记本电脑F1 F12总共12个功能键 每个键的作用不一样 同一个键 不同机型的作用也不一样 通过这些快捷键可以快速调整音量 亮度 开启无线功能等等 Thinkpad笔记本电脑机型特
  • 看小白如何解决ajax跨域问题

    由于此前很少写前端的代码 哈哈 不合格的程序员啊 最近项目中用到json作为系统间交互的手段 自然就伴随着众多ajax请求 随之而来的就是要解决ajax的跨域问题 本篇将讲述一个小白从遇到跨域不知道是跨域问题 到知道是跨域问题不知道如何解决
  • elementui把上传的图片转为base64

    使用组件 然后on change绑定一个方法来获取文件信息 auto upload设置为false即可
  • 具有文件操作和滤波功能的Open3D软件界面(附python pyqt 代码)

    安装依赖 pip install pyqtgraph i https pypi tuna tsinghua edu cn simple pip install pyopengl i https pypi tuna tsinghua edu
  • python 100以内的质数

    可以使用for循环 求100以内的质数 i 2 for j in range 1 101 如果100以内的数字除以2的余数等于0 if j i 0 如果是就跳过 继续下一个循环 continue print j 要找出从1到100之间的质数
  • 在 Python 中打印变量之间没有空格

    文章目录 使用 sep 参数打印变量之间没有空格 使用加法 运算符打印不带空格的变量 在 Python 中不使用换行符或空格打印 使用格式化的字符串文字来打印没有空格的变量 例如 print f hello variable 1 格式化字符
  • oracle 重设redo log 和倒入

    重设redo log alter system set allow resetlogs corruption true scope spfile recover database until cancel using bakcup cont
  • [RK3288][Android6.0] 调试笔记 --- 系统第一次开机进入Recovery模式原因

    Platform ROCKCHIP OS Android 6 0 Kernel 3 10 92 描述 当系统全部download开机后 会默认进入Recovery模式 这个其实是misc分区里的内容在作怪 misc分区 misc img是R
  • String、StringBuffer、StringBuilder的区别

    转载 极客时间 JAVA核心技术36讲 https www cnblogs com ygj0930 p 6581009 html 一 String创建机制 JAVA语言在创建一个字符串时 首先检查池中是否有值相同的字符串对象 如果有则不需要