展开

关键词

首页关键词java 常量池

java 常量池

相关内容

  • 触摸Java常量池

    java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,这次好好总结一下。理论先拙劣的表达一下jvm虚拟内存分布:?程序计数器是jvm执行程序的流水线,存放一些跳转指令,这个太高深,不懂。虚拟机栈是jvm执行java代码所使用的栈。方法区存放了一些常量、静态变量、类信息等,可以理解成class文件在内存中的存放位置。虚拟机堆是jvm执行java代码所使用的堆。Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。前文提到过,class文件中存在一个静态常量池,这个常量池是由编译器生成的,用来存储java源文件中的字面量(本文仅仅关注字面量),假设我们有如下java代码:1 String s = hi;为了方便起见
    来自:
    浏览:586
  • Java常量池理解与总结

    ,后2个存储主版本号,再接着是用于存放常量的常量池,由于常量的数量是不固定的,所以常量池的入口放置一个U2类型的数据(constant_pool_count)存储常量池容量计数值。 
常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中4、常量池的好处常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。 例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。二.8种基本类型的包装类和常量池1、java中基本类型的包装类的大部分都实现了常量池技术,
即Byte,Short,Integer,Long,Character,Boolean;Integer i1 =
    来自:
    浏览:312
  • JAVA-常量及常量池

    文章目录1.常量2.Java常量池2.1. 静态常量池:2.2.运行时常量池:3.基本数据类型包装类常量池4.java字符串常量池1.常量常量表示程序运行过程种不可改变的值,主要作用如下: 1.代表常数,便于程序的重构和修改。 2.增加程序的可读性。java中,为了避免频繁的创建和销毁对象影响系统的性能,引入了常量池,通过常量池实现了对象的共享。java的常量池可做如下分类:2.1. 静态常量池:即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。字符串常量池在java中,用String表示字符串。
    来自:
    浏览:291
  • 广告
    关闭

    腾讯云+社区「校园大使」招募开启!报名拿offer啦~

    我们等你来!

  • Java常量池详解,秒懂各种对象相等操作

    介绍为什么要有常量池?常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。(1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。(2)节省运行时间:比较字符串时,== 比equals()快。基本数据类型的包装类和常量池Java有8种基本数据类型整数类型:byte,short,int,long。包装类型为Byte,Short,Integer,Long浮点类型:float、double。包装类型为Boolean8种包装类型中除了Float,Double没有实现常量池,剩下的都实现了为了更方便理解后面的内容,这里先解释一下自动装箱和拆箱自动装箱和拆箱自动装箱就是Java自动将原始类型值转换成对应的对象Integer.valueOf(5);int num1 = tempNum1.intValue(); jdk1.5之后的写法Integer tempNum2 = 5;int num2 = tempNum2; Integer类常量池这个是我原来面试问到的一个问题
    来自:
    浏览:306
  • Java常量池解析与字符串intern简介

    原文出处: iceAeterna  在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于class文件的常量池,是class文件常量池映射到虚拟机中的数据结构。析,并在该常量池的数据上改为对这个字段的直接引用。5.CONSTANT_String入口解析Java虚拟机会将字符串处理为一个字符串对象加以维护,而虚拟机所维护的就是一张 字符串池,它包含所有被”拘留”的字符串对象的引用。对CONSTANT_String常量池的解析首先就要查看字符串池中该字符串对象的引用是否存在, 如果存在则直接把常量池数据解析为该字符串对象的引用,若不存在,那么就需要根据这个字符串序列创建一个字符串对象(6).其他类型(数据基本类型)入口解析直接使用常量池所包含的常量值即可6.直接引用常量池解析最终将符号引用替换成为直接引用。指向类型、类变量和类方法的直接引用可能为在方法区的指针。
    来自:
    浏览:192
  • Java Class文件常量池

    Class文件的存在使得不同语言编写的程序都可以运行在Java虚拟机上,只需要这些语言经过编译器编译后的Class文件符合Java虚拟机定义的规范,Java虚拟机就可以加载执行这些Class文件。常量池走过了魔数和版本,接下去是Class文件中最关键的部分常量池,常量池由一个计数池和具体的常量项来组成,在我们代码中常量池数量为0x0013(十进制是19),关于常量池的计数池有一个比较特殊的地方就是他是从1开始计数的,也就是说如果我们计数池的值是19,实际上是只有18个常量项。常量池中主要存放两大类常量:字面量符号引用字面量主要指的是文本字符串、声明为final的常量值等符号引用主要包含三类常量:类和接口的全限定名字段的名称和描述符方法的名称和描述符Java代码在编译的时候不存在连接时通过比较javap -verbose常量池的项的索引和我们class文件二进制的表示可以发现是一一对应的。
    来自:
    浏览:137
  • 第46节:Java当中的常量池

    标题图Java当中的常量池在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区。我们知道在class文件中,有类的版本信息,字段信息,方法,接口等信息,还有一个就是常量池, 这个就是class文件常量池了。class文件常量池主要用于存放的是什么呢?常量池是以表的形式存在(表是用来存储字符串值的,不存储符号引用),实际可以分两种,一种为静态常量池,另一种为运行时常量池,共有11中常量表,常量池的每一个常量都代表一张表。Class@ since JDK1.0 常量池: Class文件中存储所有常量 在Java中说过常量池可以分两种形态,静态常量池和运行时常量池。运行时常量池是java虚拟机在完成类加载后的操作,将class文件中的常量池加载到内存中,并保证在方法区,我们口中的常量池是在方法区中运行的常量池,运行时常量池具有动态性,在运行期间也能产生新的常量放入池中
    来自:
    浏览:376
  • 彻底弄懂java中的常量池

    0、Class文件常量池class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,我们编写的java文件就被编译为.class文件格式的二进制数据存放在磁盘中,其中就包括class文件常量池运行时常量池的作用是存储java class文件常量池中的符号信息,运行时常量池中保存着一些class文件中描述的符号引用,同时在类的解析阶段还会将这些符号引用翻译出直接引用(直接指向实例对象的指针,内存地址运行时常量池相对于class常量池一大特征就是具有动态性,java规范并不要求常量只能在运行时才产生,也就是说运行时常量池的内容并不全部来自class常量池,在运行时可以通过代码生成常量并将其放入运行时常量池中JDK6 常量池存在持久代,设置了持久代大小后,不断while循环必将撑满 Perm 导致内存溢出;JDK7 常量池被移动到 Native Heap(Java Heap,HotSpot VM中不区分native3、JAVA 基本类型的封装类及对应常量池java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现
    来自:
    浏览:9165
  • Java中的字符串常量池

    这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池。JVM通过字符串常量池查找不到内容为droid的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给变量str1。intern对于上面使用new创建的字符串对象,如果想将这个对象的引用加入到字符串常量池,可以使用intern方法。字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。字符串常量池存放的是对象引用,不是对象。在Java中,对象都创建在堆内存中。更新验证,收到的很多评论也在讨论这个问题,我简单的进行了验证。
    来自:
    浏览:428
  • 一个高频面试题,考考大家对 Java String 常量池的理解。

    问题:前辈,请教个问题,下面两行代码,会在JAVA字符串常量池中产生几个字符串。String:字符串常量池作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池:字符串常量池的设计意图是什么字符串常量池在哪里?如何操作字符串常量池?字符串常量池的设计思想字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化为字符串开辟一个字符串常量池java.lang.String.intern()返回一个保留池字符串,就是一个在全局字符串池中有了一个入口。
    来自:
    浏览:389
  • Java的String常量池在哪里存在,堆或栈?

    我知道常量池的概念和JVM用来处理字符串字符串的字符串常量池。但是我不知道JVM使用哪种类型的内存来存储字符串常量文字。堆栈或堆?
    来自:
    回答:2
  • 我们可以访问或查询Java String intern(常量)池吗?

    是否有方法访问我们自己程序中字符串常量池的内容?假设我有一些基本代码可以这样做: String str1 = foo;String str2 = bar; 现在有两个字符串在我们的字符串常量池中浮动。是否有方法访问池并输出上述值或获取当前池中包含的元素总数? E.
    来自:
    回答:1
  • 我们可以访问或查询Java String intern(常量)池吗?

    有没有办法在我们自己的程序中访问String常量池的内容?假设我有一些基本的代码可以做到这一点: String str1 = foo;String str2 = bar; 现在有2个字符串在我们的字符串常量池中浮动。有没有办法访问池并打印出上述值或获取当前包含在池中的当前总元素数?
    来自:
    回答:1
  • java堆、栈、堆栈,常量池的区别,史上最全总结

    我们今天重点讲的是Java里的堆和栈也就是系统方面的堆和栈。 Java里的堆、栈和常量池(下面以图文的方式讲解,方便大家理解)1.常量池:存放字符串常量和基本类型常量(public static final)。常量池的好处是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。(1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。(2)节省运行时间:比较字符串时,==比equals()快。(2) 然后在堆中(不是常量池)创建一个指定的对象,并让str引用指向该对象。 (3) 在常量池中查找是否存在内容为abc字符串对象。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有
    来自:
    浏览:701
  • 常量池之字符串常量池String.intern()

    运行时常量池是方法区(PermGen)的一部分。需要提前了解: 1. JVM内存模型。 2.JAVA对象在JVM中内存分配常量池的好处常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。Java的自动装箱中其实就使用到了运行时常量池。详见:Java 自动装箱与拆箱的实现原理 还有字符串常量池。字符串进入到常量池的两种方法:1. new String()的实例调用intern()方法。     重要提示:虚拟机启动时常量池中就存在“java”字符串实例,下面代码中s2调用intern()方法时,只是返回常量池中“java”实例的引用,而没有添加“java”实例。JDK1.7-JDK1.8常量池内存模型?Paste_Image.png如图中,我们可以看到常量池位于方法区(PermGen),但常量池引用的字符串实例在堆中。
    来自:
    浏览:540
  • java堆、栈、堆栈,常量池的区别,史上最全总结

    我们今天重点讲的是Java里的堆和栈也就是系统方面的堆和栈。 Java里的堆、栈和常量池(下面以图文的方式讲解,方便大家理解)1.常量池:存放字符串常量和基本类型常量(public static final)。常量池的好处是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。(1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。(2)节省运行时间:比较字符串时,==比equals()快。(2) 然后在堆中(不是常量池)创建一个指定的对象,并让str引用指向该对象。 (3) 在常量池中查找是否存在内容为abc字符串对象。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有
    来自:
    浏览:948
  • Jvm常量池、运行时常量池、字符串常量池理解

    常量池是.class文件的常量池,也可以理解为一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息运行时常量池常量池是*.class文件中的,当该类被加载,它的常量池信息就会放入运行时常量池而运行时常量池是在方法区,而且可在JVM运行期间动态向运行时常量池中写入数据。stack_item * stack = frame_type = 255 * full_frame * offset_delta = 0 locals = stack = }SourceFile: Test.java可以看出s3和s5都是对#4常量池的引用,为true的原因是jvm存在编译期优化的机制,在编译期(javac *.java时)会将可以拼接的字符串常量帮你自动拼接了,由于字符串常量池中已经存在了,因此会让s3=s6输出true简单介绍intern方法,可以使用intern方法,主动将串池中还没有的字符串对象放入字符串常量池通过intern方法主动将s4的字符串放入了字符串常量池,将这个字符串对象尝试放入串池
    来自:
    浏览:345
  • Java内存分配之堆、栈和常量池

    java内存分配主要包括以下几个区域:寄存器:我们在程序中无法控制栈:存放基本的类型数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中堆:存放用new产生的数据静态域:存放在对象中用static定义的静态成员常量池常量池 (constant pool)  常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。  String的 intern()方法就是扩充常量池的 一个方法;当一个String实例str调用intern()方法时,Java 查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用
    来自:
    浏览:363
  • 关于Java里面的字符串常量池的介绍和优化

    前言上一篇文章提到我们在java里面不是通过new创建的string字符串会被放到一个叫字符串常量池的地方,那么本篇文章我们就来详细的了解下常量池的相关知识。System.out.println(constantString1==internString);true System.out.println(constantString2==internString);false关于常量池的pool的大小:-XX:+PrintFlagsFinal-XX:+PrintStringTableStatistics` 然后使用如下命令增加其大小:-XX:StringTableSize=4901` 增大常量池的大小将会消耗更多的堆内存JAVA9中的字符串优化直到java8,string类型底层还是使用char数组进行存储,编码使用utf-16,以便于每个字符可以在内存里面使用2个byte,在java9里面提出来compact string总结本文介绍了java里面有关字符串常量池的功能,内存分配,优化及注意事项,了解这些之后将更有助于我们对它的使用和掌握。
    来自:
    浏览:309
  • 深入理解字符串常量池

    每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串(这点对理解上面至关重要)。Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。但是在Java中根本就不存在两个完全一模一样的字符串对象。故堆中的chenssy应该是引用字符串常量池中chenssy。
    来自:
    浏览:306

相关视频

10分30秒

java期末速成02变量常量

18分51秒

Java教程 9 连接池综合应用 02 dbcp 学习猿地

9分9秒

Java教程 9 连接池综合应用 03 c3p0 学习猿地

11分49秒

Java教程 9 连接池综合应用 04 druid 学习猿地

30分45秒

Java教程 9 连接池综合应用 01 回顾 学习猿地

相关资讯

相关关键词

活动推荐

    运营活动

    活动名称
    广告关闭

    扫码关注云+社区

    领取腾讯云代金券