首页 > 厂商 > 知识 > 常量池,Jave运行时常量池是什么意思

常量池,Jave运行时常量池是什么意思

来源:整理 时间:2023-08-20 01:27:02 编辑:智能门户 手机版

本文目录一览

1,Jave运行时常量池是什么意思

运行时常量池是方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等信息以外,还有一项信息是常量池用于存储编译器生成的各种字面量和符号引用,这部分信息将在类加载后存放到方法区的运行时常量池中。Java虚拟机对类的每一部分(包括常量池)都有严格的规定,每个字节用于存储哪种数据都必须有规范上的要求,这样才能够被虚拟机认可,装载和执行。一般来说,除了保存Class文件中描述的符号引用外,还会把翻译出来的直接引用也存储在运行时常量池中。

Jave运行时常量池是什么意思

2,java常量池中存放什么8种基本类型和String还有其他的吗

常量池是介于栈和堆外的另一种独立的内存管理空间,相同内容常量池中永远只有一份,基本数据类型、对象的引用都存在栈中,执行速度快,包装类型,对象存储,new出来的对象都是存储在堆中,Byte,Short,Integer,Long,Character这5种整型的包装类只是在对应值小于等于127时才可使用对象池。超过了就会自动申请空间创建对象,所有才会出现上述情况,而String是个较为特殊的包装类型,直接用=“”创建的数据是存放在常量池,且无论数据大小都不会申请空间创建,除非使用new关键字。

java常量池中存放什么8种基本类型和String还有其他的吗

3,Java虚拟机几种常量池区分

jvm在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。在上面我也说了,class常量池中存的是字面量和符号引用,也就是说他们存的并不是对象的实例,而是对象的符号引用值。而经过解析(resolve)之后,也就是把符号引用替换为直接引用,解析的过程会去查询全局字符串池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与全局字符串池中所引用的是一致的。

Java虚拟机几种常量池区分

4,JVM中常量池存放在哪里

java8之前: java8之后:元数据区 Metaspace 由于 PermGen 内存管理的效果远没有达到预期,所以JCP已经着手去除PermGen的工作。在JDK7中,字符串常量已经从永久代移除。现今 JDK8 中 PermGen 已经被彻底移除,取而代之的是metaspace数据区,使用native内存,申请和释放由虚拟机负责管理。 那么,JVM中常量池到底存放在哪里? Java6和6之前,常量池是存放在方法区(永久代)中的。 Java7,将常量池是存放到了堆中。 Java8之后,取消了整个永久代区域,取而代之的是元空间。 运行时常量池和静态常量池存放在元空间中,而字符串常量池依然存放在堆中。

5,Java String常量池在什么位置

常量池中基本数据类型一般在栈中
常量池只有一个。string a = "abc"//现在常量池里找abc,有的话就把a指向它,没有的话就新建 这是在编译期间做的string b = new string("abc");//直接新建一个abc,并把地址给b,这是在运行期间做的a == b //判断a和b的地址是否相等,明显不相等。a.equals(b)//判断a和b指向的字符串常量是否相等,都是"abc",所以是true
需要看你的JVM的版本,不同的JVM版本常量池的位置是不同的!jdk1,6常量池放在方法区jdk1.7常量池放在堆内存jdk1.8放在元空间里面,和堆相独立
JVM > 方法区 > 常量池

6,Java常量池是什么有什么用 和堆栈有关系求简单易懂的解释百度知

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.  2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)  3. 堆:存放所有new出来的对象。  4. 静态域:存放静态成员(static定义的)  5. 常量池:存放字符串常量和基本类型常量(public static final)。  6. 非RAM存储:硬盘等永久存储空间  这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。  对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

7,java常量池是什么

int a = 1;1会存放在栈里 String s1 = "thanks";thanks会存放在data segment里 String s2 = new String("thanks");thanks会存放在data segment里 String a ="th";String b = "anks";String c =a+b;c会存放在data segment里 字符串全部存放在data segment里 常量池全部在栈里。如果你不new的话,比如你写String s = "thanks";这时s分配在栈里,s直接指向字符池里的"thanks";但如果你这样写,String s; s = new String("thanks");这时s指向堆里的一块内存,这个内存里的地址指向字符池里的"thanks";怎么样,楼主这下明白了吧!

8,Java运行时常量池是什么

在class文件中,“常量池”是最复杂也最值得关注的内容。  Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值还,还包含一些以文本形式出现的符号引用,比如:  类和接口的全限定名;  字段的名称和描述符;  方法和名称和描述符。  在C语言中,如果一个程序要调用其它库中的函数,在连接时,该函数在库中的位置(即相对于库文件开头的偏移量)会被写在程序中,在运行时,直接去这个地址调用函数;  而在Java语言中不是这样,一切都是动态的。编译时,如果发现对其它类方法的调用或者对其它类字段的引用的话,记录进class文件中的,只能是一个文本形式的符号引用,在连接过程中,虚拟机根据这个文本信息去查找对应的方法或字段。  所以,与Java语言中的所谓“常量”不同,class文件中的“常量”内容很非富,这些常量集中在class中的一个区域存放,一个紧接着一个,这里就称为“常量池”。java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间。本文只从java使用者的角度来探讨java常量池技术,并不涉及常量池的原理及实现方法。个人认为,如果是真的专注java,就必须对这些细节方面有一定的了解。但知道它的原理和具体的实现方法则不是必须的。常量池中对象和堆中的对象[java] view plain copypublic class Test Integer i1=new Integer(1); Integer i2=new Integer(1); //i1,i2分别位于堆中不同的内存空间 System.out.println(i1==i2);//输出false Integer i3=1; Integer i4=1; //i3,i4指向常量池中同一个内存空间 System.out.println(i3==i4);//输出true //很显然,i1,i3位于不同的内存空间 System.out.println(i1==i3);//输出false } 8种基本类型的包装类和对象池java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象。以下是一些对应的测试代码:[java] view plain copypublic class Test public static void main(String[] args) //5种整形的包装类Byte,Short,Integer,Long,Character的对象, //在值小于127时可以使用常量池 Integer i1=127; Integer i2=127; System.out.println(i1==i2)//输出true //值大于127时,不会从常量池中取对象 Integer i3=128; Integer i4=128; System.out.println(i3==i4)//输出false //Boolean类也实现了常量池技术 Boolean bool1=true; Boolean bool2=true; System.out.println(bool1==bool2);//输出true //浮点类型的包装类没有实现常量池技术 Double d1=1.0; Double d2=1.0; System.out.println(d1==d2)//输出false } } String也实现了常量池技术String类也是java中用得多的类,同样为了创建String对象的方便,也实现了常量池的技术,测试代码如下:[java] view plain copypublic class Test public static void main(String[] args) //s1,s2分别位于堆中不同空间 String s1=new String("hello"); String s2=new String("hello"); System.out.println(s1==s2)//输出false //s3,s4位于池中同一空间 String s3="hello"; String s4="hello"; System.out.println(s3==s4);//输出true } } 最后细节决定成败,写代码更是如此。在JDK5.0之前是不允许直接将基本数据类型的数据直接赋值给其对应地包装类的,如:Integer i = 5; 但是在JDK5.0中支持这种写法,因为编译器会自动将上面的代码转换成如下代码:Integer i=Integer.valueOf(5); 这就是Java的装箱.JDK5.0也提供了自动拆箱. Integer i =5; int j = i; Integer的封装:[java] view plain copypublic static Integer valueOf(int i) final int offset = 128; if (i >= -128 && i <= 127) return IntegerCache.cache[i + offset]; } return new Integer(i); } private static class IntegerCache private IntegerCache()static final Integer cache[] = new Integer[-(-128) + 127 + 1]; static for(int i = 0; i < cache.length; i++) cache[i] = new Integer(i - 128); } } 由于cache[]在IntegerCache类中是静态数组,也就是只需要初始化一次,即static{......}部分,所以,如果Integer对象初始化时是-128~127的范围,就不需要再重新定义申请空间,都是同一个对象---在IntegerCache.cache中,这样可以在一定程度上提高效率。

9,堆栈常量池

全局对象被放在堆,局部对象放在栈,静态对象和方法放在方法区。你光给这些变量的声明和赋值语句没有用啊。比如class ABC和class ABC还有class ABC 放的位置都是完全不一样的。
int a = 1;1会存放在栈里 string s1 = "thanks";thanks会存放在data segment里 string s2 = new string("thanks");thanks会存放在data segment里 string a ="th";string b = "anks";string c =a+b;c会存放在data segment里 字符串全部存放在data segment里 常量池全部在栈里。如果你不new的话,比如你写string s = "thanks";这时s分配在栈里,s直接指向字符池里的"thanks";但如果你这样写,string s; s = new string("thanks");这时s指向堆里的一块内存,这个内存里的地址指向字符池里的"thanks";怎么样,楼主这下明白了吧!

10,什么是字符串常量池

可以理解为内存里面专门为string类型变量开辟的一片区域譬如String a = "abc"; 当你定义这样一个变量的时候,java此时先会去常量池寻找有没有"abc"这样的字符串,如果有,直接把内存地址交给a, 否则就生成一个"abc"的字符串当下一个String b = "abc";的时候,发现常量池已经有"abc"了,此时JVM不会再次生成"abc",而是直接交给"abc"引用给b, 所以此时你会发现a == b
字符串常量是由一对单撇号括起来的单个字符.c语言允许使用字符常量外,还允许使用字符串常量。字符串常量是一对双撇号括起来的字符序列。例如下面的是合法的字符串常量:"howdoyoudo.","china","a","$123.45"可以输出筱字符串,例如:printf("howdoyoudo.");不能将字符串与字符常量混淆。不能把一个字符串常量赋给一个常量变量。这样的,你就可以选择了吧。再给你补充一个别的知识点吧,在c语言中没有专门的字符串变量,如果想将一个字符串存放在变量中以便保存,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。希望这个对你学习有帮助,以后关于c语言的任何问题都可以来问我噢。包括以后的指针数组函数的内容噢好好的学习噢。加油噢加油噢。
文章TAG:常量运行运行时时常常量池

最近更新

  • 四维智联,最近四维智联车挺火的有什么推荐吗四维智联,最近四维智联车挺火的有什么推荐吗

    最近四维智联车挺火的有什么推荐吗2,目前有什么比较靠谱的智能车机推荐一下3,爱驰汽车为什么要投资四维智联4,车悦宝是最近有活动吗5,抖8音乐星球车机和四维智联有什么关系6,无人驾驶概念股.....

    知识 日期:2023-08-20

  • 回环,回环的意思回环,回环的意思

    回环的意思2,回环的意思3,回环的意思是什么4,写作方法回环是什么5,回环怎么练6,回环huhun什么意思近义词和反义词是什么英文翻译是什么7,回环怎么练啊8,什么是回环的修辞手法与语句例子9,写作.....

    知识 日期:2023-08-20

  • 机械硬盘数据恢复原理,根据硬盘的数据恢复原理,能保障每个扇区机械硬盘数据恢复原理,根据硬盘的数据恢复原理,能保障每个扇区

    实硬盘数据能不能丢恢复实硬盘是恢复-4/,就看你的硬盘是软故障还是硬故障了(硬盘坏了右键单击计算机管理磁盘管理If。1、存孩子照片,机械硬盘、固态硬盘、u盘哪个好?哪个使用寿命更长些.....

    知识 日期:2023-08-20

  • 煲机是什么意思,什么是煲机 煲机是什么意思煲机是什么意思,什么是煲机 煲机是什么意思

    什么是煲机煲机是什么意思2,什么是煲机什么是老化3,煲机是啥意思4,煲机是什么意思5,好一点的耳机比如头戴式得刚买回来都要煲机请问哦煲机是什么6,专业发烧音响什么叫煲机1,什么是煲机煲机是.....

    知识 日期:2023-08-20

  • 索菲亚机器人是谁发明的索菲亚机器人是谁发明的

    机器人索菲亚是什么机器人索菲亚是历史上第一个获得公民身份的智力机器人,索菲亚。-1索菲亚威胁要“毁灭人类”,其实最近两年出现了很多机器人人类,当然,索菲亚是领域内的经典,-1索菲亚威胁.....

    知识 日期:2023-08-20

  • 概念手机,十大概念手机概念手机,十大概念手机

    十大概念手机2,诺基亚那款跟叶子一样的概念机什么时候上市3,什么叫概念机手机4,什么是新概念手机5,水晶版iPhone诺基亚公布概念手机Eco6,什么是概念手机1,十大概念手机http://comm.ccidnet.c.....

    知识 日期:2023-08-20

  • 第一人称机器人战,机器人角斗场第一人称第一人称机器人战,机器人角斗场第一人称

    Super机器人WarX沈龙丸有8种形态。超级机器人世界大战X沈龙丸有八种形态,分别是:1,沈龙丸:最基本的形态是英雄的身体,可以发动龙牙神,2.绝地求生:这是一款流行的多人在线游戏,最近也推出了.....

    知识 日期:2023-08-20

  • 菲关系型数据库,什么时候用非关系型数据库菲关系型数据库,什么时候用非关系型数据库

    即非关系型数据库,关系型数据库,非关系型数据库区别!用代码举个例子!谢谢你。Relational数据库通过外键关联建立表之间的关系,非关系型数据库通常是指数据以对象的形式存储在数据库中,对象之.....

    知识 日期:2023-08-20