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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java常量池中存放啥,8种基本类型和String,还有其他的吗?相关的知识,希望对你有一定的参考价值。

常量池中Integer应该没有吧? 下面程序的解释对吗?

package test;
import java.util.Scanner;
import ptolemy.plot.*;
public class proj2_3rd

public static void main(String[] args)

Integer a=127; //常量池本来就有127,故引用常量池
Integer b=127; //引用常量池

//String c=new String("5555"); //在常量池中创建,拷贝到堆中,c是堆中字符串的引用
String c="5555"; //在常量池创建并引用常量池
String d="5555"; //常量池直接应用

Integer e=666; //Integer不属于基本类型;所以这句相当于 Integer e=new Integer(); 下同,都是指向堆的
Integer f=666; //
Integer g=666; //

System.out.println((a==b)+" "+(c==d)+" "+(e==f)+" "+(f==g));




输出:
true true false false

常量池是介于栈和堆外的另一种独立的内存管理空间,相同内容常量池中永远只有一份,基本数据类型、对象的引用都存在栈中,执行速度快,包装类型,对象存储,new出来的对象都是存储在堆中,Byte,Short,Integer,Long,Character这5种整型的包装类只是在对应值小于等于127时才可使用对象池。超过了就会自动申请空间创建对象,所有才会出现上述情况,而String是个较为特殊的包装类型,直接用=“”创建的数据是存放在常量池,且无论数据大小都不会申请空间创建,除非使用new关键字。 参考技术A 因为常量池里,只存一个字节的常量。 一个字节有8位,前面一位是正负符号,剩下7位。所以正数最大的值是2^7-1 =127。 所以超过127的都不是在常量池里的了。 int来说,-128 到127都是在常量池的。追问

谢谢,但是String常量也可以在常量池中的吧,应该说大于一个字节的 Integer 不会被放到常量池,但是String总不可能被限制在一个字节吧。所以 “因为常量池里,只存一个字节的常量。” 表述有误吧?

追答

具体你百度一下 java 常量池,里面有详解呢

参考技术B 你是在疑问为什么最后三个不相等是吧?整型在常量池中应该是有数值限制,127在范围内,而666在范围外,所以127可以在常量池内创建,而666则是在堆内创建新对象 参考技术C 针对上例,对象本身一定在堆中,对象引用一定在栈中,对象中的数据在常量池中。 参考技术D 内存里只有小于127的integer,大于这个数的是要新创建的追问

嗯,谢谢。是不是当大于127的时候 Integer 对象的创建就无关常量池了?
还有只要加载过的类的对象,都会在常量池中有一份拷贝吗?(好像Integer就是反例,但String好像是正例...)

以上是关于java常量池中存放啥,8种基本类型和String,还有其他的吗?的主要内容,如果未能解决你的问题,请参考以下文章

string 是啥类型的?

String对象内存分析

关于intern的一切

String的Intern方法详解

Jackson2.x中内存泄露的风险点—封装的intern逻辑

java---堆栈常量池的存储数据