Java整数池。为什么?
它被称为Flyweight模式,用于最小化内存使用。
这些数字很可能会被重复使用,并且类似autoBox的类型Integer是不可变的(请注意,这样做不仅是针对Integer)。缓存它们可以使实例不多,并且也减少了GC(垃圾收集)的工作。
JLS在5.1.7中对此进行了介绍。装箱转换专门通过说:
如果装箱的值p为true,false,字节或 u0000到u007f范围内的char或-128到127(含)之间的整数或短数,则令r1和r2为p的任何两次拳击转换。r1 == r2总是这样。
理想情况下,将给定的原始值p装箱将始终产生相同的参考。实际上,使用现有的实现技术可能不可行。以上规则是务实的妥协。上面的最后一句要求始终将某些通用值装在无法区分的对象中。该实现可以懒惰地或急切地缓存它们。对于其他值,此公式不允许对程序员方面的带框值的身份进行任何假设。这将允许(但不要求)共享部分或全部这些引用。
这样可以确保在最常见的情况下,行为将是理想的,而不会造成不必要的性能损失,尤其是在小型设备上。例如,较少内存限制的实现可能会缓存所有char和short值,以及-32K到+32K范围内的int和long值。
解决方法我到处都读到过,当您在Java中定义介于-128到127之间的Integer时,它不会创建新对象,而是返回已经创建的对象。
除了让新手程序员比较Integer对象==以查看它们是否具有相同的数字外,我看不到这样做的任何意义,但是我认为这很糟糕,因为确保他们认为可以将任何Integer对象与进行比较==,并且还在教学在任何编程语言中都不好的做法:将两个“不同”对象的内容与进行比较==。
这样做有其他原因吗?还是在设计语言(以我的观点)(如JavaScript中的可选分号)时只是一个错误的决定?
编辑:我在这里看到他们解释行为:为什么Integer常量池的行为在127发生变化?
我在问为什么他们设计它具有这种行为,而不是为什么会发生这种行为。
相关文章:
1. 求大神帮我看看是哪里写错了 感谢细心解答2. 为什么css中设置margin:0 auto; 水平居中无效?3. 为什么一个类里面只能有一个私有的 我不知道按了什么谁给解释一下4. python - nginx为什么不能反代图片?5. c++ - win764位环境下,我用GCC为什么指针占8个字节,而long是4个字节?6. thinkjs - 使用mysql搭建cms应该如何设计表?或怎样开始?7. mysql 获取时间函数unix_timestamp 问题?8. javascript - 小demo:请教怎么做出类似于水滴不断扩张的效果?9. css - width设置为100%之后列表无法居中10. macos - mac用VMware Fusion安装了centos7,我怎么把centos映射到本地,就像windows映射一个网络位置
