String s=new String("abc");//JVM现在String pool中找有没有“abc”的字符串,没有就创建一个该字符串对象“abc”,该对象在String pool中并不是在堆中,这就是很多教程上所说的垃圾对象,然后JVM会通过String pool中对象在堆里也创建一个“abc”String对象,句柄s指向的是堆中的对象;
System.out.println(s==s.intern());//JDK文档中有关intern()函数的解释:
返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
显然s.intern()指向的是String pool中的"abc"而非堆中的"abc",结果当然是false,此时必有s.equal(s.intern())==true;
String s1="abc";//JVM会去Stiring pool中找是否有“abc”的字符串存在,如果存在,则,s1指向它,当然是存在的了,因此才会有 System.out.println(s.intern()==s1);返回true
String s2=new String("abc");//使用new创建的肯定是不同的对象,虽然String pool中已经有“abc”对象存在;同理,s2指向的是堆中新创建的“abc”,s2和s指向的堆中的不同对象,但是内容相同“abc”。
因此有如下结果:
System.out.println(s==s2);//返回false
System.out.println(s.intern()==s2.intern());//返回true
另外一个小测试:
String hello="hello";
String hel="hel";
String lo="lo";
System.out.println(hello=="hel"+"lo");//true,连接符两边都是常量的则从池中找并返回。
System.out.println(hello=="hel"+lo);//false,连接符两边有变量则在堆中重新生成了一个对象。
分享到:
相关推荐
### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...
在Java中,如果我们使用字面值方式创建的String对象,它们是常量池中的字符串常量,如果我们使用new关键字创建的String对象,它们是运行时创建的新对象。例如,String s0="kvill";,String s1=new String("kvill");...
- 接着,在 **堆** 中通过调用 `String` 构造器创建一个新的字符串对象 `"abc"`,并将 `s` 引用指向这个新对象。 这种方式下,无论 **常量池** 中是否已有相同的字符串对象,都会在 **堆** 中创建一个新的对象。这...
- **直接赋值**:这种方式会在**字符串常量池**(String Pool)中查找或创建一个对应的`String`对象,并将变量指向该对象。字符串常量池是Java堆的一部分,专门用来存储字符串字面量。如果字符串常量池中已经存在...
`String Pool`是存储`String`字面量的缓存池,当通过字面量的方式创建`String`对象时,Java虚拟机首先检查`String Pool`中是否已经存在相同的字符串,如果存在,则返回该字符串的引用,而不是创建一个新的对象。...
在Java编程语言中,字符串常量池(String Constant Pool)是一个重要的概念,它与程序的内存管理和性能优化密切相关。理解这个概念对于任何Java开发者来说都至关重要。字符串常量池是Java虚拟机(JVM)在运行时为...
字符串池(String Pool)是.NET内存管理的一个重要概念,它优化了字符串对象的创建和存储,以提高性能。在此WinForm字符串池源码中,我们可以深入理解这个概念的实现细节。 字符串池的主要目的是减少内存中的重复...
根据提供的文件信息,本文将围绕“String容量大小区分”这一主题进行深入探讨,结合Java语言中的String类特性,解析字符串在不同场景下的容量变化及内存管理机制。 ### 标题和描述解读:“String容量大小区分” 该...
在 JAVA 中,存在一个字符串池(String Pool),用于保存和共享 String 对象。String 对象池可以提高效率,因为它可以避免创建重复的 String 对象。 String 对象池是由 String 类维护的,可以通过 intern() 方法来...
使用这种方式创建的字符串会被存储在一个特殊的内存区域——字符串常量池(String Literal Pool)中。如果再次尝试创建相同的字符串字面量,Java会直接引用已存在的字符串对象,而不是创建新的实例。 2. **new...
Java中的字符串对象`String`是编程中非常常见且重要的元素,它们在内存管理上有一些特殊之处,这在理解和优化程序性能时尤其关键。本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念...
- 直接通过字面量创建的`String`对象,如`"a"`,会存储在字符串池(String Pool)中。如果池中已有相同的字符串,就不会再创建新的对象,而是重用已存在的。 - 使用`new`关键字创建的`String`对象则会在堆内存中...
本文将基于提供的代码片段深入探讨与 `String` 类型相关的几个关键概念,包括字符串常量池、字符串比较、以及 `new` 关键字在创建 `String` 对象时的影响。 #### 一、字符串常量池的理解 首先,我们需要理解字符串...
当创建一个新的 String 对象时,Java 会首先在 String.Pool 中查找是否已经存在该字符串,如果存在则返回该字符串的引用,否则创建一个新的字符串对象。 五、String 对象的应用 String 对象是 Java 中最基本的数据...
字面量(Literal)与字符串常量池(String Constant Pool) 字符串字面量指的是直接用双引号括起来的字符串,例如 `"abc"`、`"HelloWorld"` 等。当创建这样的字符串时,JVM会检查字符串常量池中是否已经存在相同的...
这份"javaString总结共13页.pdf.zip"压缩包文件显然包含了关于Java字符串的深入讲解,覆盖了多个关键知识点。虽然没有提供具体的PDF内容,但我可以基于常见的Java String主题为你概述一些重要的概念。 1. **字符串...
传统的内存管理优化方案主要关注字符串的使用效率,例如消除常量重复(String Pool)和延迟分配等技术。然而,这些方法无法直接处理已经存在于堆中的无用字符串数据,只能依赖于垃圾收集器的定时清理。而垃圾收集器...
这在处理大量的字符串拼接时尤其有用,因为使用`+`操作符连接字符串会创建新的`String`对象,而使用`StringBuilder`或`StringBuffer`则可以在一个对象上进行多次操作,避免不必要的对象创建。 总之,`String`类在...