揭秘Java新String创建对象争议:1个还是2个?

0 下载量 162 浏览量 更新于2024-08-28 收藏 376KB PDF 举报
在Java编程中,关于`new String("xxx")`操作创建对象个数的问题常常引发讨论,这个问题成为了面试中的热门话题。尽管这个问题看似简单,但由于涉及到字符串常量池的概念,答案出现了多种观点。 首先,关于new String("xxx")创建的对象个数主要有三种理论: 1. **单个对象**:有人认为,当使用`new String("xxx")`时,实际上只会创建一个对象。这是因为在Java中,字符串是不可变的,第一次创建的字符串会被放入字符串常量池。如果池中有相同的字符串,JVM会直接返回池中的对象,而不是在堆中再次创建。这种情况下,`new`操作只是在堆中创建了一个引用,真正的字符串已在常量池。 2. **两个对象**:另一种观点认为,虽然在常量池中查找到了匹配的字符串,但`new String`仍然会创建一个对象。这是因为即使在常量池中找到了字符串,`new`操作仍会为它在堆上创建一个副本,以确保引用的对象是可变的。这种方式下,即使最终指向池中的字符串,也额外创建了一个对象。 3. **可能一个或两个**:还有一种意见是,是否创建两个对象取决于字符串是否已经在常量池中存在。如果已存在,`new`操作仅创建一个;若不存在,则创建一个并在池中添加,共两个对象。 值得注意的是,从JDK 1.7到1.8,永久代被移除,元空间取代了其角色。这一变化意味着字符串常量池的行为可能有所不同,尤其是在内存管理方面。然而,核心观点仍然围绕字符串的不可变性以及是否需要为新创建的字符串对象分配堆内存。 总结来说,理解`new String("xxx")`创建对象个数的关键在于理解字符串的生命周期、字符串常量池的作用以及JVM如何优化内存管理。在实际开发中,除非有特殊需求,否则通常无需关心新创建字符串的确切对象数量,因为字符串常量池的存在确保了高效性和内存节省。面试中,理解基本原理和讨论背后的逻辑比记住具体数字更重要。