首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java常量【Class常量、运行时常量、字符串常量

运行时常量存在于内存,是方法区的一部分。它是Class常量被加载到内存之后的版本。...运行时常量相对于Class文件常量的另一个重要特征是具备动态性,Java语言并不要求常量一定只在编译期才能产生,也就是说,并非预置入Class文件中常量的内容才能进入方法区运行时常量,运行期间也可以将新的常量放入池中...而当类加载到内存后,JVM就会将Class常量池中的内容放到运行时常量池中,因此,每个类都有一个运行时常量。...字符串常量 字符串常量Java内存区域的哪个位置? 在JDK6.0及之前的版本,字符串常量是放在Perm Gen区(也就是方法区); 在JDK7.0版本,字符串常量被移到了堆。...在JDK1.7字符串常量和静态变量被从方法区拿到了堆,运行时常量剩下的还在方法区,也就是HotSpot的永久代

1.6K20

integer常量在哪_java 常量

目录 常量 Integer a= 127 与 Integer b = 127相等吗 ---- 常量 java存在字符串常量,维护了所有String对象 使用String s=”zx”的时候是使用...String.valueOf(“zx”)从常量池中找了个对象返回 如果不存在则将内容放入常量池中 在使用new的时候是直接创建一个新的对象在堆 Integer也有常量 其中缓存了-128到127之间的数字...如果整型字面量的值在-128 到 127 之间,那么自动装箱时不会 new 新的Integer 对象,而是直接引用Integer常量池中的 Integer 对象,超过范围 a1==b1...System.out.println(b == c); // true //如果整型字面量的值在-128到127之间, //那么自动装箱时不会new 新的Integer 对象, //而是直接引用常量池中的

89520
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java常量(静态常量与运行时常量

    今天说一说Java常量(静态常量与运行时常量)[通俗易懂],希望能够帮助大家进步!!! 1、什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变!...final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量Java常量,实际上分为两种形态:静态常量和运行时常量。...2)而运行时常量,则是jvm虚拟机在完成类装载操作后,将class文件常量载入到内存,并保存在方法区,我们常说的常量,就是指方法区的运行时常量。...,包括了如下三种类型的常量: 类和接口的全限定名; 字段名称和描述符; 方法名称和描述符 Java八种基本类型的包装类的大部分都实现了常量技术,它们是Byte、Short...运行时常量相对于CLass文件常量的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量的内容才能进入方法区运行时常量,运行期间也可能将新的常量放入池中

    2.3K21

    彻底弄懂java常量

    0、Class文件常量 class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,我们编写的java文件就被编译为.class文件格式的二进制数据存放在磁盘,其中就包括class文件常量...运行时常量的作用是存储java class文件常量池中的符号信息,运行时常量池中保存着一些class文件描述的符号引用,同时在类的解析阶段还会将这些符号引用翻译出直接引用(直接指向实例对象的指针,内存地址...这里需要注意的是,一个字节只是代表这里有一个byte类型的数组,而这个数组的长度当然可以远远大于一个字节。...JDK6 常量存在持久代,设置了持久代大小后,不断while循环必将撑满 Perm 导致内存溢出;JDK7 常量被移动到 Native Heap(Java Heap,HotSpot VM不区分native...3、JAVA 基本类型的封装类及对应常量 java基本类型的包装类的大部分都实现了常量技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现

    95001

    jvm字符串常量_java 常量

    常量 class常量 Java源文件编译之后得到的class文件,其中有项信息就是常量,保存有字面量和符号引用,比如 public class JvmClass1 { final int b=...c=”java”; String d=”abcd”; String e=”java”; String f=new String(“java”); } } 运行时常量 && 字符串常量 class常量被加载到内存后...,形成了运行时常量,Jdk1.7之前位于方法区,Jdk1.8之后是放在元空间,或者把元空间看做是新的方法区。...运行时常量相对于class常量的一个特点是具有动态性,Java不要求所有常量在编译器产生,可以在运行时产生常量加入常量,例如String类的intern()。...意思是当一个字符串对象调用intern方法,如果池中已经存在值相等(通过String的equal函数比较)的字符串常量,就返回常量池中的常量,也就是堆对应实例的引用。否则将这个字符串加入常量

    52620

    java常量在方法区还是堆_JAVA常量

    所以,最终的测试结论: 结论:这个常量(特指字符串常量而不是所有的常量),应该还是在Java heap里面, 上面的测试只能证明:jdk1.8 字符串常量是在堆里面。...JAVA的三种常量 此外,Java有三种常量,即字符串常量(又叫全局字符串)、class文件常量、运行时常量。 1....每个类都有一个运行时常量 3. class文件常量(class constant pool) class常量是在编译后每个class文件都有的,class文件除了包含类的版本、字段、方法、接口等描述信息外...*字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。 按照这个分析的话, 运行时常量和静态常量存放在元空间中,而字符串常量依然存放在堆。...堆包含正常对象和常量,new String()放入堆,String::inter会将堆的String变量放入堆常量池中。 这个解释就比较完美了。

    2.9K20

    彻底弄懂java常量

    0、Class文件常量 class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,我们编写的java文件就被编译为.class文件格式的二进制数据存放在磁盘,其中就包括class文件常量...运行时常量的作用是存储java class文件常量池中的符号信息,运行时常量池中保存着一些class文件描述的符号引用,同时在类的解析阶段还会将这些符号引用翻译出直接引用(直接指向实例对象的指针,内存地址...这里需要注意的是,一个字节只是代表这里有一个byte类型的数组,而这个数组的长度当然可以远远大于一个字节。...JDK6 常量存在持久代,设置了持久代大小后,不断while循环必将撑满 Perm 导致内存溢出;JDK7 常量被移动到 Native Heap(Java Heap,HotSpot VM不区分native...3、JAVA 基本类型的封装类及对应常量 java基本类型的包装类的大部分都实现了常量技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现

    22.3K118

    触摸Java常量

    虚拟机栈是jvm执行java代码所使用的栈。 方法区存放了一些常量、静态变量、类信息等,可以理解成class文件在内存的存放位置。 虚拟机堆是jvm执行java代码所使用的堆。...Java常量,实际上分为两种形态:静态常量和运行时常量。...所谓静态常量,即*.class文件常量,class文件常量不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。...而运行时常量,则是jvm虚拟机在完成类装载操作后,将class文件常量载入到内存,并保存在方法区,我们常说的常量,就是指方法区的运行时常量。...前文提到过,class文件存在一个静态常量,这个常量是由编译器生成的,用来存储java源文件的字面量(本文仅仅关注字面量),假设我们有如下java代码: 1 String s = "hi"; 为了方便起见

    1.1K10

    Java的字符串常量

    这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量或者字符串字面量。...字符串常量实现的前提条件就是JavaString对象是不可变的,这样可以安全保证多个变量共享同一个对象。...如果Java的String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。 引用 or 对象 字符串常量池中存放的时引用还是对象,这个问题是最常见的。...字符串常量存放的是对象引用,不是对象。在Java,对象都创建在堆内存。 更新验证,收到的很多评论也在讨论这个问题,我简单的进行了验证。...e.printStackTrace(); } } } return null; } } 由于字符串常量存在于堆内存的永久代

    1.2K20

    Java Class文件常量

    Class文件的存在使得不同语言编写的程序都可以运行在Java虚拟机上,只需要这些语言经过编译器编译后的Class文件符合Java虚拟机定义的规范,Java虚拟机就可以加载执行这些Class文件。...常量 走过了魔数和版本,接下去是Class文件中最关键的部分常量常量由一个计数和具体的常量项来组成,在我们代码中常量数量为0x0013(十进制是19),关于常量的计数有一个比较特殊的地方就是他是从...1开始计数的,也就是说如果我们计数的值是19,实际上是只有18个常量项。...常量池中主要存放两大类常量: 字面量 符号引用 字面量主要指的是文本字符串、声明为final的常量值等 符号引用主要包含三类常量: 类和接口的全限定名 字段的名称和描述符 方法的名称和描述符 Java代码在编译的时候不存在连接时...,也就是Class文件不会保存各个方法、字段的最终内存布局信息,这些字段、方法的符号引用如果在运行期不进行转换则得不到真正的内存入口地址,所以在虚拟机运行时,需要从常量获得对应的符号引用,在类创建和运行时解析翻译到具体的内存地址

    76820

    Java当中的常量

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

    34610

    java 常量和运行时常量_常量在jvm的哪个部分

    前言 一直在《深入理解JVM》对常量只有一个浅薄的了解,之前也遇到过这种题目,今天还是要挑出来进行一次全方位的了解。 常量分类 常量大体可以分为:静态常量,运行时常量。...静态常量 存在于class文件,比如经常使用的javap -verbose常量总是在最前面把?...运行时常量呢,就是在class文件被加载进了内存之后,常量保存在了方法区,通常说的常量 值的是运行时常量。...4、s1 = = s9 在JAVA9,因为用的是动态调用,所以返回的是一个新的String对象。...包装类的常量技术(缓存) 简单介绍 相信学过java的同学都知道自动装箱和自动拆箱,自动装箱常见的就是valueOf这个方法,自动拆箱就是intValue方法。

    37230

    class文件常量与运行时常量_java运行时常量

    在上一博文《JVM进阶(十八)——初识Class文件》,我们了解了Class文件的一些基础知识。他的整个内部结构就是一张很大的表,我们就是从这张表入手,一一分析每个部分的结构。...接下来就是说明常量的个数了。代表着常量池中有多少个常量,由于常量池中的常量数量不确定,所以才会有这个数据项。...这里所指的常量JAVA代码中所说的常量有所不同,这里的常量主要包括字面量和符号引用,这两个概念很好理解。 字面量跟JAVA代码常量概念类似,如字符串、常量的值等等。...这里我们来回忆一下类加载机制的解析阶段:他是将符号引用转化为直接引用。直接引用指的就是可以直接指向目标的指针。...紧接着常量数量之后的便是常量表了。刚刚也说了,每个表都会有一个一个字节的标志位,那么常量数量0x002E之后一个字节便是0x0A,这个就是标志位,十进制是10,查表可知是个方法的符号引用。

    40620

    Java字符串常量_字符串常量溢出

    Java的内存分配,总共3种常量Java 常量详解(二)class文件常量Java 常量详解(三)class运行时常量 1.字符串常量(String Constant Pool...) 在JDK1.7之前运行时常量逻辑包含字符串常量存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代 在JDK1.7 字符串常量被从方法区拿到了堆, 这里没有提到运行时常量,也就是说字符串常量被单独拿到堆...,运行时常量剩下的东西还在方法区, 也就是hotspot的永久代 在JDK1.8 hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量还在堆, 运行时常量还在方法区...存的是引用值而不是具体的实例对象,具体的实例对象是在堆开辟的一块空间存放的) 如何将String对象放入到常量 “abc” 双引号String 对象会自动放入常量 调用String的intern...Integer 对象在底层实际上就是一个变量名为 cache 的数组,里面包含了 -128 ~ 127 的 Integer 对象实例。

    1.1K30

    Java Class文件之常量

    上一篇Java Class文件格式详解 讲解了整个Class文件的组成部分,因为篇幅的原因没做太多过细的分析,今天我们重点分析下常量。...上一篇文章讲了常量总共17(上一篇写的是18,修正一下,因为2没有使用)种类型,我们来分析其中最常用的类型。...三、实例分析 接下来我们分析上面代码字节码 ? 上面是整个字节码的部分截图,我们来逐一分析下。...前面4字节是CA FE BA BE,这是固定的魔幻数; 接下来4字节是版本号:00 00 00 34 ,换成10进制是52,这是JDK8的版本号; 接下来是00 8C ,这个表示常量常量项的个数,一共有...0022,再接下来2字节是004C,表示类名索引是34,描述索引是76,那整个常量的第34和76项是什么呢,可以用Javap看下结果, #1 = Methodref #34.#76

    68320

    Java常量理解与总结

    ,包括了如下三种类型的常量: 类和接口的全限定名 字段名称和描述符 方法名称和描述符 3、方法区的运行时常量 运行时常量是方法区的一部分。...运行时常量相对于CLass文件常量的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量的内容才能进入方法区运行时常量,运行期间也可能将新的常量放入池中...二.8种基本类型的包装类和常量 1、java基本类型的包装类的大部分都实现了常量技术,即Byte,Short,Integer,Long,Character,Boolean; Integer i1...Java的自动装箱与拆箱 ##三.String类和常量 1、String对象创建方式 String str1 = "abcd"; String str2 = new String("abcd");...4、java.lang.String.intern() 运行时常量相对于CLass文件常量的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量的内容才能进入方法区运行时常量

    60421

    Jvm常量、运行时常量、字符串常量理解

    常量 是.class文件的常量,也可以理解为一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息 运行时常量 常量是*.class文件的,当该类被加载,它的常量信息就会放入运行时常量...,并把里面的符号地址变为真实地址 常量只有类文件在编译的时候才会产生,而且是存储在类文件的。...字符串常量(string pool) 字符串常量池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool(记住:string...在jdk1.8后,将String常量放到了堆。 String table还存在一个hash表的特性,里面不存在相同的两个字符串,默认容量为1009。...源码的toString方法会发现,调用了new String(),那么就会在堆重新开辟一个内存空间,与之前的s3字符串常量没什么关系,也就是指向地址都不一样了,所以会输出false s3=s5输出true

    1.6K30

    Java八种包装类、常量

    常量Java常量Java内存管理的一个重要概念,主要用于存储字符串常量、基本类型包装类常量、类和方法的全限定名等。...这意味着在Java程序,两个相等的字符串常量或基本类型包装类常量实际上是指向常量池中同一个对象的引用。Java常量主要包括以下几个部分:字符串常量:用于存储字符串字面量。...需要注意的是,Java 7及以后的版本对String常量和Integer常量做了一些优化。...三、包装类的常量技术(缓存Java八种基本数据类型的包装类大部分都实现了缓存技术,目的是为了避免重复创建对象,提供性能、节省内存。...基本数据类型直接存放在栈,包装类型作为一种引用数据类型 在堆上分配内存(具体内容存放在堆,栈存放的是其具体内容所在内存的地址);Java在jdk1.5后包装类常量使用缓存实现,缓冲也叫常量.

    17510
    领券