【Java SE】字符串常量池详解,什么情况下字符串String对象存在常量池,通过==进行判断,字符串创建及截取后是否同一个对象

复习字符串创建方式

字符串的3+1种构造方法

  1. public String();创建一个空白字符串, 不含有任何内容
  2. public String(char[] array);根据字符数组的内容,来创建对应的字符串
  3. public String(byte[] array);根据字节数组的内筒,来创建对应的字符串
String str1 = new String();
char[] ch1 = new char[]{'3', '%', d"};
String str2 = new String(ch1);
byte[] by1 = new byte[2];
by1[0] = 23;
by1[1] = 12;
String str3 = new String(by1);

1 种直接创建 String str = "Hello";注意:直接写上双引号,就是字符串对象。只要是字符串一定是对象
只有1种直接创建的字符串在堆中的字符串常量池中,其他3种new 创建的都在堆

拼接,截取操作后得到的字符串是否在常量池。(判断标准)

在这里插入图片描述

  • 常量池的字符串内容相同就是一个对象,用==比较是不是一个字符串对象
  • 用concat(String)拼接字符串;用+拼接字符串;
  • 从其他字符串中截取substring(2种);
  • 用replace替换字符串中字符得到返回值。
  • 用split分割得到字符串数组。
  • 假设得到的字符内容都是abcabc,检查最终得到的字符串是否在常量池中
public class MainTest {
    public static void main(String[] args) {
        //以下所有比较的字符串内容相同
        String str = "abcabc";
        String strCopy = "abcabc";
        String str1 = "ab".concat("cabc");
        String str2 = "a" + "bca" + "bc";
        String str22 = "bca";
        String str3 = "a" + str22 +"bc";
        String str4 = "aecaec".replace("e","b");
        String[] strArr1 = "abcabceartdeagfdseae".split("ea");
        String str5= strArr1[0];

        System.out.println(str == str1);//false//方法拼接的str1在堆
        System.out.println(str == str2);//true//字符串常量+拼接的字符串str2,在常量池
        System.out.println(str == "a" + "bca" + "bc");//true//字符串常量+拼接的匿名字符串结果,也在常量池
        System.out.println(str == str3);//false//其中有str22字符串引用拼接,str3在堆
        System.out.println(str == str4);//false//方法替换得到的str4在堆
        System.out.println(str == str5);//false//方法截取得到的str5在堆
        System.out.println(str == strCopy);//true//直接创建的在常量池

       
		String str11 = "aaa";
        String str88 = "aaa";
        System.out.println("str8:" + str11 == "str8:aaa");//false//+优先级高,最终笔试双方为 "str8:aaa" == "str8:aaa"但"str8:" + str1得到的字符串在堆,因为str8是字符串引用,“+”拼接在运行期间
        System.out.println(("str8:" + str11) == "str8:aaa");//false//同上
        System.out.println("str8:" + (str11 == "aaa"));//str8:true//直接创建在常量池

    }
}

重点对比str2、str3
都是用+拼接,怎么一个在常量池,一个不在?
注意区分字符串常量字符串引用,即一个直接创建且匿名一个有名字

  • str2在常量池因为:
    字符串常量拼接在编译期间就已经完成,“+”号操作时处于编译时期。编译完后的“abcabc”放入常量池
  • str3在堆因为:
    字符串引用的拼接在运行时执行,“+”号操作时处于运行时期。执行完语句后创建一个新的字符串引用str3在堆来接收"a" + str22 +"bc"的结果。其中“a” ,str22和“bc”都在常量池,因为都是直接创建的,只有str3这个用引用有str22参与,“+”号拼接的在堆。

总结:

  • 对于String,属于引用类型,而==比较引用类型,必须得是同一个对象才true。
    在常量池的字符串只要内容一样,就是同一个对象
  • 而使用空参,字符数组,字节数组这3种方式创建的String对象(还有使用字符串常用方法拼接、截取、替换得到的String)(和+拼接字符串引用得到的String对象), 以上字符串, 内容相同也不是同一个对象,因为不在常量池中保存。 在堆中保存
  • 直接创建的字符串,和+ 拼接字符串常量得到的String对象,都保存在堆中的字符串常量池中保存。特点:只要内容相同,就是同一个对象。即内容相同用==比较为true
  • 对于sout("str8:" + str1 == "str8:aaa")因为 + 优先于 == 实际比较的是 “str8:” + str1(即str8:aaa)和 后续的字符串比较,明明内容相同为啥false呢,因为“字符串引用”经过+拼接得到的字符串也不在常量池。不是一个对象
    用equals比较就相同了,因为equals比较File,Data,String和包装类是比较的内容,而不是地址,所以不要求必须是同一个对象才true。因为这几个类重写了equals方法

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

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

相关文章

Win10下CodeBlock实现socket TCP server/client

文章目录 1 安装codeblock2 适配libws2_32.a库3 TCP socket工作原理4 代码实现服务端客户端5 运行效果1 安装codeblock 官方免费下载 值得一提的是,安装时,指定安装路径,其他默认安装即可 2 适配libws2_32.a库 默认安装,只有3个库,如果编译socket,需要专门的库libws2…

Maven项目的创建

目录 1、Maven简介配置(1)设置本地仓库(2)修改Maven的jdk版本(3)添加国内镜像源添加到idea中 2、常用命令3、IDEA2023创建Maven项目(1)Maven和Maven Archetype区别(1-1&a…

L48---1637. 两点之间不包含任何点的最宽垂直区域(排序)---Java版

1.题目描述 2.思路 (1)返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 我的理解是相邻两个点,按照等差数列那样,后一个数减去相邻的前一个数,才能保证两数之间不含其他数字。 (2)所以&…

OmniGlue: Generalizable Feature Matching with Foundation Model Guidance

【引用格式】:Jiang H, Karpur A, Cao B, et al. OmniGlue: Generalizable Feature Matching with Foundation Model Guidance[J]. arXiv preprint arXiv:2405.12979, 2024. 【网址】:https://arxiv.org/pdf/2405.12979 【开源代码】:https…

[ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(3)

1.需求分析: 我们现在已经能够让这片地形出现在任意地方,只要角色走在这片地形上,就能够产生痕迹,但这片区域总是需要人工指定,又无法把这片区域无限扩大(显存爆炸),因此尝试使角色无…

【数据结构】十二、八种常用的排序算法讲解及代码分享

目录 一、插入排序 1)算法思想 2)代码 二、希尔排序 1)算法思想 2)代码 三、选择排序 1)算法思想 2)代码 四、堆排序 1)什么是最大堆 2)如何创建最大堆 3)算法思想 4&a…

电脑回收站清空了怎么恢复回来?分享四个好用数据恢复方法

电脑回收站清空了还能恢复回来吗?在使用电脑过程中,很多小伙伴都不重视电脑的回收站,,有用的没用的文件都往里堆积。等空间不够的时候就去一股脑清空回收站。可有时候会发现自己还需要的文件在回收站里,可回收站已经被清空了……那…

单灯双控开关原理

什么是单灯双控?顾名思义,指的是一个灯具可以通过两个不同的开关或控制器进行控制。 例如客厅的主灯可能会设置成单灯双控,一个开关位于门口,另一个位于房间内的另一侧,这样无论你是从门口进入还是从房间内出来&#x…

Meta首席AI科学家Yann LeCun指出生成式AI的不足

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

sqli-labs 靶场 less-11~14 第十一关、第十二关、第十三关、第十四关详解:联合注入、错误注入

SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它,我们可以学习如何识别和利用不同类型的SQL注入漏洞,并了解如何修复和防范这些漏洞。Less 11 SQLI DUMB SERIES-11判断注入点 尝试在用户名这个字段实施注入,且试出SQL语句闭合方式为单…

插卡式仪器模块:数字万用表模块(插卡式)

• 6 位数字表显示 • 24 位分辨率 • 250 KSPS 采样率 • 电源和数字 I/O 均采用隔离抗噪技术 • 电压、电流、电阻、电感、电容的高精度测量 • 二极管/三极管测试 通道122输入 阻抗 电压10 MΩHigh-Z, 10 MΩ电流10 Ω50 mΩ / 2 Ω / 2 KΩ输入范围电压 5 V0–60 V电流…

Java桥接模式

桥接模式 最重要的是 将 抽象 与 实现 解耦 , 通过组合 在 抽象 与 实现 之间搭建桥梁 ; 【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )-CSDN博客 桥接模式(Bridge Pattern)-(最通俗易懂的案例)_桥接模式 例子-…

SpringAI(二)

大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…

Java 期末复习 习题集

💖 单选题 💖 填空题 💖 判断题 💖 程序阅读题 1. 读代码写结果 class A {int m 5;void zengA(int x){m m x;}int jianA(int y){return m - y;} }class B extends A {int m 3;int jianA(int z){return super.jianA(z) m;} …

【阿里YYDS】通义千问正式开源 Qwen2

Qwen2–72B正式开源,性能全面超越开源模型Llama3-70B,也超过文心4.0、豆包pro、混元pro等众多中国闭源大模型。 在过去一段时间里,Qwen系列模型从Qwen1.5升级到Qwen2,Qwen2分5个尺寸,包括Qwen2-0.5B、Qwen2-1.5B、Qwen…

RabbitMQ-topic exchange使用方法

RabbitMQ-默认读、写方式介绍 RabbitMQ-发布/订阅模式 RabbitMQ-直连交换机(direct)使用方法 目录 1、概述 2、topic交换机使用方法 2.1 适用场景 2.2 解决方案 3、代码实现 3.1 源代码实现 3.2 运行记录 4、小结 1、概述 topic 交换机是比直连交换机功能更加强大的…

CopyOnWriteArrayList详解

目录 CopyOnWriteArrayList详解1、CopyOnWriteArrayList简介2、如何理解"写时复制"3、CopyOnWriteArrayList的继承体系4、CopyOnWriteArrayList的构造函数5、CopyOnWriteArrayList的使用示例6、CopyOnWriteArrayList 的 add方法7、CopyOnWriteArrayList弱一致性的体现…

【BUG】已解决:ModuleNotFoundError: No module named ‘transformers‘

已解决:ModuleNotFoundError: No module named ‘transformers‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司…

Element-UI入门

目录 1.什么是Element-UI 2.作用 3.版本历史 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 6.代码示例 7.未来展望 8.总结 1.什么是Element-UI Element-UI 是由饿了么前端团队开发的一套基于 Vue.js 的桌面端组件库。提供了一整套 UI 组件,使开发者能够快速构…

非线性模型预测控制NMPC例子

NMPC概述 非线性模型预测控制(Nonlinear Model Predictive Control, NMPC)是一种用于控制非线性系统的高级控制策略。与线性MPC不同,NMPC需要处理系统的非线性特性,这使得优化问题更加复杂。NMPC通常使用迭代优化算法来求解非线性优化问题 NMPC基本原理 NMPC的目标是最小…