`

string 常量池

    博客分类:
  • java
阅读更多
http://hi.baidu.com/farush/blog/item/1f73c8ea7da183d3d439c952.html

存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;请看下面的例子:


String s0= "abc"

String s1=new String("abc");

String s2=new String("abc");
System.out.println(s0==s1)

s1.intern(); //虽然执行了s1.intern(),但它的返回值没有赋给s1

s2=s2.intern(); //把常量池中“abc”的引用赋给s2

System.out.println(s0==s1);

System.out.println(s0==s1.intern());

System.out.println(s0==s2);

结果为:

false

false

true //说明s1.intern()返回的是常量池中”abc”的引用

true

分享到:
评论

相关推荐

    【Java面试题】对String常量池的理解

    【Java面试题】对String常量池的理解

    java String源码和String常量池的全面解析

    Java String 源码和 String 常量池的全面解析 Java String 源码和 String 常量池是 Java 语言中非常重要的两个概念,它们之间存在着紧密的联系。在 Java 语言中,String 类是不可变的,finalize 方法被禁用,以确保...

    string常量池和intern_韩雅茹Java系列2021.pdf

    在Java中,有两种创建字符串对象的方式:直接使用双引号声明出来的String对象会直接存储在常量池中。如果不是用双引号声明的String对象,可以使用String提供的intern方法。intern方法会从字符串常量池中查询当前字符...

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

    这个类有一些特殊特性,包括常量池(String Pool)和两个常用的比较方法:`equals()`和`==`。理解这些概念对于编写高效、无错误的Java代码至关重要。 首先,`String`类的常量池是在内存中的一个区域,用于存储字符...

    Java String 字符串常量池解析

    Java String 字符串常量池解析 Java 中的字符串常量池是一种为了提高性能和减少内存开销的机制。它是 JVM 实例化字符串常量时进行的一些优化,主要是为了减少字符串对象的创建和存储。 字符串常量池的设计思想是...

    享元模式,内含可运行代码和解释

    享元模式是一种经典的设计模式,属于结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在许多场景下,特别是计算机编程中,我们可能会遇到大量的相似对象,比如在图形...

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

    在Java内存管理中,堆(Heap)、栈(Stack)、常量池(Constant Pool)和方法区(Method Area)是四个核心概念,它们在Java程序运行时扮演着不同的角色。 首先,方法区是用来存放类的信息、常量、静态变量等数据的...

    java基础知识面试题

    本文将围绕 Java 基础知识面试题展开,涵盖 String、StringBuffer、StringBuilder 的区别、==和 equals 的区别、String 常量池等知识点。 一、String、StringBuffer、StringBuilder 的区别 String、StringBuffer、...

    正确使用String类的几点注意

    #### 四、关于String常量池 **4.1 intern()方法** 对于通过直接赋值创建的字符串,如`String s = "hello"`,这个字符串会被自动存储在常量池中。而通过`new`创建的字符串则不会自动存入常量池。但是,可以使用`...

    Java堆,栈和常量池详解

    ### Java堆、栈和常量池详解 #### Java内存模型概览 在深入探讨Java中的堆、栈以及常量池之前,我们先来简要回顾一下Java内存模型的基本概念。Java程序运行时会使用到不同的内存区域来存储各种类型的数据,这些...

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

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

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

    在Java中,内存主要分为四个区域:寄存器、栈、堆和方法区(包括常量池)。以下是这四个区域的详细说明: 1. **寄存器**: 这是计算机硬件的一部分,用于存储非常快速访问的数据。在Java中,寄存器主要由JVM直接管理...

    Java堆、栈和常量池——内存剖析

    ### Java堆、栈和常量池——内存剖析 #### 寄存器 寄存器作为最快的存储区域之一,由编译器自动管理分配与回收,它位于CPU内,用于存储临时变量,例如局部变量和一些操作数。由于寄存器的数量有限且由编译器自动...

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

    在Java程序的编译过程中,每个`.class`文件都会包含一个常量池,这个常量池被称为Class常量池或者静态常量池。它存在于每个`.class`文件的`Constant Pool`部分,并在类加载时被创建。Class常量池主要存储两种类型的...

    常量池详解归类.pdf

    对于`String`类,它是Java中最常用的类之一,其字符串字面量(如"hello")在编译时就会放入常量池。在创建`String`对象时,如果使用字面量的方式(如`String s1="hello";`),那么相同的字面量将会引用常量池中的...

    java常量池分析.pdf

    `new`指令用于在堆上创建一个新的`String`对象,`dup`指令复制栈顶的引用,`ldc`指令再次从常量池获取"haha"的引用,`invokespecial`调用`String`构造器来初始化新对象,最后`astore_1`将新对象的引用存储到变量`s`...

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

    在Java编程语言中,字符串常量池(String Constant Pool)是一个重要的概念,它与程序的内存管理和性能优化密切相关。理解这个概念对于任何Java开发者来说都至关重要。字符串常量池是Java虚拟机(JVM)在运行时为...

    Java中的String池

    当我们使用`new String("Hello")`创建字符串时,即使字符串字面量已经存在于常量池中,也会创建一个新的String对象。这是因为`new`关键字总是创建一个新的对象实例。 #### 示例代码解析 考虑下面这段示例代码: `...

    【大厂面试题总结】JavaSE面试题总结详细教程

    【大厂面试题总结】JavaSE面试题总结详细教程: 目录: 递归算法之输出某个目录下所有文件和子目录列表 泛型中extends和super的区别 内部类的理解 深入理解Java的反射机制 ...string常量池和intern韩雅茹

    深入探索Java常量池

    例如,在String类中,intern()方法可以将字符串常量池中的对象返回,而不是创建新的字符串对象。在Integer类中,valueOf方法可以从常量池中获取对象,而不是创建新的Integer对象。 Java常量池是Java虚拟机中一个...

Global site tag (gtag.js) - Google Analytics