【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方法

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

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

相关文章

Docker:在DockerHub上创建私有仓库

文章目录 Busybox创建仓库推送镜像到仓库 本篇开始要学习在DockerHub上搭建一个自己的私有仓库 Busybox Busybox是一个集成了三百多个最常用Linux命令和工具的软件,BusyBox包含了很多工具,这里拉取该镜像推送到仓库中: 安装 apt install …

leetcode(力扣)第15题-三数之和---使用c语言双指针法,二级指针的应用

题目: 15. 三数之和 - 力扣(LeetCode) 编写过程的问题: 记住线索 1、对数组使用快排排序;2、固定 a 对 b、c 使用双指针;3、注意去重问题。函数返回值的类型。{1,2,-3}。结果作为…

如何获取当前dll或exe模块所在路径?

有时我们需要在当前运行的dll或exe模块中去动态加载当前模块同路径中的另一个库,或者启动当前模块同路径中的另一个exe程序,一般需要获取当前模块的路径,然后去构造同路径下目标模块的绝对路径,然后通过该绝对路径去加载或启动该目…

高速USB转串口芯片CH343

CH343封装 截止目前,主要封装有 SOP16: CH343G QFN16: CH343P ESSOP10: CH343K,截止24年6月未生产 CH343串口速度 最高串口速度: 6Mbps,比CH340的2M,快3倍 1、概述 参考版本:1E CH343 是一个 USB 总线的转接芯片,…

Java Web学习笔记31——Maven介绍

Maven:Java项目的构建工具。 Maven: Maven是Apache旗下的一个开源项目,是一款用于管理和构建Java项目的工具。 Apache软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专…

Java | Leetcode Java题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; class Solution {public int minCut(String s) {int n s.length();boolean[][] g new boolean[n][n];for (int i 0; i < n; i) {Arrays.fill(g[i], true);}for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i]…

深度学习中几种常见数据标准化方法

目录 一、介绍 二、总结 三、详情 1. StandardScaler 2. MinMaxScaler 3. RobustScaler 4. MaxAbsScaler 5. Normalizer 6. QuantileTransformer 7. PowerTransformer 8. Log Transform 四、示例 五、心得 一、介绍 方法名称缩放范围适用条件StandardScaler均值…

python 判断点和线段相交

python 判断点和线段相交 import numpy as np import cv2 import numpy as npdef point_to_line_distance(points, line_segments):# line_segments [[549, 303], [580, 303]]# points [565, 304]x0, y0, x1, y1line_segments[0][0], line_segments[0][1], line_segments[1]…

【python】OpenCV GUI——Trackbar(14.2)

学习来自 OpenCV基础&#xff08;12&#xff09;OpenCV GUI中的鼠标和滑动条 文章目录 GUI 滑条介绍cv2.createTrackbar 介绍牛刀小试 GUI 滑条介绍 GUI滑动条是一种直观且快速的调节控件&#xff0c;主要用于改变一个数值或相对值。以下是关于GUI滑动条的详细介绍&#xff1a…

服务器部署spring项目jar包使用bat文件,省略每次输入java -jar了

echo off set pathC:\Program Files\Java\jre1.8.0_191\bin START "YiXiangZhengHe-8516" "%path%/java" -Xdebug -jar -Dspring.profiles.activeprod -Dserver.port8516 YiXiangZhengHe-0.0.1-SNAPSHOT.jar 将set path后面改成jre的bin文件夹 START 后…

knoXSS(case01~10)

case 01: 先在每个框里都输入:<script>alert(1)</script> 检查源码 这里第三个和第四个点都被处理过了&#xff0c;所以先考虑第一个和第二个点 这里试了一下&#xff0c;发现GET也能传参&#xff0c;所以构造 成功 case 02: 这里发现变量a和这个似乎有关联&…

专业学习|南开大学《随机过程》学习笔记(一)

&#xff08;1&#xff09;有哪些经典的关于基本随机过程的书籍推荐&#xff1f; 对于想要系统学习基本随机过程的学生来说&#xff0c;可以参考Sheldon M.Rose编著的经典著作《随机过程》。该书涉及的内容也比较宽泛。但并不局限于单个细节论证。 此外&#xff0c;萨缪尔科林(…

抓住时机的核心:坚持学习准备着

在这个快节奏的时代&#xff0c;时间对于每个人来说都是宝贵的。能否在合适的时间做正确的事情&#xff0c;往往决定了我们成功的概率。但同时&#xff0c;我们也要认识到&#xff0c;逆风翻盘虽少&#xff0c;却并非不可能。在这个过程中&#xff0c;投资自己&#xff0c;投资…

LabVIEW与Python的比较及联合开发

LabVIEW和Python在工业自动化和数据处理领域各具优势&#xff0c;联合开发可以充分发挥两者的优点。本文将从语言特性、开发效率、应用场景等多个角度进行比较&#xff0c;并详细介绍如何实现LabVIEW与Python的联合开发。 语言特性 LabVIEW 图形化编程&#xff1a;LabVIEW使用…

三维地图Cesium,加载一个模型,模型沿着给定的一组经纬度路线移动

目录 实现效果 实现思路 功能点 选择移动路线 加载模型和移动路线 重新运行 指定位置(经纬度点)开始移动 视角切换 到站提示 运行 停止 联动接口 完整代码 html js逻辑 trainOperation.js sourceData.js gitee仓库项目代码 疑问解答 实现效果 三维地图Cesiu…

CopyOnWriteArrayList详解

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

LeetCode790多米诺和托米诺平铺

题目描述 有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如 “L” 的托米诺形。两种形状都可以旋转。给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺…

先进封装技术的一些优缺点探讨

半导体封装技术是半导体制造过程中的关键环节&#xff0c;它不仅保护了芯片免受物理损伤&#xff0c;还提供了电气连接和散热功能。随着技术的发展&#xff0c;出现了多种先进的封装技术&#xff0c;每种技术都有其特定的应用场景和优缺点。 --> 1. 传统封装技术 【优点】&…

【SpringBoot + Vue 尚庭公寓实战】根据类型查询标签列表接口实现(五)

【SpringBoot Vue 尚庭公寓实战】根据类型查询标签列表接口实现&#xff08;五&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】根据类型查询标签列表接口实现&#xff08;五&#xff09;1、查看接口2、进行开发 1、查看接口 启动项目 访问&#xff1a;http://localho…

macOS优化工具CleanMyMac2024免费版电脑性能提升 存储空间释放 电脑维护 高效易用 延长电脑使用寿命

【CleanMyMac】是一款专为macOS系统设计的优化和清理软件&#xff0c;它的核心特性就是帮助我们提升电脑性能&#xff0c;释放存储空间。&#x1f680; CleanMyMac绿色免费版下载如下&#xff1a;记得保存哈&#xff0c;以防失效&#xff1a; https://pan.quark.cn/s/9b08114…