Integer源码及知识点扩展

一直把所学的东西记录在自己的笔记上,觉得也应该把一些知识分享出来,个人觉得在学习一个知识点不应该只局限在当前,而应该扩展出此知识点的其他内容以及带着疑问自己去研究,加深对知识的理解。

今天就先来分享一下Integer。

Integer很多人都很熟悉,就不做多基本介绍,直接聊Integer中的重点跟扩展。

本文要讲的重点是Integer缓存,其他构造函数以及方法跟一下源码很快就能懂得。

Integer源码及知识点扩展Integer源码及知识点扩展;

看到这个代码跟执行结果,小白会觉得:这是什么鬼。有经验的:这不就是Integer的缓存机制吗。是的,就是缓存机制。

无论是小白还是了解Integer缓存机制但是模糊的希望可以看下去。下面看源码:

Integer源码及知识点扩展

Integer源码及知识点扩展

源码一目了然,Integer缓存了-128到127的值,如果定义的Integer在这个范围内,它就会到缓存里取,否则就new Integer(i)重新创建对象了。所以会看到我们上面true跟false。在创建新的 Integer 对象之前会先在 IntegerCache.cache 中查找。有一个专门的 Java 类来负责 Integer 的缓存。IntegerCache 是 Integer 类中一个私有的静态类。

总结:

1.在创建Integer对象,尽量少用new创建,尽量使用valueOf。

2.在判断对象是否相等的时候尽量使用equals方法,避免使用“==”产生非预期结果。

3.建议亲自去跟一遍源码是最好的。

扩展:

一般面试或者整理一个知识点时总会扯到其它点、我们就比如面试,面试官问说说Integer,也许你能说出上面那些,但是,当面试官想继续深入问或者自己想装下逼,那就需要答出涉及这个点的其他东西了,体现出你对知识的深度。

1、Integer采用的是享元模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。其实本质就是缓存。像String常量池,数据库连接池,线程池,这类把共享的东西缓存一起以免频繁创建,就是采用了享元模式。

2、Byte,Short,Long 也有固定范围: -128 到 127。对于 Character, 范围是 0 到 127。除了 Integer 可以通过参数改变范围外,其它的都不行。Integer最大值 127 可以通过 JVM 的启动参数 -XX:AutoBoxCacheMax=size 修改。需要改的根据程序而定,是否频繁使用到哪些值。Float ,Doulbe 没有缓存。

3、为什么是-128到127呢,因为这个范围的整数值是最常用的。在第一次使用 Integer 的时候也需要时间来初始化这个缓存。

后面会陆续在这里分享一些常见知识点。初衷是分享。