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

同事:你能跟我聊聊class文件么?

但对于一些比较大的数字(主要是那些无法用4个字节表示的类型,例如float、double等类型),则会被记录在常量池中,当需要使用这些操作数的时候,会根据索引值到常量池中来查取。...Java中总共支持14种tag,命名的规则是:CONSTANT_XXX_info,其中XXX是具体的常量类型,可以是Integer、Float、String等。...前面说了,int类型占用的空间不超过4字节,按理来说是不会加入到常量池中的,而且在本类中a,b,c三个变量都是整型的,为什么只有值100被加入到了常量池,变量b的值101怎么没有加入到常量池中?...跟字段名索引的功能类似,指向常量池中的一个字符串常量,但是为了节省空间,字段的类型是用简写方式表示的,例如: 基础类型,byte、int、char、float等这些简单类型使用一个大写字符来表示,B对应...我们在3.3 常量池的部分中抛出了一个问题,为什么int类型字段值只有声明为final后才会被保存到常量池中? 这里就能得到答案。

53420

Java八种包装类、常量池

基本类型包装类常量池:对于基本类型的包装类(如Integer、Boolean等),当使用自动装箱创建包装类对象时,如果值的范围在缓存范围内(如Integer的缓存范围是-128到127),则直接从缓存中获取对象...类元数据常量池:用于存储类的元数据信息,如类名、方法名、字段名等。这些信息在类加载过程中被解析并存储在常量池中,供后续使用。运行时常量池:是方法区的一部分。...例如,对于String常量池,可以通过String类的intern()方法将一个字符串加入到常量池中;对于Integer常量池,缓存范围从Java 5的-128到127扩展到了Java 8及以后版本的-...;String为什么不可变介绍过,本文重点讨论基本类型包装类常量池。...,而不再从缓存池中取Float和Double没有实现常量池技术,原因在于这两种数据类型的数值是很随意的,就算有常量池命中率也不会高,还浪费额外的堆内存。

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

    Java内存区域详解

    也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是 hotspot 中的永久代 。...四 重点补充内容 4.1 String 类和常量池 String 对象的两种创建方式: String str1 = "abcd";//先检查字符串常量池中有没有"abcd",如果字符串常量池中没有,则创建一个...第一种方式是在常量池中拿对象; 第二种方式是直接在堆内存空间创建一个新的对象。 记住一点:只要使用 new 方法,便需要创建新的对象。 String 类型的常量池比较特殊。...它的主要使用方法有两种: 直接使用双引号声明出来的 String 对象会直接存储在常量池中。 如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern() 方法。...Java 在编译的时候会直接将代码封装成 Integer i1=Integer.valueOf(40);,从而使用常量池中的对象。

    45140

    《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)

    相应地,在常量池中,将 int和Float类型的常量分别使用CONSTANT_Integer_info和Constant_float_info表示,他们的结构如下所示: ?...代码中所有用到 int 类型 10 的地方,会使用指向常量池的指针值#8 定位到第#8 个常量池项(cp_info),即值为 10的结构体 CONSTANT_Integer_info,而用到float类型的...String类型的字符串常量在常量池中是怎样表示和存储的?...(PS :使用javap -v 指令能看到易于我们阅读的信息,查看真正的字节码文件可以使用HEXWin、NOTEPAD++、UtraEdit 等工具。)       ...的类,在JDK将其编译成class文件时,常量池中并没有java.util.Date对应的CONSTANT_Class_info常量池项,为什么呢?

    63510

    可能是把Java内存区域讲的最清楚的一篇文章

    记住:只要使用new方法,便需要创建新的对象。 2 String类型的常量池比较特殊。它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中。...如果不是用双引号声明的String对象,可以使用String提供的intern方String.intern() 是一个Native方法,它的作用是:如果运行时常量池中已经包含一个等于此String对象内容的字符串...,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。...两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。...} 应用场景: Integer i1=40;Java在编译的时候会直接将代码封装成Integer i1=Integer.valueOf(40);,从而使用常量池中的对象。

    20720

    可能是把Java内存区域讲的最清楚的一篇文章

    记住:只要使用new方法,便需要创建新的对象。 2 String类型的常量池比较特殊。它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中。...如果不是用双引号声明的String对象,可以使用String提供的intern方String.intern() 是一个Native方法,它的作用是:如果运行时常量池中已经包含一个等于此String对象内容的字符串...,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。...两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。...} 应用场景: Integer i1=40;Java在编译的时候会直接将代码封装成Integer i1=Integer.valueOf(40);,从而使用常量池中的对象。

    21320

    jvm之.class文件解读(上)

    常量池中的每一项都具备相同的特征。第1个字节作为类型标记,用于确定该项的格式,这个字节称为tag byte(标记字节、标签字节)。...比如: CONSTANT_Integer_info是用来描述常量池中字面量信息的,而且只是整型字面量信息。...结构用于表示示 String 类型的常量对象 CONSTANT_Integer_info 和 CONSTANT_Float_info 表示 4 字节(int 和 float)的数值常量 CONSTANT_Long_info...在常量池列表中,CONSTANT_Utf8_info 常量项是一种使用改进过的 UTF-8 编码格式来存储诸如文字字符串、类或者接口的全限定名、字段或者方法的简单名称以及描述符等常量字符串信息。...常量池中为什么要包含这些内容?Java 代码在进行 Javac 编译的时候,并不像 C 和 C++那样有“连接”这一步骤,而是在虚拟机加载 C1ass 文件的时候进行动态链接。

    27920

    《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)

    相应地,在常量池中,将 int和Float类型的常量分别使用CONSTANT_Integer_info和 Constant_float_info表示,他们的结构如下所示: ?...代码中所有用到 int 类型 10 的地方,会使用指向常量池的指针值#8 定位到第#8 个常量池项(cp_info),即值为 10的结构体 CONSTANT_Integer_info,而用到float...String类型的字符串常量在常量池中是怎样表示和存储的?...(PS :使用javap -v 指令能看到易于我们阅读的信息,查看真正的字节码文件可以使用HEXWin、NOTEPAD++、UtraEdit 等工具。)       ...的类,在JDK将其编译成class文件时,常量池中并没有java.util.Date对应的CONSTANT_Class_info常量池项,为什么呢?

    59720

    Java内存区域总结

    记住:只要使用new方法,便需要创建新的对象。 2 String类型的常量池比较特殊。它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中。...如果不是用双引号声明的String对象,可以使用String提供的intern方String.intern() 是一个Native方法,它的作用是:如果运行时常量池中已经包含一个等于此String对象内容的字符串...,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。...两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。...} 应用场景: Integer i1=40;Java在编译的时候会直接将代码封装成Integer i1=Integer.valueOf(40);,从而使用常量池中的对象。

    43150

    Java基础八股文第一弹

    String 为什么不可变?...因为String的hash值经常会使用到,比如作为 Map 的键,不可变的特性使得 hash 值也不会变,不需要重新计算。 字符串常量池优化。...String对象创建之后,会缓存到字符串常量池中,下次需要创建同样的对象时,可以直接返回缓存的引用。 String, StringBuffer 和 StringBuilder区别 1....new String("dabin")会创建几个对象? 使用这种方式会创建两个字符串对象(前提是字符串常量池中没有 "dabin" 这个字符串对象)。..."dabin" 属于字符串字面量,因此编译时期会在字符串常量池中创建一个字符串对象,指向这个 "dabin" 字符串字面量; 使用 new 的方式会在堆中创建一个字符串对象。 什么是字符串常量池?

    98710

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

    介绍 为什么要有常量池? 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。 例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。...(1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。 (2)节省运行时间:比较字符串时,== 比equals()快。...包装类型为Byte,Short,Integer,Long 浮点类型:float、double。包装类型为Float,Double 字符类型:char。...包装类型为Boolean 8种包装类型中除了Float,Double没有实现常量池,剩下的都实现了 为了更方便理解后面的内容,这里先解释一下自动装箱和拆箱 自动装箱和拆箱 自动装箱就是Java自动将原始类型值转换成对应的对象...其中常量池中存的是引用,引用一下R大在知乎上的解释 如果您说的确实是runtime constant pool(而不是interned string pool / StringTable之类的其他东西)

    88730

    Java知识面试题复习(四)Java常用API

    字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在...常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。...final:使用 final 来定义 String 类,表示 String 类不能被继承,提高了系统的安全性。 String为什么是不可变的吗?...String为什么是不可变的 可变性 String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。...Short,Integer,Long,Float,Double Integer a= 127 与 Integer b = 127相等吗 对于对象引用类型:==比较的是对象的内存地址。

    58350

    Java面试题及答案2019版(上)

    用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在常量池中,常量池是方法区的一部分,。...String.intern()是一个Native方法,它的作用是:如果字符串常量池中已经包含了一个等于此String对象的字符串,则返回代表池(运行时常量池)中这个字符串的String对象;否则,将此String...对象包含的字符串添加到常量池中并且返回此String对象的引用。...现在的疑问是“java”这个字符串在常量池中什么时候存在了? 我最开始的猜想是“java”这个字符串是不是常驻在常量池中的?那为什么常驻在常量池中呢?...对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用

    51630

    深入解析==与equals()区别

    (2).引用数据类型:比较的是两者的地址是否相同,比如Integer等。String是一个特殊的,后面再讨论。...因为使用Integer类,每次都创建了新的对象,所以分配的地址是不同的。但Integer类与int作比较结果如何呢?...为什么呢?因为包装类重写了Object类的equals()方法。...从上图可以看出: 当String a = “Hello”;创建一个引用类型a,指向堆区一个位置,用于保存字符串对象; 当String b = “Hello”;java会到它的常量池中找"hello"是不是在常量池中已存在...如果已经存在则返回这个常量池中的"hello"的地址(在java中叫引用)给变量b; String c= new String(“hello world”); 会在堆区再次存放一个字符串对象; String

    34811

    Java对象的创建过程

    记住:只要使用 new 方法,便需要创建新的对象。 2 String 类型的常量池比较特殊。它的主要使用方法有两种: 直接使用双引号声明出来的 String 对象会直接存储在常量池中。...String.intern() 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此...String 内容相同的字符串,并返回常量池中创建的字符串的引用。...String s2 = s1.intern(); 8种基本类型的包装类和常量池 Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte、Short、Integer、Long、Character...两种浮点数类型的包装类 Float、Double 并没有实现常量池技术。

    90600

    java面试题 --- 基础

    String 用 final 修饰了,是不可变的,重新赋值会指向新的对象,因为 final 修饰,所以线程安全; JVM 中有个字符串常量池,jdk1.7 之前这个常量池在方法区,也就是永久代,jdk1.7...及之后字符串常量池在堆内存中; new 一个 String 对象的时候,会在堆内存中生成对象,同时把这个对象放到字符串常量池中; 直接赋值 String 的时候,首先会看字符串常量池中有没有,有就直接拿来用...,没有就先往常量池放一份再拿来用; 用加号拼接字符串,如果是两个常量拼接,编译期就直接拼接好,然后放到常量池中,如果有变量拼接,那就会调用 StringBuilder 的 append 方法在堆中生成新对象...,但是这个并不会放到常量池中; 它有个 intern 方法,jdk1.7 以前,会把该方法的调用者放到常量池中,jdk1.7 及之后,会把调用者的引用放到常量池中。...finally,配合 try catch 使用,try 中写要捕获异常的代码, catch 中写捕获到异常后的操作,finally 中写一定要执行的代码,比如关闭资源、释放连接等。

    30520

    2024年 Java 面试八股文 5万字(持续更新ing)

    Integer.valueOf()的其他重载版本:如接受long、float、double等类型的参数,但它们不会使用缓存池。...而使用Integer.valueOf(123)创建的两个对象int3和int4相等,因为它们引用了缓存池中的同一个实例。...length() 方法:返回字符串的长度。intern() 方法:将字符串对象与字符串常量池中的对象进行比较,如果常量池中已存在该字符串,则返回常量池中的对象引用。...如果常量池中已经包含了该字符串,则返回常量池中的字符串对象的引用;如果没有,则将该字符串对象添加到常量池中,并返回这个新字符串对象的引用。...s2通过new String()创建,不会自动存储在常量池中。s3通过调用s2.intern()后,引用了常量池中的字符串对象。

    1.9K11
    领券