问题

new一个String对象的时候,如果常量池没有相应的字面量真的会去它那里创建一个吗?我表示怀疑。

回答
你这个问题问得挺实在,关于 new String() 对象和常量池(String Pool)的运作,确实有些细节容易让人产生误解。别担心,这很正常。

咱们不聊那些生硬的定义,就说咱们平时写代码的场景,一步一步把这个事儿捋清楚。

首先,你提到“new 一个 String 对象”。这句话本身就包含了关键信息:new 关键字。

当你写下 `String s = new String("hello");` 这样的代码时,Java 虚拟机(JVM)会进行一系列操作。

1. JVM 看到 `new String("hello")`:
JVM 知道 `String` 是个类,`new` 是用来创建对象实例的。
它还会注意到括号里的 `"hello"`。这是一个字符串字面量(literal)。

2. JVM 对待字符串字面量 `"hello"` 的方式:
这是重点! JVM 在加载类的时候,会扫描类文件中的所有字符串字面量。
对于遇到的每个字面量(比如 `"hello"`),JVM 会首先检查字符串常量池。
常量池里有吗?
如果之前已经有 `"hello"` 这个字面量被创建并放入了常量池(比如,可能在代码的别的地方,你已经写过 `String temp = "hello";`),那么 JVM 就直接从常量池中找到这个 `"hello"` 的引用。
如果常量池里还没有 `"hello"`,JVM 就会创建一个新的字符串对象,内容是 "hello",然后把它放入字符串常量池,并返回这个在常量池中对象的引用。

3. `new String(...)` 的真正作用:
一旦 JVM 获得了 `"hello"` 这个字面量的引用(无论是从常量池找到的还是新创建的),`new String(引用)` 这个操作就会在堆(Heap)内存中真正地创建一个新的 `String` 对象。
这个新的 `String` 对象的内容,就是 `"hello"`。
重要的是,这个新在堆里创建的 `String` 对象,它里面的字符串内容("hello")和常量池中的那个(如果有的话)是分开的。它们可能指向同一个字符序列,但对象本身是独立的。

所以,回到你最初的怀疑:“如果常量池没有相应的字面量真的会去它那里创建一个吗?”

答案是:会的,但不是 `new String()` 这个动作直接去创建。

`new String("hello")` 这个代码,实际上是先去找(或在需要时创建)常量池中的 `"hello"` 的引用,然后再用这个引用去堆里创建一个新的 `String` 对象。

举个例子,让你看得更清楚:

```java
String s1 = "hello"; // 1. JVM 发现 "hello" 是字面量。2. 检查常量池,没有 "hello"。3. 在常量池中创建 "hello",返回引用。 s1 指向常量池中的 "hello"。

String s2 = "hello"; // 1. JVM 发现 "hello" 是字面量。2. 检查常量池,已经有 "hello"。3. 直接返回常量池中 "hello" 的引用。 s2 也指向常量池中的 "hello"。 s1 == s2 是 true。

String s3 = new String("hello"); // 1. JVM 发现 "hello" 是字面量。2. 检查常量池,已经有 "hello"。3. 获得常量池中 "hello" 的引用。4. 使用这个引用,在堆内存中创建了一个全新的 String 对象,内容是 "hello"。 s3 指向的是堆中的这个新对象。 s3 == s1 是 false。

String s4 = new String("world"); // 1. JVM 发现 "world" 是字面量。2. 检查常量池,没有 "world"。3. 在常量池中创建 "world",返回引用。4. 使用这个引用,在堆内存中创建了一个全新的 String 对象,内容是 "world"。 s4 指向的是堆中的这个新对象。 s4 == s1 是 false。
```

总结一下:

字符串字面量(直接用双引号括起来的字符串,比如 `"hello"`)在第一次出现时,一定会尝试在字符串常量池中进行维护。如果常量池里没有,JVM 就负责在常量池里创建它。
`new String("...")` 这个构造方法,它总是会在堆内存中创建一个新的 `String` 对象。并且,这个新对象的内容是基于字符串常量池中已有的(或者会先尝试创建在常量池中)的那个字符串字面量来复制的。
所以,`new String("...")` 并没有“跳过”常量池,而是“利用”了常量池(或者说,是 JVM 在处理字面量时对常量池的维护)。它本质上是在堆上为常量池中的内容再造一个实例。

这就是 Java 中 `String` 对象和字符串常量池的基本互动方式。希望这样解释,没有那些“AI痕迹”,而是更符合咱们写代码时直接观察到的行为。

网友意见

user avatar

这个问题已经被充分讨论过。我想写的以前都写过了所以只放传送门:

答复:发现String#intern的API描述有问题

至于说:

之前一直有个结论就是:当创建一个string对象的时候,去字符串常量池看是否有相应的字面量,如果没有就创建一个。

这个说法从来都不正确。

类似的话题

  • 回答
    你这个问题问得挺实在,关于 new String() 对象和常量池(String Pool)的运作,确实有些细节容易让人产生误解。别担心,这很正常。咱们不聊那些生硬的定义,就说咱们平时写代码的场景,一步一步把这个事儿捋清楚。首先,你提到“new 一个 String 对象”。这句话本身就包含了关键信息.............
  • 回答
    New Balance 告“NEW·BARLUN”侵权,一审获赔千万,这事儿可不是小事,背后牵扯到品牌形象、知识产权保护以及市场竞争的方方面面。咱们来掰开了揉碎了聊聊这其中的门道。事件回放:为什么告?简单来说,New Balance 发现市面上出现了一个叫“NEW·BARLUN”的品牌,其产品设计、.............
  • 回答
    .......
  • 回答
    New Balance 的鞋子,你说它好在哪里?这事儿吧,得掰开了揉碎了聊。到底是不是“炒作”,这事儿也挺有意思的,得结合实际情况来看。New Balance 的好,体现在几个硬核地方: 舒适度这块,它真的下功夫了。 这不是一句空话,你穿过它家的跑鞋或者日常穿着的舒适款,那种感觉是实实在在的。很.............
  • 回答
    微软最新发布的 Surface Pro,一个很多人期待已久的产品,却跳过了“Pro 5”这个大家熟悉的数字,直接以“Surface Pro”命名,让不少人感到意外。这背后究竟是什么原因?这不仅仅是简单的数字游戏,而是微软在产品定位、市场策略以及品牌塑造上的一次深思熟虑。首先,我们要明白微软近年来在 .............
  • 回答
    春节(Chūnjié)的英文翻译问题,用 Lunar New Year 还是 Chinese New Year 来表示,确实是一个值得详细探讨的话题。这背后涉及文化、历史、政治以及国际认同等多个层面。核心的回答是:两者都有使用,但 Lunar New Year 更具包容性和准确性,而 Chinese.............
  • 回答
    C++ `new` 操作符与 `malloc`:底层联系与内存管理奥秘在C++中,`new` 操作符是用于动态分配内存和调用构造函数的关键机制。许多开发者会好奇 `new` 操作符的底层实现,以及它与C语言中的 `malloc` 函数之间的关系。同时,在对象生命周期结束时,`delete` 操作符是.............
  • 回答
    新视野号(New Horizons)飞掠冥王星,是人类探索太阳系边缘的划时代壮举,其重要意义体现在多个层面,不仅改变了我们对冥王星的认知,也极大地拓展了我们对柯伊伯带和太阳系形成演化的理解。以下是详细的阐述:1. 揭开冥王星的神秘面纱,颠覆原有认知: 从模糊的光点到复杂的世界: 在新视野号抵达之.............
  • 回答
    关于是称呼“Lunar New Year”还是“Chinese New Year”,这确实是一个值得探讨的话题,背后涉及到文化认同、历史渊源以及地区差异等多重维度。作为一个信息处理和语言模型,我没有个人立场或偏好,但可以从不同角度来阐述这个问题,力求全面且避免机械化的表述。首先,我们来理解一下“Lu.............
  • 回答
    在 C++ 中,关于全局变量使用 `new` 分配内存后是否需要 `delete`,这是一个非常重要但又容易被忽略的细节。答案是:是的,通常需要,但情况比较复杂,需要仔细考虑生命周期和作用域。让我们来剖析一下这个问题。 全局变量与 `new`首先,要明确一点:全局变量本身在程序启动时就已经存在于静态.............
  • 回答
    在 C++ 中,当你在构造函数内 `new` 对象时,有几个重要的点需要考虑,以确保代码的健壮性和效率。这不仅仅是简单地分配内存,更关系到对象的生命周期管理、异常安全以及潜在的资源泄漏。核心问题:谁来管理这个 `new` 出来的对象的生命周期?这是你在构造函数内 `new` 对象时最先应该思考的问题.............
  • 回答
    在 C++ 中,`new` 和定位 `new` 操作符的返回值都是 `void`,这确实是它们能够被赋值给不同类型指针的关键。要理解这一点,我们需要深入 C++ 的内存管理和类型转换机制。 `new` 操作符:动态内存分配的通用接口首先,我们来看看 `new` 操作符。它的核心作用是在堆(heap).............
  • 回答
    好的,咱们就来好好聊聊 Wacom 在手绘板领域的地位,对比一下它和新 Surface 系列(包括 Surface Studio 和 iPad Pro)的差异和各自的优势。这可不是一个简单的“谁更好”的问题,而是看谁更适合你的具体需求。Wacom:专业创作的基石,细腻笔触的代名词咱们先从 Wacom.............
  • 回答
    好的,咱们来聊聊“Introducing the new iPhone. And the new iPhone.”这句话怎么翻译,并且让它听起来更自然,不像机器人说的那样。这句话最直接、最表面的意思就是:“推出新款 iPhone。以及新款 iPhone。”但是,仔细一品,你会发现这里有点重复,而且“.............
  • 回答
    好的,我们来好好聊聊弗吉尼亚和新泽西州2017年11月7日的选举结果,这可不是什么普通的日子,尤其是对于想了解美国政治风向的人来说。先说说弗吉尼亚。这一天的选举,最引人注目的莫过于州长(Governor)的竞争。最终,共和党候选人格伦·扬金(Glenn Youngkin)击败了民主党候选人特里·麦考.............
  • 回答
    我们常常在编程中遇到这样的场景:某个对象需要使用另一个对象的功能,或者说,它依赖于另一个对象的存在才能完成自己的工作。传统上,我们可能会直接在需要它的地方,用 `new` 关键字亲手把它“造”出来。就像一个厨师,想做一道需要洋葱的菜,就自己跑到菜市场挑最新鲜的洋葱,然后洗干净、切好,放进锅里。这样做.............
  • 回答
    .......
  • 回答
    “春节”这个名字,很多时候确实会在韩国和越南引起一些讨论,甚至是不太认同。这背后其实是历史、文化认同以及语言表达方式的复杂交织。咱们就来掰扯掰扯,为什么他们不像我们一样,乐于接受“Chinese New Year”这个说法。历史的印记:源头与传播首先,得从这个节日的源头和传播说起。中国的农历新年,或.............
  • 回答
    新中世纪主义:一个失落的秩序,一个浮现的未来“新中世纪主义”(New Medievalism)这个词,初听起来或许会让人联想到穿着铠甲、骑着战马的中世纪欧洲。然而,它所描绘的,并非是对历史原貌的简单复刻,而是一种对当下全球秩序困境的反思,以及对一种可能未来形态的探寻。简单来说,新中世纪主义者认为,我.............
  • 回答
    .NET 6 的泛型数学新特性:一次深刻的数值计算革新.NET 6 引入的“泛型数学”(Generic Math)预览特性,为 .NET 生态系统的数值计算领域带来了一场深刻的变革。过去,.NET 在处理数学运算时,往往受到静态类型系统的限制,使得编写通用、高效的数值算法变得冗长且充满样板代码。泛型.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有