integer常用方法(Integer与int到底相不相等)
hi,各位,好久不见,我是吹毛。
各位都知道java中int和integer的区别吗?
什么?没区别?
其实,在我探知的领域范围内,我发现了一个最大的区别!
对,长度也不同,你们真棒。。。
虽然这是个玩笑,不过你们也应该发现了点问题,int和其他n种类型并称为基础类型,而Integer其实更像我们自己写的一个类,对,他其实就是在int的基础上做的一个功能扩展类,此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。
恩,好像很有用的样子。
问个问题
Integer与int对比
没错,相等。128和128肯定相等啊。
那这个呢?
Integer与Integer对比
没错,不相等。
恩,好对哦。
再看这个呢?
Integer与Integer对比
没错,相等。
相信有一定基础的人都知道其中的简单奥妙,我也相信你们知道最直接的原因,常量池嘛,范围嘛。但,,然后呢?
我先简单的解释一下,出现这种现象原因:
1.首先是“==”号,他代表的是查看双方的地址是否相同而不是值。
2.Integer有个常量池,在-128到127之间的数在最开始的时候都已经生成好放到了常量池中,当你想用的时候直接用就行了。
3.超过这个范围,常量池就没有了,所以需要新建一个,因为是新建的,所以值就不同了。
清晰明了,是不是觉得会了?明白了?
你明白什么了?这都是我告诉你的或者你自己知道的,为什么会这样你了解过吗?
知道直接赋值127与 new Integer 127 有什么区别吗?
这个结果是什么呢?
这其中经过了哪些故事呢?
来,让我带你们看看里面究竟发生了什么。
首先,我先告诉你们结果,上面的结果是false,因为地址不一样,那地址为什么不一样了呢?
我先把上面的代码用工具进行反编译,给你们看一下。
反编译后的代码
反编译以后,我们发现,在机器处理上面的代码的时候,他自己做了一个操作,就是将我们的赋值变成了valueOf方法,那valueOf方法里又描述的什么呢?接着看。
Integer.valueOf源码
可以看到这里有个简单的if判断,如果你输入的不在-127到128之间,他直接给你new了一个Integer,如果在范围内,他就使用InterCache数组里的对应的值给你,InterCache就是我说的最开始初始化的常量池,具体代码如下,最重要的就一句话。
就是初始化了-127到128数组
因为在-127到128之间,大家都用的一个数组里的值,所以地址肯定是相同的,值也是相同的,故:
Integer a = 127; Integer b = 127; System.out.println(a == b);
的结果为true。
Integer a = 128; Integer b = 128; System.out.println(a == b);
如果超过范围,那就直接new了一个新的Integer,因为大家各自new各自的,所以是两个不同的对象,故而地址肯定不同,所以返回false。
int a = 128; Integer b = 128; System.out.println(a == b);
int和Integer在对比的时候发生了什么呢?
在对比的时候,因为两种类型不同,所以Integer自动拆箱成了int。自动拆箱简单点讲就是在需要的时候转化成基础类型。所以这个就相当于两个基础类型的对比。
int对比int
没错,答案就是true。Integer是个扩展工具类咱们说的什么常量池都是它的,这里咱们比的是最基础的基础类型,和刚才的没半毛钱关系,所以基础类型永远比对的都是值,所以他们永远相等!!别记混了噢!
int和Integer能扩展的大概就这么多,欢迎补充!
最后再来一个小扩展题。
Integer和Long比对
这个的结果是什么呢?欢迎大家留言,并解释原理哦!
对,我是一个吹毛求疵的人,我喜欢用生动的语言和一颗执着的心探究程序的世界!
赶快关注“吹毛”的头条号哦,不要错过精彩!
最后感谢大家,手动比心。
么么哒
爱你们
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com