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

在常量池中看不到整数值

是因为整数值在Java中有一个范围,超出这个范围的整数值会被认为是一个新的对象,而不是常量池中的值。常量池是Java中用于存储常量的一块内存区域,它包含了各种类型的常量,如字符串、整数、浮点数等。

整数值在常量池中的表示方式有两种:一种是使用字面量的方式表示,例如int a = 10;中的10就是一个字面量,它会被存储在常量池中;另一种是使用Integer类的valueOf()方法将整数值包装成Integer对象,例如Integer b = Integer.valueOf(20);中的20会被包装成一个Integer对象,这个对象会被存储在常量池中。

然而,当整数值超出了Java中整数类型的范围时,就无法使用字面量或valueOf()方法来表示,因为Java中的整数类型有一个最大值和最小值。超出这个范围的整数值会被认为是一个新的对象,而不是常量池中的值。

在这种情况下,可以使用BigInteger类来表示超出范围的整数值。BigInteger类是Java中用于表示任意大小整数的类,它可以处理超出整数类型范围的整数值。使用BigInteger类可以在常量池中看到整数值,因为它将整数值作为对象来处理,而不是作为字面量或基本类型来处理。

总结起来,常量池中看不到整数值是因为整数值超出了Java中整数类型的范围,可以使用BigInteger类来表示超出范围的整数值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Java SE】认识String类

为了节省存储空间以及程序的运行效率,Java中引入了: Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息 运行时常量池:.Class文件被加载时...,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常 量池每个类都有一份 字符串常量池 1.9.2字符串常量池(StringTable) 字符串常量JVM中是StringTable...3. intern方法 intern 是一个native方法(Native方法指:底层使用C++实现的,看不到其实现的源代码),该方法的作用是手动将创建的String对象添加到常量池中。...//s1.intern(); // s1.intern();调用之后,会将s1对象的引用放入到常量池中 String s2 = "abc"; // "abc" 常量池中存在了,s2创建时直接用常量池中...,然后str共享常量池中的String对象 String str = new String(“hello”)会开辟两块堆内存空间,字符串"hello"保存在字符串常量池中,然后用常量池中的String对象给新开辟

29010
  • String 类和常量

    System.out.println(str1==str2); // false System.out.println(str2==str3); // false 第一种方式,是常量池中拿对象...String-Pool-Java String 类型的常量池比较特殊,它的主要使用方法有两种: 直接使用双引号声明出来的 String 对象,会直接存储常量池中 如果不是用双引号声明的 String...String.intern() 是一个 Native 方法,它的作用是:如果运行常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此...+ str2; // 堆上创建的新的对象 String str5 = "string"; // 常量池中的对象 System.out.println(str3 == str4...如果池中已存在“abc”,则池中只会创建一个字符串“s1”。如果池中没有字符串文字“abc”,那么它将首先在池中创建,然后堆空间中创建,因此将创建总共 2 个字符串对象。

    54020

    Java八种包装类、常量

    当使用字面量方式创建字符串时,JVM会首先检查字符串常量池中是否已存在该字符串。如果存在,则返回该字符串的引用;否则,字符串常量池中创建一个新的字符串并返回引用。...类元数据常量池:用于存储类的元数据信息,如类名、方法名、字段名等。这些信息类加载过程中被解析并存储常量池中,供后续使用。运行时常量池:是方法区的一部分。...,而不再从缓存池中取Float和Double没有实现常量池技术,原因在于这两种数据类型的数值是很随意的,就算有常量池命中率也不会高,还浪费额外的堆内存。...先从常量池中查找是否已经存在该值的Integer对象,如果存在则直接返回常量池中的对象;不存在 就创建一个新的Integer对象并存储常量池中(当范围在-128~127之间时,多次调用会取得同一个对象的引用...先从常量池中查找是否已经存在该值的Integer对象,如果存在则直接返回常量池中的对象;不存在 就创建一个新的Integer对象并存储常量池中(当范围在-128~127之间时,多次调用会取得同一个对象的引用

    17810

    【漫画】腾讯面试,我竟然输给了final关键字

    早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。最近的 Java 版本中,不需要使用 final 方法进行这些优化了。...d + 2; System.out.println((a == c)); System.out.println((a == e)); } } 变量a指的是字符串常量池中的...2得到的,由于 b 是一个常量,所以使用 b 的时候直接相当于使用 b 的原始值(xiaomeng)来进行计算,所以 c 生成的也是一个常量,a 是常量,c 也是常量,都是 xiaomeng2 而...Java 中常量池中只生成唯一的一个 xiaomeng2 字符串,所以 a 和 c 是相等的!...d 是指向常量池中 xiaomeng,但由于 d 不是 final 修饰,也就是说使用 d 的时候不会提前知道 d 的值是什么,所以计算 e 的时候就不一样了,e的话由于使用的是 d 的引用计算,变量

    56720

    彻底弄懂字符串常量池等相关问题

    中,intern的处理是 先判断字符串常量是否字符串常量池中,如果存在直接返回该常量,如果没有找到,则将该字符串常量加入到字符串常量区,也就是字符串常量区建立该常量1.7中:       ...1.7中,intern的处理是 先判断字符串常量是否字符串常量池中,如果存在直接返回该常量,如果没有找到,则在堆中建立该字符串常量,然后把堆区该对象的引用加入到字符串常量池中,以后别人拿到的是该字符串常量的引用...,【假如不存在的话jdk1.6中会在常量池中建立该常量jdk1.7以后会在堆中建立该字符串,然后把他的引用放在常量池中】 String str2 = "1";   解析:此时"1"已经存在在常量池中..."22",所以此时jdk1.6中会在字符串常量池中创建"22",而在jdk1.7中会在堆中创建该字符串,然后将其引用添加到常量池中; String str4 = "22";   解析:此时的...,比较的是数值等不等能。

    67020

    Java 基础面试题精选(一)

    负数补码转原码的公式: 负数原码=(补码-1)&&数值位取反 我们按照公式,会发现其原码为:补码(1000 0001)–> 反码(1000 0000)–> 原码(1111 1111)。...如果常量池中原来没有 xxx,就是两个。如果有就是一个。 String 是不可变类,Java 会分配一块常量池。通过以下代码解释下常量池的使用。...,于是存储到常量池中,执行到 str2 的赋值语句时,发现已经有相同的常量了,于是 str2 也指向了 str1 刚才那块内存空间。...newStr1 和 newStr2 是通过 new 语法创建的对象,创建的过程中,Java 会先去常量池中查找是否已有 蜗牛666 对象,如果没有则在常量池中创建一个 蜗牛666 对象,然后堆中创建一个...使用方只能看到接口信息,而看不到接口实现。 通过访问权限控制的方式,实现信息隐藏。 通过 getter 和 setter 方法,实现了对类成员有条件的读取和修改。 9、谈谈你对双亲委派模式的理解?

    26110

    聊一聊让我蒙蔽一晚上的各种常量

    一个堆中,一个字符串常量池中。 那么下面这段代码又是创建了几个对象呢?...JDK1.6的时候,调用了这个方法之后,虚拟机会在字符串常量查找是否有内容与”tt”相等的对象,如果有,则返回这个对象,如果没有,则会在字符串常量池中添加这个对象。...这句执行后会在字符串常量池查找内容为”t”的对象,字符串常量池已经有这个对象了,返回给t2,此时t2指向的是常量池中的对象。 一个是常量池中的对象,一个是堆中的对象,两者能相等吗?...这句代码执行后,会返回字符串常量池中内容为”22”对象,此时t4指向的是字符串常量池中的对象。...需要注意的是,Float和Double这两个类并没有对应的常量池。 (2).上面5种整型的包装类也只是在对象数值-128~127才可以使用这些常量池。 (3).

    38840

    JVM解读-方法区

    ,后2个存储主版本号,再接着是用于存放常量常量池,由于常量的数量是不固定的,所以常量池的入口放置一个U2类型的数据(constant_pool_count)存储常量池容量计数值。...,这部分内容将在类加载后进入方法区的运行时常量池中存放。.../false String str5 = "string"; System.out.println(str3 == str5);//true 解释: (1)new String("abcd")是常量池中拿对象...xyz”类加载时就已经创建并驻留了(如果该类被加载之前已经有”xyz”字符串被驻留过则不需要重复创建用于驻留的”xyz”实例)。驻留的字符串是放在全局共享的字符串常量池中的。...true 解释: String的intern()方法会查找常量池中是否存在一份equal相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池。

    89940

    Java常量池理解与总结

    ,后2个存储主版本号,再接着是用于存放常量常量池,由于常量的数量是不固定的,所以常量池的入口放置一个U2类型的数据(constant_pool_count)存储常量池容量计数值。...System.out.println(str1==str2);//false 这两种不同的创建方法是有差别的,第一种方式是常量池中拿对象,第二种方式是直接在堆内存空间创建一个新的对象。...xyz"类加载时就已经创建并驻留了(如果该类被加载之前已经有"xyz"字符串被驻留过则不需要重复创建用于驻留的"xyz"实例)。驻留的字符串是放在全局共享的字符串常量池中的。...String的intern()方法会查找常量池中是否存在一份equal相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池。...同包不同类下,引用自同一String对象. 不同包不同类下,依然引用自同一String对象. 在编译成.class时能够识别为同一字符串的,自动优化成常量,引用自同一String对象.

    60421

    JVM垃圾回收区域,垃圾回收算法概述

    发生堆和方法区 主要发生在堆中,堆区由所有线程共享,虚拟机启动时创建。堆区主要用于存放对象实例及数组,所有new出来的对象都存储该区域。...以常量池中字面量的回收为例,若字符串“abc”已经进入常量池中,但当前系统没有任何String对象引用常量池中的“abc”常量,也没有其他地方引用该字面量,若发生内存回收,且必要的话,该“abc”就会被系统清理出常量池...常量池中其他的类(接口)、方法、字段的符号引用与此类似。...并将其年龄设为1,对象Survivor每熬过一次Minor GC,年龄就加1,当年龄达到一定的程度(默认为15)时,就会被晋升到老年代 中了,当然晋升老年代的年龄是可以设置的。...标记清除压缩 标记清除,标记压缩结合使用,先多次进行标记清除,产生许多内存碎片,然后对碎片清理(多次FULL GC之后再压缩),相对标记压缩减少了压缩次数减少了许多移动成本 GC算法(引用计数/复制/标清/标

    67930

    类索引和父类索引

    类索引和父类索引各自指向常量池中类型为CONSTANT_Class_info的类描述符,再通过类描述符中的索引值找到常量池中类型为CONSTANT_Utf8_info的字符串。...字段的简单名称索引是0x0005,去常量池中找索引为5的字符串,为“number”。字段的描述符索引为0x0006,去常量池中找索引为6的字符串,为“I”,是基本类型int。...名称索引为0x0007,常量池中为索引为7的字符串为“”,这就是编译器自动添加的无参构造方法。...描述符索引为0x0008,常量池中为索引为7的字符串为“()V”,方法的属性计数值为0x0001,表示该方法有1个属性,属性名称索引为0x0009,常量池中为索引为7的字符串为“Code”。...我总结了一些比较常见的属性,如下表: 对于每个属性,它的名称都从常量池中引用一个CONSTANT_Utf8_info类型的常量,而属性值的结构则是完全自定义的,只需要用一个u4类型来说明属性值所占的位数就可以了

    80800

    Class文件结构全面解析(下)

    类索引和父类索引各自指向常量池中类型为CONSTANT_Class_info的类描述符,再通过类描述符中的索引值找到常量池中类型为CONSTANT_Utf8_info的字符串。...字段的简单名称索引是0x0005,去常量池中找索引为5的字符串,为“number”。字段的描述符索引为0x0006,去常量池中找索引为6的字符串,为“I”,是基本类型int。...以下是常量池相关内容: #5 = Utf8 number #6 = Utf8 I 字段number的属性计数值为0x0000,也就是没有需要额外描述的信息...名称索引为0x0007,常量池中为索引为7的字符串为“”,这就是编译器自动添加的无参构造方法。...描述符索引为0x0008,常量池中为索引为7的字符串为“()V”,方法的属性计数值为0x0001,表示该方法有1个属性,属性名称索引为0x0009,常量池中为索引为7的字符串为“Code”。

    26420

    JVM面试考点—— 值==问题(常量池)

    这5种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。 两种浮点数类型的包装类Float,Double并没有实现常量池技术。.../false String str5 = "string"; System.out.println(str3 == str5);//true 解释: (1)new String("abcd")是常量池中拿对象...xyz”类加载时就已经创建并驻留了(如果该类被加载之前已经有”xyz”字符串被驻留过则不需要重复创建用于驻留的”xyz”实例)。驻留的字符串是放在全局共享的字符串常量池中的。...true 解释: String的intern()方法会查找常量池中是否存在一份equal相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池。...同包不同类下,引用自同一String对象. 不同包不同类下,依然引用自同一String对象. 在编译成.class时能够识别为同一字符串的,自动优化成常量,引用自同一String对象.

    41640

    jvm之.class文件解读(上)

    常量池中常量的数量是不固定的,所以常量池的入口需要放置一项 u2 类型的无符号数,代表常量池容量计数值(constant_pool_count)。...常量池容量计数值(u2 类型):从 1 开始,表示常量池中有多少项常量。即 constant_pool_count=1 表示常量池中有 0 个常量项。 其值为0x0016,掐指一算,也就是22。...结构表示 8 字作(long 和 double)的数值常量 class 文件的常最池表中,所行的 a 字节常借均占两个表成员(项)的空问。...如果一个 CONSTAHT_Long_info 和 CNSTAHT_Double_info 结构常量池中的索引位 n,则常量池中一个可用的索引位 n+2,此时常量池长中索引为 n+1 的项仍然有效但必须视为不可用的...常量池中为什么要包含这些内容?Java 代码进行 Javac 编译的时候,并不像 C 和 C++那样有“连接”这一步骤,而是虚拟机加载 C1ass 文件的时候进行动态链接。

    24820

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

    介绍 为什么要有常量池? 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。 例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。...(1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。 (2)节省运行时间:比较字符串时,== 比equals()快。...return new Integer(i); } IntegerCache是Ingeter的静态内部类,默认创建了[-128,127]的对象,并放到IntegerCache内部的一个cache数组中,[...然后Integer对象无法与数值进行直接比较,所以i4自动拆箱转为int值40,最终这条语句转为40 == 40进行数值比较 String类和常量池 字符串常量池放在哪?...其中常量池中存的是引用,引用一下R大知乎上的解释 如果您说的确实是runtime constant pool(而不是interned string pool / StringTable之类的其他东西)

    87230

    JVM运行时数据区域

    (str1==str2);//false 这两种不同的创建方法是有差别的: 第一种方式是常量池中获取对象("abcd" 属于字符串字面量,因此编译时期会在常量池中创建一个字符串对象), 第二种方式一共会创建两个字符串对象...String类型的常量池比较特殊。它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储常量池中。...String.intern() 是一个 Native 方法,它的作用是: 如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用; 如果没有,则在常量池中创建与此...str2 = "ing"; String str3 = "str" + "ing";//常量池中的对象 String str4 = str1 + str2; //TODO:堆上创建的新的对象...两种浮点数类型的包装类Float,Double 并没有实现常量池技术。 valueOf() 方法的实现比较简单,就是先判断值是否缓存池中,如果在的话就直接返回缓存池的内容。

    39740

    触摸Java常量

    s1 == s2这个非常好理解,s1、s2赋值时,均使用的字符串字面量,说白话点,就是直接把字符串写死,在编译期间,这种字面量会直接放入class文件的常量池中,从而实现复用,载入运行时常量池后,s1...,s7、s8拼接成的新字符串,堆中地址不确定,不可能与方法区常量池中的s1地址相同。...s1 == s6这两个相等完全归功于intern方法,s5堆中,内容为Hello ,intern方法会尝试将Hello字符串添加到常量池中,并返回其常量池中的地址,因为常量池中已经有了Hello字符串...以上所讲仅涉及字符串常量池,实际上还有整型常量池、浮点型常量池等等,但都大同小异,只不过数值类型的常量池不可以手动添加常量,程序启动时常量池中常量就已经确定了,比如整型常量池中常量范围:-128~127...接下来就是常量池入口,入口处用2个字节标识常量常量数量,本例中数值为00 1A,翻译成十进制是26,也就是有25个常量,其中第0个常量是特殊值,所以只有25个常量

    1.1K10

    java面试题 --- 基础

    String 用 final 修饰了,是不可变的,重新赋值会指向新的对象,因为 final 修饰,所以线程安全; JVM 中有个字符串常量池,jdk1.7 之前这个常量方法区,也就是永久代,jdk1.7...及之后字符串常量堆内存中; new 一个 String 对象的时候,会在堆内存中生成对象,同时把这个对象放到字符串常量池中; 直接赋值 String 的时候,首先会看字符串常量池中有没有,有就直接拿来用...,没有就先往常量池放一份再拿来用; 用加号拼接字符串,如果是两个常量拼接,编译期就直接拼接好,然后放到常量池中,如果有变量拼接,那就会调用 StringBuilder 的 append 方法堆中生成新对象...,但是这个并不会放到常量池中; 它有个 intern 方法,jdk1.7 以前,会把该方法的调用者放到常量池中,jdk1.7 及之后,会把调用者的引用放到常量池中。...12 和 -11,四舍五入是操作数加上 0.5 然后向下取。 11. float f = 3.4、short s = 1, s = s + 1、s += 1 是否正确?

    30420

    字节码文件的内部结构之谜

    不同类型的文件有着不同的魔数值,图片格式有图片格式的的魔数值,视频格式有视频格式的魔数值,而我们 Class 文件的魔数值为:0xCAFEBABE 。...name_index 占两个字节,它存储的是当前字段的名称常量池中的偏移量值。...descriptor_index 占两个字节,它是对当前字段基本数据类型的描述,存储的也是一个字符常量常量池中的偏移值。...name_index 的值对应于字段名称常量池中的偏移值。 [image] descriptor_index 的值为:0x000A ,对应的常量值是:Ljava/lang/String 。...然后,0x0001 指明了该方法的访问标志:public,0x000B 指明了该方法名称常量池中的偏移值,对应到常量池中常量: 。

    1.4K90

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券