string str="i"与 String str=new String("i")和String s = new String("abc")的解释!!!

2023-11-18

string str="i"与 String str=new String(“i”)

String x = "张三";
String y = "张三";
String z = new String("张三");
System.out.println(x == y); // true
System.out.println(x == z); // false

为什么会输出上边的结果呢,String x = “张三” 的方式,Java 虚拟机会将其分配到常量池中,而常量池中没有重复的元素,比如当执行“张三”时,java虚拟机会先在常量池中检索是否已经有“张三”,如果有那么就将“张三”的地址赋给变量,如果没有就创建一个,然后在赋给变量;而 String z = new String(“张三”) 则会被分到堆内存中,即使内容一样还是会创建新的对象。

如果还有疑惑,可参考String s = new String(“abc”);产生了几个对象?

String s = new String(“abc”)

对于这个问题,老套路先上代码:

public class StringTest {
	public static void main(String[] args){
		String s1="Hello";
		String s2="Hello";
		String s3=new String("Hello");
		System.out.println("s1和s2 引用地址是否相同:"+(s1 == s2));
		System.out.println("s1和s2 值是否相同:"+s1.equals(s2));
		System.out.println("s1和s3 引用地址是否相同:"+(s1 == s3));
		System.out.println("s1和s3 值是否相同:"+s1.equals(s3));
	}
}

执行结果:

在这里插入代码片s1和s2 引用地址是否相同:true
s1和s2 值是否相同:true
s1和s3 引用地址是否相同:false
s1和s3 值是否相同:true

上面程序中的"==“是判断两个对象引用的地址是否相同,也就是判断是否为同一个对象,s1与s2 返回为true,s1与s3返回则是false。说明s1与s2 引用的同一个对象的地址,s3则与其它两个引用不是同一个对象地址。
Java为了避免产生大量的String对象,设计了一个字符串常量池。工作原理是这样的,创建一个字符串时,JVM首先为检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,若没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引用地址。所以上面s1与s2引用地址相同。
那为什么s3与s1、s2引用的不是同一个字符串地址呢? String s3=new String(“Hello”); JVM首先是在字符串常量池中找"Hello” 字符串,如果没有创建字符串常量,然后放到常量池中,若已存在,则不需要创建;当遇到 new 时,还会在内存(不是字符串常量池中,而是在堆里面)上创建一个新的String对象,存储"Hello",并将内存上的String对象引用地址返回,所以s3与s1、s2引用的不是同一个字符串地址。内存结构图如下:
在这里插入图片描述

从内存图可见,s1与s2指向的都是常量池中的字符串常量,所以它们比较的是同一块内存地址,而s3指向的是堆里面的一块地址,说的具体点应该是堆里面的Eden区域,s1跟s3,s2跟s3比较都是不相等的,都不是同一块地址。

了解了String类的工作原理,回归问题本身:
在String的工作原理中,已经提到了,new一个String对象,是需要先在字符串常量中查找相同值或创建一个字符串常量(有则用没有则创建),然后再在内存中创建一个String对象,所以String str = new String(“xyz”); 会创建一个或两个对象。

——————————————
版权声明:本文为CSDN博主「-小酒窝-」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zx1293406/article/details/103548506

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

string str="i"与 String str=new String("i")和String s = new String("abc")的解释!!! 的相关文章

  • “如何判断 Python 中的字符串是否重复?”的更复杂版本

    我正在读书这个帖子 https stackoverflow com questions 29481088 how can i tell if a string repeats itself in python我想知道是否有人可以找到将重复的
  • 为数据库生成随机 ID

    我对一个项目有一个要求 我需要生成唯一的 ID ID 必须大写 我无法检查数据库以查看 ID 是否已被使用过 我们预计每个月都会有数百万条记录添加到数据库中 我在这里尝试过解决方案 PHP 如何生成随机的 唯一的字母数字字符串 https
  • Java特殊字符替换

    我有一段文字 Csukl si roham gy t rheti a sv deket annyit emlegetikmostans g ism t a sv d modellt Magyarorsz gon 在原始文本中根本没有换行符
  • 字符串的渐进单词组合

    我需要获得字符串的渐进单词组合 例如 这是字符串 输出 这是字符串 这是 这个字符串 是字符串 这 是 细绳 你知道类似的算法吗 我需要php语言 谢谢 这是解决您问题的简单代码 我将每个字符串递归地连接到数组中的其余字符串 string
  • 如何在 LLVM 中实现字符串数据类型?

    我一直在看LLVM http llvm org 最近 我发现它是一个非常有趣的架构 然而 浏览教程和参考材料 我看不到任何关于如何实现的示例string http en wikipedia org wiki String computer
  • 将元组列表转换为字符串 Python

    例如 我用 python 编写了一个返回列表的函数 1 1 2 2 3 3 但我希望输出为字符串 这样我就可以用另一个字符替换逗号 这样输出就是 1 1 2 2 3 3 有什么简单的方法可以解决这个问题吗 感谢您提前提供任何提示 这看起来像
  • 一起使用 String 和 int 时的 System.out.println 行为 [重复]

    这个问题在这里已经有答案了 考虑下面的代码片段 public class Student public static void main String args int a 3 int b 4 System out println a b
  • VBA按空格分割字符串

    我想要一个 Excel 函数 我可以调用该函数并将单元格传递到其中 输入 Firstname Lastname email protected cdn cgi l email protection Firstname midname Las
  • 如何将 CString 传递给格式字符串 %s?

    class MyString public MyString const std wstring s2 s s2 operator LPCWSTR const return s c str private std wstring s int
  • MySQL中的字符串分割函数

    谁能告诉我如何在 mysql 中实现 split 函数 其行为类似于 Javascript split 我想要一个这样的功能 SELECT Split a b c d AS splitted 结果如下 splitted a b c d 有谁
  • 如何在Python中将字符串转换为包含一个元素的列表[重复]

    这个问题在这里已经有答案了 我有一个字符串 我想将其转换为其中只有一个元素的列表 a abc print list a output a b c Expected o p abc 正确的做法是什么 只需使用 a abc b a print
  • Java中不同格式的字符串解析为日期

    我想转换String to Date以不同的格式 例如 我从用户那里得到 String fromDate 19 05 2009 i e dd MM yyyy format 我想转换这个fromDate作为日期对象 yyyy MM dd fo
  • 从字节数组中删除多余的“空”字符并转换为字符串[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经为此工作了一段时间 但在这里没
  • 我可以在 Delphi 中使用字符串“IsEmpty”方法吗

    内河码头文件 IsEmpty 方法 http docs embarcadero com products rad studio delphiAndcpp2009 HelpUpdate2 EN html delphivclwin32 Syst
  • Java ArrayList 的 (ArrayList).toString 的相反是什么?

    我正在使用toString的方法ArrayList储藏ArrayList数据到字符串中 我的问题是 我该如何走另一条路 是否有现有的方法可以解析中的数据String实例返回到ArrayList 最简洁的答案是不 没有简单的方法可以从字符串中
  • C++ 清理字符串函数

    我需要为以下字符构建自己的清理函数 n r 0 and CTRL Z 我想确保以下代码能够实现这一目的 并且没有副作用 include
  • Grep 模式匹配用双引号括起来的小写字符串

    我在 grep 方面遇到了一些问题 我似乎无法弄清楚 我试图在一组源文件中搜索用双引号 C 字符串 括起来的小写单词的所有实例 使用 bash 和 gnu grep grep e a z cpp 没有给我任何匹配项 而 grep e a z
  • 替换字符串中的换行符 C#

    如何在 C 中替换字符串中的换行符 使用替换为Environment NewLine myString myString Replace System Environment NewLine replacement text add a l
  • 转义字符串中的反斜杠

    我想知道什么是转义字符串中的反斜杠而不添加不必要的斜杠的好方法 我的意思是 通常如果我想转义字符串中的反斜杠 最简单的方法是使用String Replace 像这样 string s someString Replace 可以使用正则表达式
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in

随机推荐

  • 立陶宛央行抢跑数字货币背后:前瞻的区块链战略 中国已有企业布局

    7月2日 据路透社报道 立陶宛将在下周开始预售2 4万枚由央行发行的数字货币 该名为LBCoin的数字货币基于区块链技术生产 立陶宛成为是欧盟国家中第一家正式发行央行数字货币的地区 不是2015年就开始研究央行数字货币的英国 不是今年2月试
  • 人工智能芯片未来发展前景如何?

    随着深度学习技术的快速发展 以及互联网和云计算时代海量数据和高效计算能力的支撑 计算机视觉技术 语音技术 自然语言理解技术等人工智能技术取得了突破性进展 并解锁多个行业的人工智能场景 产生了巨大的商业价值 驱动了人工智能行业的发展 同时 伴
  • TEA系列加解密算法详解

    文章目录 TEA系列概述 TEA算法介绍 TEA加密过程 C语言实现 XTEA算法介绍 XTEA加密过程 C语言实现 XTEA算法介绍 XXTEA加密过程 C语言实现 参考 TEA系列概述 TEA算法是由剑桥大学计算机实验室的David W
  • python 序列化_python怎么序列化

    pickle模块 json模块 1 把变量从内存中变成可存储或传输的过程 称之为序列化 Python中叫pickling 其他语言中也被称为serialization marshalling flattening等 都是相同的意思 2 序列
  • XSS安全漏洞的防范

    XSS安全漏洞 通过URL带入的 这种带入主要是前端解析url中的参数 并对数参数执行了innerHTML 或者 html 或者 append 操作 在将参数html 或者append 到html文件中时 会执行其中的js代码 被错误用户获
  • HBase Split 过程

    看了下hbase split的代码 记录一下学习心得 Java代码 private void split final HRegion parent final byte midKey throws IOException final lon
  • chat gpt 常见角色及对应的提示词汇总

    提示词的存在让ChatGPT能够扮演特定的角色 对用户的回答更加专业对口 以下是一些常见的ChatGPT角色及对应的提示词 目录 ChatGPT 市场推广提示 ChatGPT 业务提示 ChatGPT 内容提示 Web 开发的 ChatGP
  • Ubuntu系统中防火墙的使用和开放端口

    Ubuntu系统中防火墙的使用和开放端口 目录 1 Ubuntu查看防火墙的状态 2 2 Ubuntu开启防火墙 2 3 Ubuntu添加开放SSH端口 3 4 Ubuntu防火墙常用命令 5 4 1 查看ufw防火墙的状态 5 4 2 启
  • ARM汇编之APCS规则

    APCS规则简述 寄存器使用规则 寄存器r0 r3用于函数调用过程中传递函数形参 各有一个别名 a1 a4 使用前后可以不用恢复原来的值 R4 r11用于保存函数内部局部变量的值 每个函数使用前 必须要保存被调用函数的值 使用完毕 必须恢复
  • 在Linux远程服务器上搭建JavaWeb开发环境

    配置 远程linux服务器版本为CentOS7 6 使用的是阿里云服务器 目录 1 安装JDK 1 1 查看yum源中JDK版本 1 2 使用yum安装JDK1 8 1 3 查看是否安装成功 2 安装MySQL 2 1 查看是否已安装mys
  • C++ 循环

    有时候 程序需要多次执行同一块代码 一般情况下 语句是顺序执行的 函数中的第一个语句先执行 接着是第二个语句 依此类推 循环语句允许多次执行一个语句或语句组 大多数编程语言中循环语句的一般形式 循环类型 C 编程语言提供了以下几种循环类型
  • Anaconda环境的创建、激活、删除和管理

    1 Anaconda环境的创建 conda create n 环境的名字 自定义 python 3 7 其中环境的名字 自定义 表示创建环境的名字 可以自定义 建议为英文 后面python 3 7表示创建的解释器的版本 conda crea
  • 这里有141个创业公司的死亡案例,看鸡汤不如听教训

    今天我们打算跟大家聊聊失败 关于成功的方法论有着趋同性 多半与 天时地利人和 有关 而关于失败 却很少有人愿意公开谈起 也许因为野兽总是不想将伤口暴露在外 探讨失败的意义 可能远远大于成功 因为面对挫折 即使自认为最无畏的人也会有这样的时刻
  • PicGo安装与配置-Gitee图床

    PicGo安装与配置 Gitee图床 文章目录 PicGo安装与配置 Gitee图床 1 前言 2 下载 3 安装 4 Gitee 5 Node js 6 配置PicGo 6 1 PicGo界面配置 6 2 npm安装PicGo插件Gite
  • 空格的正则表达式

    在正则表达式想使用空格的时候不能采用 s的方法 因为 s指的是空白 就是所有空白 如果想表示单纯的空格的话可以采用 方括号本身就是匹配其中的字符 那么其中放空格就是匹配空格 如果有其他正则表达式问题可以查看 https blog csdn
  • GCP reliable google cloud infrastructure, devops lab

    最后更新2022 03 13 先到menu source repository里建立repository 还是不很好找 source repository在CI CD分类里面 点右上角的add repository按钮 输名字devops
  • uniapp集成unipush2.0

    unipush3 0集成 unipush推出2 0服务 之前一直用的1 0 现在项目推荐使用2 0 最近也是对2 0这个推送做了测试 下面就主要对华为这个来总结一下 其余的厂商大同小异 1 push1 0和2 0对比 个人理解 2 0比1
  • 深入浅出 RPC - 深入篇

    深入篇 我们主要围绕 RPC 的功能目标和实现考量去展开 一个基本的 RPC 框架应该提供什么功能 满足什么要求以及如何去实现它 RPC 功能目标 RPC 的主要功能目标是让构建分布式计算 应用 更容易 在提供强大的远程调用能力时不损失本地
  • 深度学习——制作自己的VOC图像分割数据集

    1 数据集介绍 COCO数据集有80个类别 VOC数据集有20个类别 当这些数据集类别中没有自己需要的时候 就需要自己动手做自己的数据集了 我自己在做数据集的时候主要使用到了labelme和labelImg两个工具 labelme主要是制作
  • string str="i"与 String str=new String("i")和String s = new String("abc")的解释!!!

    string str i 与 String str new String i String x 张三 String y 张三 String z new String 张三 System out println x y true System