`

字符串常量池的理解

 
阅读更多
  • 字符串常量池

JVM为了减少字符串对象的重复创建,其维护了一块特殊的内存,这段内存被称为字符串常量池(存储在方法区中)。

 

  • 具体实现

当代码中出现字符串时,JVM首先会对其进行检查。

①、如果字符串常量池中存在相同内容的字符串对象,则将这个对象的地址返回

②、如果字符串常量池中不存在相同内容的字符串对象,则创建一个新的字符串对象并放入常量池

 

class T1 {
	public String s1 = "test";
}

class T2 {
	public String s2 = "test";
}

public class StringTest {
	public static void main(String[] args) {
		System.out.println(new T1().s1 == new T2().s2);  //true
	}
}

 

 

new String("test")时,首先也会去检查常量池是否存在“test”(存在则不创建、不存在则在常量池先创建一个),然后在堆空间再开辟一块内存区域创建字符串对象 。

 

  • 实现前提

java中String对象是不可变的(使用final修饰),这样可以安全保证多个变量共享同一个对象。如果String对象可变,一个引用改变了对象的值,那么其他变量的值也会跟着受影响,显然不合理。

 

分享到:
评论

相关推荐

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

    在Java编程语言中,字符串常量池(String Constant Pool)是一个重要的概念,它与程序的内存管理和性能优化密切相关。...通过对字符串常量池的深入理解和应用,我们可以编写出更加高效、内存占用更低的Java程序。

    字符数组的存储方式 字符串常量池.docx

    在Java编程语言中,字符串是极其重要的数据类型,它们...总之,理解字符串常量池和字符串在JVM中的存储方式对于优化代码性能至关重要。正确地使用字符串和理解其内存管理机制可以避免不必要的内存开销,提升程序效率。

    8 StringTable(字符串常量池).md,学习代码

    **StringTable(字符串常量池)详解** 在Java编程语言中,`StringTable`是一个重要的概念,它涉及到字符串对象的创建、存储以及内存管理。理解`StringTable`的工作原理对于优化程序性能和节省内存资源至关重要。 #...

    Java 中的字符串常量池详解

    理解Java中的字符串常量池对于编写高效、内存友好的代码至关重要。合理使用字符串字面量、`new`创建以及`intern()`方法,可以帮助优化内存使用,提高程序运行效率。在处理大量字符串时,应谨慎考虑对象的创建方式,...

    Java String 字符串常量池解析

    Java String 字符串常量池解析 Java 中的字符串常量池是一种为了提高性能和减少内存开销的机制。...理解字符串常量池的机制可以帮助我们更好地理解 Java 中的字符串处理机制,并且可以帮助我们编写更加高效的程序。

    Java中的字符串常量池详细介绍

    Java中的字符串常量池是Java虚拟机...总之,理解Java中的字符串常量池及其工作原理对于优化代码性能、减少内存消耗至关重要。开发者应合理利用`String`的字面量创建和`intern()`方法,以达到最佳的内存管理和程序效率。

    C#之CLR内存字符串常量池(string)

    本文将深入探讨C#中的CLR(Common Language Runtime)内存字符串常量池,以及它如何处理和优化字符串。 首先,我们需要理解C#中的内存模型。在C#中,内存分为两种主要区域:堆(Heap)和栈(Stack)。栈主要用于...

    深入解析JVM之内存结构及字符串常量池(推荐)

    "深入解析JVM之内存结构及字符串常量池" JVM(Java Virtual Machine)是Java语言的核心组件之一,负责将Java代码编译成机器代码并执行。JVM的内存结构是Java开发者需要了解的基础知识之一,本文将深入解析JVM之内存...

    理解java中的字符串的内存分配

    而在第二行比较中,由于 `"hello"` 和 `"world"` 都是字符串字面量,它们会被合并成一个 `"helloworld"` 字符串字面量,这使得 `s3` 与 `"hello" + "world"` 实际上都指向字符串常量池中的同一个对象。 通过使用反...

    深入理解 Java String#intern() 内存模型.docx

    在 Java6 中,字符串常量池是放在 Perm 空间的,而从 Java7 开始,字符串常量池被移到 Heap 空间。 Perm 空间是一个固定大小的内存区域,用于存储类的元数据、方法、字段和字符串常量池等信息。当 Perm 空间接近满的...

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

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

    图解JVM的内存结构及字符串常量池方法详解.docx

    在实际开发中,我们还需要关注JVM的其他重要概念,如类加载机制(加载、验证、准备、解析、初始化)、类文件结构(魔数、版本号、常量池等)、垃圾回收算法(如标记-清除、复制、标记-整理、分代收集)以及执行引擎...

    06-VIP-JVM调优实战及常量池详解(1)1

    总的来说,理解和优化JVM中的字符串常量池、垃圾收集机制以及字节码的运行时行为,对于提升Java应用的性能至关重要。通过细致的分析和适当的参数调整,开发者可以确保应用程序在运行时既高效又稳定。

    java 创建字符串类

    - 字符串常量池是JVM内存中的一个特殊区域,用于存放所有的字符串字面量。当创建一个`String`对象时,如果常量池中已经存在相同内容的字符串,那么将返回该字符串的引用,而不是创建新的对象。 4. **字符串比较**...

    JDK8的JVM内存结构,元空间替代永久代成为方法区及常量池的变化1

    字符串常量池在JDK8之前位于永久代,但在变化后,它被移出永久代,仍然保留在堆内存中,可能是为了更方便地进行垃圾回收。与此相似,整型常量池也独立出来,用于存储基本类型整数的常量。 整体来看,JDK8的JVM内存...

    通过String.intern()方法浅谈堆中常量池

    这个方法的主要功能是检查当前字符串对象的值是否已经在Java虚拟机(JVM)的字符串常量池中存在。如果存在,它会返回常量池中的引用;如果不存在,它会将当前字符串的引用放入常量池,并返回这个新添加的引用。 在...

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

    如果在常量池中已经存在相同的Unicode字符串常量,那么String.intern()方法将返回该常量池中的字符串常量的引用,否则,它将在常量池中增加一个新的字符串常量。 例如,String s0="kvill";,String s1=new String(...

    java内存分配之常量池,栈,堆1

    在运行时,如果两个字符串的值相等,它们在常量池中可能只有一份拷贝,这是Java字符串常量池复用机制的体现。在Java 6及之前,字符串常量池位于永久代,从Java 7开始移到了堆中。 栈和堆之间的区别在于,栈中的数据...

    老生常谈Java String字符串(必看篇)

    当我们创建一个新的 String 对象时,JVM 会首先检查字符串常量池中是否已经存在相同内容的字符串对象的引用,如果存在,则将该引用返回,否则将创建一个新的字符串对象,并将其引用加入到字符串常量池中。...

Global site tag (gtag.js) - Google Analytics