String str = new String(“Hello, World!“);

在Java中,当你执行 String str = new String("Hello, World!"); 这行代码时,实际上发生了几件事情:

  1. 字符串常量池中的字符串 :首先,Java会检查字符串字面量 "Hello, World!" 是否已经在字符串常量池(String Constant Pool)中存在。字符串常量池是Java堆内存中的一个特殊区域,用于存储字符串字面量。如果常量池中已经存在该字符串,那么它不会被再次创建。但是,在这个例子中,我们假设这是第一次遇到这个字符串字面量,所以Java会在字符串常量池中创建一个新的字符串对象 "Hello, World!"

  2. 使用new创建新的对象 :然后,new String("Hello, World!") 调用 String 类的构造函数来创建一个新的 String 对象。这个新的对象是在堆内存中分配的,与字符串常量池中的字符串是不同的对象,尽管它们的内容是相同的。

  3. 引用赋值 :最后,str 变量被赋值为新创建的 String 对象的引用,而不是字符串常量池中的字符串的引用。

这里的关键点是,虽然两个字符串对象的内容相同,但是它们是两个不同的对象,分别位于不同的内存区域(一个是字符串常量池,另一个是堆内存)。

为了证明这一点,你可以使用 == 运算符和 equals() 方法来比较这两个字符串:

java 复制代码
String str1 = "Hello, World!";  // 直接引用字符串常量池中的字符串  
String str2 = new String("Hello, World!");  // 使用new创建新的字符串对象  
  
System.out.println(str1 == str2);  // 输出false,因为它们是不同的对象  
System.out.println(str1.equals(str2));  // 输出true,因为它们的内容相同

str1 == str2返回false,因为 str1str2引用的是不同的对象。而str1.equals(str2)返回true,因为 equals()` 方法比较的是字符串的内容,而不是它们的引用。

相关推荐
彧azz10 分钟前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
IT_Octopus13 分钟前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea
嵌入式学习菌33 分钟前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
长征coder1 小时前
【无标题】
java·性能优化
matlab代码1 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
新时代牛马1 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
Bs_MoneyMagnet2 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
matlab代码2 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
wuyk5552 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin199701080162 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas