【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修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十六)

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十五六) 一、算法介绍二、使用步骤1.代码2.效果一、算法介绍 写论文当然用RANSAC的优化变种算法MSAC啊,RANSAC太土太LOW了哈哈 MSAC算法(M-estimator Sample Consensus)是RANSAC(Random Sample Consensus)的一种…

初入C++

C 编译时的查找: 先到函数局部域里查找到全局域找 局部域和全局域会改变生命周期。 命名空间域不会影响变量的生命周期。 默认情况下不会到命名空间域去找。(命名空间域内的变量的生命周期是全局的,及不会出命名空间就销毁) 在不同的作用域可以定义同…

Linux系统-----------MySQL 数据类型

目录 MySQL 数据类型 一、数值类型 二、日期和时间类型 三、字符串类型 (1)CHAR类型 (2)VARCHAR类型 (3)CHAR和VARACHAR的比较及其应用场景 MySQL 数据类型 MySQL 中定义数据字段的类型对你数据库的…

OC对象 - Block解决循环引用

文章目录 OC对象 - Block解决循环引用前言1. 循环引用示例1.1 分析 2. 解决思路3. ARC下3.1 __weak3.2 __unsafe_unretained3.3 __block 4. MRC下4.1 __unsafe_unretain....4.1 __block 5. 总结5.1 ARC下5.2 MRC下 OC对象 - Block解决循环引用 前言 本章将会通过一个循环引用…

深入解析RSA算法原理及其安全性机制

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 一、RSA算法简介二、RSA算法原理2.1 背景与数学基础2.2 密钥生成2.3 加密过程2.4 解密过程 三、安全性考虑四、RSA的使用五、…

P2602 [ZJOI2010] 数字计数

经典计数问题&#xff0c;注意0的判断 所以要引入前导0标记 #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; #define int long long const int N 1e510; const int inf 0x3f3f3f3f; const int mod 1e97; int gcd(…

华为OD机试 - 考古问题 - 回溯、全排列问题(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

自动化测试:Selenium中的时间等待

在 Selenium 中&#xff0c;时间等待指在测试用例中等待某个操作完成或某个事件发生的时间。Selenium 中提供了多种方式来进行时间等待&#xff0c;包括使用 ExpectedConditions 中的 presence_of_element_located 和 visibility_of_element_located 方法等待元素可见或不可见&…

StartAI修图实例教程之海报修图

发现AI的另一种用法——AI修图。想必许多电商小伙伴都会遇到海报修图问题&#xff0c;今天我们就来看看怎么处理&#xff01; 原图&#xff1a; 1.我们用PS自带的魔法棒工具进行选区&#xff0c;选择海报中需要修改的区域。我们今天是已“2024”两个字为例 效果图&#xff1…

每日必学Linux命令:cd命令

1.命令格式&#xff1a; cd [目录名]2.命令功能 切换当前目录至 [目录名]3. 常用范例 1.进入系统根目录 命令&#xff1a; cd / 说明&#xff1a;进入系统根目录,上面命令执行完后拿ls命令看一下&#xff0c;当前目录已经到系统根目录了 输出&#xff1a; hchc-virtu…

【YOLOv5改进系列(5)】高效涨点----添加密集小目标检测NWD方法

文章目录 &#x1f680;&#x1f680;&#x1f680;前言一、1️⃣ 修改loss.py文件1.1 &#x1f393; 修改11.2 ✨ 修改21.3 ⭐️相关代码的解释 二、2️⃣NWD实验2.1 &#x1f393; 实验一&#xff1a;基准模型2.2 ✨实验二&#xff1a;NWD权重设置0.52.3 ⭐️实验三&#xf…

开了抖店还不知道怎么下手操作的,建议把这篇文章看完!

大家好&#xff0c;我是电商小布。 我们都知道&#xff0c;抖音这个平台可以说是当前短视频行业中&#xff0c;最主流的项目了。 而这其中发展的电商&#xff0c;也是逐渐成为了行业内的头部。 对于一些想要在其中享受到优势的小伙伴&#xff0c;就抓住这个机会&#xff0c;…

基于Java仓库管理系统设计与实现(源码+部署文档+论文)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

无服务数据库是未来的趋势吗?

无服务数据库是未来的趋势吗&#xff1f; 无服务器数据库是未来的趋势吗&#xff1f;无服务器数据库与传统云数据库有何不同&#xff1f; Amazon Aurora Serverless&#xff08;如下图所示&#xff09;是 Amazon Aurora 的一种配置方式&#xff0c;可以按需自动扩展。 Aurora…

ChatGPT 商业金矿(上)

原文&#xff1a;ChatGPT Business Goldmines 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第一章&#xff1a;为什么我写这本书 欢迎阅读《ChatGPT 多源收入&#xff1a;20 个利润丰厚的业务&#xff0c;任何人都可以在一周内使用 ChatGPT 开始》。我很高兴分享我…

谷歌上架,账号高风险被封,一定是账号问题吗?

最近&#xff0c;很多开发者反馈&#xff0c;开发者账号总是被谷歌官方以“高风险行为”封号。封号邮件如图&#xff1a; 我们都清楚&#xff0c;账号被封的主要原因无非是账号本身质量问题和程序代码的问题。但目前大多数开发者普遍认为&#xff0c;如果账号是因为“高风险”被…

m4r是什么文件格式?用什么软件打开?

m4r文件格式的诞生伴随着移动设备智能化的崛起。这个格式最初是苹果公司为其iPhone设计的一种特殊的铃声格式。在这个数字音频领域&#xff0c;用户对于个性化铃声的需求逐渐升温&#xff0c;m4r文件格式因此迎来了时代的机遇。这个独特的音频格式的产生&#xff0c;旨在为用户…

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…

Advisor 被重复代理问题排查

问题场景 项目中存在多个 AbstractAdvisorAutoProxyCreator 且其持有的 Advisor Bean 重复 问题复现 相关代码 ResponseBodyRequiresPermissions(PermissionConstant.****)GetMapping(value "/query****.json", name "")public List<***> query…

处理 Oracle 数据库表空间满的问题

处理 Oracle 数据库表空间满的问题 1、诊断表空间满的问题2、处理表空间满的问题3、设置表空间自增结论 在 Oracle 数据库管理中&#xff0c;表空间是一个重要的概念&#xff0c;用于存储数据库对象和数据。当表空间满了时&#xff0c;可能会导致数据库的运行受到影响&#xff…