【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 …

Web前端轨迹追踪:深入探索与解析

Web前端轨迹追踪:深入探索与解析 在数字化时代的浪潮中,Web前端作为用户与互联网世界交互的桥梁,承载着丰富的信息和交互体验。而轨迹追踪,作为前端开发中不可或缺的一环,对于提升用户体验、优化产品性能以及实现精准…

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

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

2024.6.9 二

Python类的继承 class 子类(父类1,父类2,…) 子类继承父类的和方法,即如果什么都不改,就相当于父类改了个名字接着用 构造函数继承与改写 当在Python中出现继承的情况时,一定要注意初始化函数_init_的行为: 如果子类没有定义自己的初始化函数&#xf…

如何获取当前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 总线的转接芯片,…

使用ORM Bee时, Condition, SuidRich的方法中, 字段是否支持使用Orders::getName的形式,避免使用静态字段串写死字段值

使用ORM Bee时, Condition, SuidRich的方法中, 字段是否支持使用Orders::getName的形式,避免使用静态字段串写死字段值. 可以使用V2.4.0 的ConditionExt和SuidRichExt 需要引用BeeExt. 示例代码如下: package org.teasoft.exam.bee.osql.ext24;import org.teasoft.bee.osql…

Yolov9比其他yolo版本的改进

YOLOv9模型在多个方面进行了改进,根据搜索结果,以下是一些主要的改进点: 1. **可逆函数角度的分析**:YOLOv9从可逆函数的角度理论上分析了现有的CNN架构,基于这种分析,设计了PGI(可编程梯度信息…

4、Spring之Bean生命周期~获取Bean

4、Spring之Bean生命周期~获取Bean 获取BeantransformedBeanName()方法BeanFactoryUtils的transformedBeanName方法canonicalName()方法 getObjectForBeanInstance()方法getObjectFromFactoryBean()方法 获取Bean Spring Bean的生命周期首先会经过扫描,然后回经过合…

git本地配置及IDEA下Git合并部分文件

目录 1、IDEA 下 Git 合并部分文件 2、分支合并忽略特定文件步骤 3、git本地配置 1、IDEA 下 Git 合并部分文件 1.1Git 下存在两个分支,foo 和 bar 分支,想要把 bar 分支上的部分文件合并到 foo 分支: 首先切换到 foo 分支,点击右下角的 …

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均值…

vue基础P7-17

1、模板语法 插值语法 {{xxxx}}用在标签体中&#xff0c;也就是<>{{xxx}}</> xxx是js表达式&#xff0c;有返回值&#xff0c;如num1、Date.now()。不是js代码 指令语法 以v开头&#xff0c;用于解析标签&#xff0c;包括标签属性、标签体内容、绑定事件 v-o…

web前端常识:深入理解与实战应用

web前端常识&#xff1a;深入理解与实战应用 Web前端作为现代互联网技术的核心组成部分&#xff0c;涉及的知识点既广泛又深入。对于初学者和进阶者而言&#xff0c;掌握Web前端常识是构建扎实基础、提升技能水平的关键。本文将从四个方面、五个方面、六个方面和七个方面对Web…

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…

win10文件夹.git或者文件被隐藏的开启姿势

按需排查&#xff0c;有的文件隐藏是好事 基本操作更多操作某些系统设置的隐藏操作在idea或者pycharm项目中显示.git文件夹 基本操作 文件夹-> 查看 -> 隐藏的项目点亮 更多操作 文件夹 -> 查看 -> 选项 -> 查看 -> 高级设置 -> 文件和文件夹 -> 隐…

服务器部署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和这个似乎有关联&…