【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的温室智能监测控制系统设计是一个综合性的项目,旨在实现对温室内环境参数的实时监测和控制…

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

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

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

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

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

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

2.4 比较检验 机器学习

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

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

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

区间开关灯模型

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…

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

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

FCP270 P0917YZ 兼容性如何

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

HWOD:名字的漂亮度

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

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

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

实验3 中文分词

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

火山引擎VeDI:A/B测试开放平台正式上线,企业个性化平台一键定制

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 火山引擎数智平台VeDI旗下的A/B测试平台&#xff08;DataTester&#xff09;&#xff0c;旨在为企业提供科学且可信的A/B测试能力及丰富的场景实验支持。随着企业的…

java常用优秀开发框架及工具类汇总

目录 1、各类系统及简称扫盲2、开发框架2.1、若依(ruoyi) 3、工具组件3.1、java工具类库3.1.1、HuTool3.1.2、office、excel、pdf文档处理3.1.3、运行日志管理3.1.4、数据层框架3.1.5、数据库连接池 java发展了很多年&#xff0c;为了便于开发&#xff0c;出现刴优秀的开发框架…

知识图谱操作的探索与利用

目录 前言1 搜索&#xff08;Search&#xff09;1.1 基于关键词搜索1.2 属性搜索1.3 模式匹配 2 过滤&#xff08;Filtering&#xff09;2.1 属性过滤2.2 关系过滤 3 引导&#xff08;Guidance&#xff09;3.1 相关实体推荐3.2 路径推荐 4 合并&#xff08;Merging&#xff09;…

WPF自定义Panel:让拖拽变得更简单

在 WPF 应用程序中&#xff0c;拖放操作是实现用户交互的重要组成部分。通过拖放操作&#xff0c;用户可以轻松地将数据从一个位置移动到另一个位置&#xff0c;或者将控件从一个容器移动到另一个容器。然而&#xff0c;WPF 中默认的拖放操作可能并不是那么好用。为了解决这个问…

智慧公厕的技术融合策略

智慧公厕是迎合现代城市发展需要的一项重要基础设施&#xff0c;其设计的技术融合策略在实现公共厕所泛在感知、互通互联、协同构筑智慧城市等方面起到了关键作用。本文将以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景实图实例&#xff0c;从物…

数字兆欧表的量程选择技巧,你需要知道的秘密!

使用数字兆欧表的方法如下&#xff1a; 步骤一&#xff1a;准备工作 在开始操作之前&#xff0c;务必确保待测电气设备已经断电并进行了充分放电&#xff0c;以保证操作的安全性。此外&#xff0c;还需检查数字兆欧表的电量是否足够&#xff0c;外观是否完好&#xff0c;并确保…

元宇宙虚拟展厅——虚拟场景同现实世界的结合宣传

元宇宙作为具有前瞻性和先导性的未来产业&#xff0c;在政策布局、产业发展以及应用融合等方面也都实现了诸多探索。元宇宙虚拟展厅是虚拟场景同现实世界的结合&#xff0c;元宇宙与展厅的应用融合打破了传统展厅、传统宣传对时间和空间的限制&#xff0c;以往我们印刷过数不胜…

Wagtail-基于Python Django的内容管理系统CMS实现公网访问

目录 ⛳️推荐 前言 1. 安装并运行Wagtail 1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具 3. 实现Wagtail公网访问 4. 固定Wagtail公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给…