【Java扫盲篇】String、String Buffer和String Builder的区别

你在面试时,面试官让你讲讲String String Buffer String Builder的区别,你是否能流畅的、完整的叙述出他们三者的区别?

✍先说结论

  • 相同点: 他们的底层都是由char数组实现的。
  • 不同点:
  1. String对象一旦创建,是不能修改的,如果要修改,会重新开辟空间来存储修改后的对象;而String Buffer和String Builder创建的对象是可以修改的。
  2. String Buffer是线程安全的,他几乎所有方法都被synchronization 所修饰,允许采用多线程的方式执行添加或删除字符的操作,但是效率比较低;而String Builder是单线程的。如果所有字符串在一个单线程中编辑(通常都是这样),则应该使用String Builder。这两个类的API大部分是相同的。
    总结
  • 当在程序中需要频繁的更改字符串的内容时,不要使用String(会浪费大量的空间)
  • 如果是要考虑线程下的安全问题时,使用StringBuffer
  • 否则使用String Builder

✍String类

String的三种构造方法

public static void main(String[] args) {// 使用常量串构造String s1 = "hello bit";System.out.println(s1);// 直接newString对象String s2 = new String("hello bit");System.out.println(s1);// 使用字符数组进行构造char[] array = {'h','e','l','l','o','b','i','t'};String s3 = new String(array);System.out.println(s1);
}

我们要理解String类,首先要搞清楚String的底层
通过源码可以看出
String是一个引用类型

在这里插入图片描述

我们举几个实际的例子
来更清楚的了解String的本质

请你先判断这个表达式的结果是什么
在这里插入图片描述

答案为true
我们画图来理解
在这里插入图片描述

再判断一下这个表达式的值是什么
在这里插入图片描述

结果为false
在这里插入图片描述

✍字符串的不可变性

在这里插入图片描述
在这里插入图片描述

  1. String类被final修饰,表明该类不能被继承
  2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。

✍为什么String要设置成不可变类型

  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.
  2. 不可变对象是线程安全的.
  3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中

易错点

在这里插入图片描述

  • Java中有常量优化机制,“Hello"和"World"本身就是字符串常量,所以在编译时,会直接把"Hello"和"World"合并成"HelloWorld"字符串,又因为在执行s3的时候已经在常量池中创建了"HelloWorld".
  • 当变量与字面量或变量与变量进行拼接时,会在堆中创建一个StringBuilde对象,然后使用StringBuilder的append()方法将变量与字面量或变量与变量进行拼接,最后调用toString()方法转成String对象。所以s5、s6、s7指向的都是堆内存中String对象的地址值。
public static void main(String[] args) {final String s1="Hello"; String s2="HelloWorld";String s3=s1+"World";System.out.println(s2==s3); //true
}

被final修饰表示是一个常量,所以此时s1+“World"就相当于"Hello”+“World”,结果仍然是一个常量。

有人说:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。
这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。

所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!💞💞💞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32温室智能监测控制系统设计

**单片机设计介绍,基于STM32温室智能监测控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于STM32的温室智能监测控制系统设计是一个综合性的项目,旨在实现对温室内环境参数的实时监测和控制…

Centos7.9备份mysql数据库

1. 备份 备份shell脚本 [rootiZoqvrzbtnzd6kZ local]# vi mysql_backup.sh #!/bin/bash #设置MySQL登录信息 MYSQL_USER"root" MYSQL_PASSWORD"**********" MYSQL_DATABASE"ubox" BACKUP_DIR"/usr/local/mysql_backup" MONTH"…

2024年14款国内外主流低代码开发平台对比:总有一款适合您!

低代码开发平台是一种更偏向于赋能技术人员的工具,它允许开发人员通过将可视代码块拖放到工作流中来创建应用程序,从而以最少的手工编码快速设计应用程序。 市场中有非常多的低代码开发平台,令人眼花缭乱。应当选哪个低代码开发平台&#xf…

“数字直角三角形”的循环简化

【题目描述】 给出n(1<n<13)&#xff0c;请输出一个直角边长度是n的数字直角三角形。 【样例输入】 5 【样例输出】 0102030405 06070809 101112 1314 15 【题目来源】 洛谷P5721 【深基4.例6】数字直角三角形 【解析】 本题的样例输出一眼望过去就是像一个矩…

12 完全分布式搭建-SSH免密登录

配置 ssh &#xff08;1&#xff09;基本语法 ssh 另一台电脑的 IP 地址 &#xff08;2&#xff09;ssh 连接时出现 Host key verification failed 的解决方法 [ytmaster~]$ ssh slave01 ➢ 如果出现如下内容 Are you sure you want to continue connecting (yes/no)…

简明 Python 教程(第13章 更多Python的内容)

到目前为止&#xff0c;我们已经学习了绝大多数常用的Python知识。在这一章中&#xff0c;我们将要学习另外一些方面的Python知识&#xff0c;从而使我们对Python的了解更加完整 。 特殊的方法 在类中有一些特殊的方法具有特殊的意义&#xff0c;比如__init__和__del__方法&…

代码随想录算法训练营Day36|LC435 无重叠区间LC763 划分字母区间LC56 合并区间

一句话总结&#xff1a;都是和昨天的用最少箭引爆气球类似的题。 原题链接&#xff1a;435 无重叠区间 计数不重叠的区间的个数&#xff0c;然后用总长度减去这个值即可。 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, (a,…

2.4 比较检验 机器学习

目录 常见比较检验方法 总述 2.4.1 假设检验 2.4.2 交叉验证T检验 2.4.3 McNemar 检验 接我们的上一篇《性能度量》&#xff0c;那么我们在某种度量下取得评估结果后&#xff0c;是否可以直接比较以评判优劣呢&#xff1f;实际上是不可以的。因为我们第一&#xff0c;测试…

谭浩强第五版C语言课后习题(编程题)+答案

谭浩强第五版作为初学C语言必读的一本教材&#xff0c;课后习题具有非常大的参考价值&#xff0c;也是很多高校期末考试或者考研的重要参考。在这里我整理了一部分个人认为比较重要的编程题&#xff0c;供大家作参考 1.输入两个数&#xff0c;求他们的最大公约数和最小公倍数&…

区间开关灯模型

P3870 [TJOI2009] 开关 先看一道经典的区间开关灯问题的模型&#xff0c;维护一个lz 每次异或操作就好了 #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; const int N 1e510; const int inf 0x3f3f3f3f; const int…

道可云元宇宙每日资讯|国家能源局:探索推广虚拟电厂等新技术

道可云元宇宙每日简报&#xff08;2024年3月25日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 国家能源局&#xff1a;探索推广虚拟电厂等新技术 国家能源局印发《2024年能源工作指导意见》&#xff0c;其中提出&#xff0c;促进能源新技术应用示范。组织开展能…

卸载docker

对于使用systemd的系统&#xff08;如Ubuntu、Debian、CentOS 7及以上版本&#xff09;&#xff1a; 停止Docker服务&#xff1a; sudo systemctl stop docker 卸载Docker程序包&#xff1a; 对于使用apt的系统&#xff08;如Ubuntu、Debian&#xff09;&#xff1a; sudo a…

RCG如何将带有噪声的表征+条件输入RDM并得到去噪的表征

一、有条件去噪控制 很简单的一个模型&#xff0c;整体来说就是将“内容&#xff08;图像&#xff09;” “图像所对应的标签” “每个噪声表征对应的时间步Timestap”分别输入进线性层Layer&#xff0c;然后将他们的表征相加&#xff08;&#xff09;即可 执行步骤是&…

FCP270 P0917YZ 兼容性如何

FCP270 P0917YZ 是一种现场控制处理器&#xff0c;通常应用于工业自动化和过程控制系统中。 这款现场控制处理器的主要职责是监测和控制多种过程变量&#xff0c;确保系统的正常运行&#xff0c;并且满足生产的要求。以下是关于FCP270 P0917YZ的一些可能用途和特点&#xff1a…

vue3挂载axios挂载全局方法

vue3中在 // main.jsimport axios from "axios"; app.provide("$axios", axios);app.mount("#app");// Home.vue import { inject } from "vue"; const http inject("$axios");const getUser () > {http.post("…

HWOD:名字的漂亮度

一、题目 描述 给出一个字符串&#xff0c;该字符串仅由小写字母组成&#xff0c;定义这个字符串的漂亮度是其所有字母漂亮度的总和 每个字母都有一个漂亮度&#xff0c;范围在1到26之间。没有任何两个不同字母拥有相同的漂亮度。字母忽略大小写。 给出多个字符串&#xff…

MySQL 常用函数总结【持续更新】

1、根据起止日期获取二者之间的秒数 SELECT TIMESTAMPDIFF(SECOND, kssj, jssj) , kssj , jssj from your_table 起止日期应该是DATETIME、TIMESTAMP或DATE类型的列。如果它们是字符串&#xff0c;你可能需要先将它们转换为日期或时间戳类型&#xff1b; 第一个参数&#xf…

船舶航行突发事故3D模拟仿真演练优化搜救路线

在波澜壮阔的海洋世界中&#xff0c;船舶事故与搜救行动始终牵动着无数人的心。为了更好地应对这些挑战&#xff0c;我们倾力打造了3D船舶事故和搜救情景再现系统&#xff0c;旨在以科技之力为海事安全保驾护航。 该系统采用先进的web3D开发渲染技术&#xff0c;能够真实模拟船…

探索ttkbootstrap:让Python GUI开发更简洁高效

介绍 探索ttkbootstrap&#xff1a;让Python GUI开发更简洁高效.在Python的GUI开发领域&#xff0c;有许多优秀的工具和库可以帮助开发者快速构建出漂亮、功能丰富的用户界面。而在这些工具中&#xff0c;ttkbootstrap 脱颖而出&#xff0c;为Python开发者带来了更简洁高效的G…

实验3 中文分词

必做题&#xff1a; 数据准备&#xff1a;academy_titles.txt为“考硕考博”板块的帖子标题&#xff0c;job_titles.txt为“招聘信息”板块的帖子标题&#xff0c;使用jieba工具对academy_titles.txt进行分词&#xff0c;接着去除停用词&#xff0c;然后统计词频&#xff0c;最…