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