`
275553385
  • 浏览: 715144 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
文章分类
社区版块
存档分类
最新评论

java中的String pool(常量池)

阅读更多
必须强调一点:java中的String Pool不是在堆区,也不是在栈区(别处看到的)

String a=new String("hello");

先到String pool中看是否存在"hello",因为开始String pool为空,故在String pool中构建对象"hello"。又因为是new操作,故还要以参数"hello"的值拷贝一份在堆内存中构造另一个对象,此时已有两个对象在内存中,a指向堆中的那个"hello"对象
String a1="hello";

先查看String pool,这是池中有了"hello",故不再在池中构造新的对象了,也不是new操作,堆中也不构造对象,a1指向上步操作中在String pool里构造的那个"hello"对象
String a2=new String("hello");

String pool中有了"hello",池中不构造新的,但因为有new操作,堆中建立新实例,a2指向这步在堆中构造的那个新"hello"对象
分享到:
评论

相关推荐

    java 内存中 堆、栈、常量池、方法区的总结

    常量池的好处是让字符串等数据可以被共享,因此在常量池中的数据不会存在多份副本,它们是唯一的。 接下来是栈,它主要用于方法调用的上下文,每个线程都会拥有一个或多个栈。栈主要用于存储局部变量、操作数栈、...

    Java堆,栈和常量池详解

    - 类加载过程中,会把.class文件中的常量池内容复制到方法区的常量池中。 - 方法区的内存回收主要针对常量池。 - **应用场景**: - 字符串字面量的存储。 - 方法、字段的符号引用。 #### 实例解析 下面通过几...

    java String类常量池分析及"equals"和"==”区别详细介绍

    `String`类还提供了`intern()`方法,它可以将一个`String`对象与常量池中的字符串进行比较。如果常量池中已经存在一个与当前对象内容相同的字符串,`intern()`会返回常量池中的那个字符串的引用。如果常量池中没有,...

    什么是字符串常量池?Java开发Java经验技巧共6页.p

    如果另一个地方也创建了同样的字符串,例如`String str2 = "Hello"`,Java会检查字符串常量池中是否已经有了"Hello",如果有,则不会创建新的对象,而是直接引用已存在的。 字符串常量池位于方法区的运行时常量池...

    解析Java中的String对象的数据类型 字符串

    在Java中,如果我们使用字面值方式创建的String对象,它们是常量池中的字符串常量,如果我们使用new关键字创建的String对象,它们是运行时创建的新对象。例如,String s0="kvill";,String s1=new String("kvill");...

    Java中的堆、栈和常量池_.docx

    但对象本身并不存放在栈上,而是存放在堆或者常量池中。栈中的数据生命周期较短,当没有引用指向它时,数据会被自动销毁。 3. 堆(Heap): 堆是Java内存模型的主要部分,用于存储所有通过new关键字创建的对象。堆...

    java入门教程:数据类型_运行时常量池.docx

    Java编程语言的基础知识中,数据类型和运行时常量池(Runtime Constant Pool)是两个关键概念。数据类型决定了变量可以存储的值的种类和大小,而运行时常量池则是Java虚拟机(JVM)内存模型中的一个重要组成部分。 ...

    JVM常量池教程吐血整理干货.md

    - **字符串字面量的处理**:当程序尝试创建一个新的字符串字面量时,JVM首先会检查字符串常量池中是否存在该字符串。如果存在,则返回已存在的字符串对象;如果不存在,则创建一个新的字符串对象并将其放入字符串...

    Java String对象的经典问题

    对于通过直接赋值方式创建的`String`对象,如果它们的值相同,那么它们的引用也会相同,因为它们都指向字符串常量池中的同一个对象。但对于通过`new String()`方式创建的`String`对象,即使它们的值相同,它们的引用...

    class常量池类型分类.pdf

    这意味着如果在常量池中添加了一个`CONSTANT_Long_info`或`CONSTANT_Double_info`,那么紧接着的下一个有效索引将是当前索引加上2。 #### 9. CONSTANT_NameAndType_info 此类常量用于存储字段名或方法名及其描述符...

    JAVA中关于String的一些注意点

    当创建这样的字符串时,JVM会检查字符串常量池中是否已经存在相同的字符串实例。如果存在,则直接返回该实例;如果不存在,则会在常量池中创建一个新的实例,并返回它。这确保了相同的字符串字面量总是指向同一个...

    javaString总结共13页.pdf.zip

    这份"javaString总结共13页.pdf.zip"压缩包文件显然包含了关于Java字符串的深入讲解,覆盖了多个关键知识点。虽然没有提供具体的PDF内容,但我可以基于常见的Java String主题为你概述一些重要的概念。 1. **字符串...

    深入理解JavaString#intern()内存模型Ja

    `String#intern()`方法的作用是:如果调用该方法的字符串对象在字符串常量池中已经存在,则返回该池中的字符串引用;如果不存在,那么会将此字符串添加到池中,并返回这个新添加的引用。这样做的目的是减少内存中对...

    Java中关于String的全面解析

    `时,发现常量池已经有了abc这个值,于是不再在常量池中创建这个对象,而是把引用直接指向了该对象。 String对象的比较 继续执行到`String c = new String("abc");`这时候我们加了一个new关键字,这个关键字呢就是...

    string中的常见问题

    如果在程序中再次尝试创建一个相同的字符串,Java 会检查该字符串是否已经存在于常量池中,如果存在,则直接引用已有的字符串对象,而不是创建新的对象。 #### 二、`==` 和 `.equals()` 的区别 接下来,我们讨论...

    String容量大小区分

    `,此时会创建两个对象:一个在字符串常量池中,另一个在堆空间中。这意味着即使创建了多个相同内容的字符串,每个通过`new`创建的对象都会占用独立的堆空间,这可能导致更多的内存消耗。 #### 3. 字符串连接与...

    创建string对象过程的内存分配:

    1. **常量池** (Constant Pool): 每个类或接口都有自己的常量池,它包含了编译期间确定的所有字面量和符号引用。 2. **堆** (Heap): 动态分配的内存区域,用于存放对象实例。 3. **栈** (Stack): 存放局部变量、操作...

    String对象的内存分析

    例如,使用`String`的`intern()`方法可以确保重复的字符串引用同一个常量池中的实例,从而减少内存占用。同时,合理使用`StringBuilder`或`StringBuffer`进行字符串拼接,而非多次创建`String`对象,也能提高效率。

    java笔试题.pdf

    1. 字符串常量池:在Java中,每当创建一个字符串对象时,如果该字符串值已经存在于字符串常量池中,那么系统不会创建新的对象,而是直接引用池中已存在的对象。如果不存在,则会在池中创建新的对象。 2. 字符串创建...

Global site tag (gtag.js) - Google Analytics