首页 技术 正文
技术 2022年11月18日
0 收藏 607 点赞 3,531 浏览 3132 个字

简述:int与Integer的区别:

对于它们,我们可能只是知道简单的区别。Integer是int的一个封装类,int的初始值为0,而Integer的初始值为null。但是他们之间真的仅仅只有这些区别吗?我觉得答案是否定的,于是我决定深入到jdk源码中一探究竟。看看Integer与int到底有什么区别。

执行代码:

 public class IntegerTest {     public static void main(String[] args) {         // TODO Auto-generated method stub         int intNum = 127;         Integer integerNum = 127;         Integer integerNewNum = new Integer(127);         //比较两个int变量         int intNum1 = 127;         System.out.print("int与int:");         System.out.println(intNum==intNum1);         //比较int与Integer区别         System.out.print("int与Integer:");         System.out.println(intNum==integerNum);         //比较int与Integer区别         System.out.print("int与NewInteger:");         System.out.println(intNum==integerNewNum);         //比较Integer与NewInteger         System.out.print("Integer与NewInteger:");         System.out.println(integerNum==integerNewNum);         //比较两个NewInteger         Integer integerNewNum1 = new Integer(127);         System.out.print("NewInteger与NewInteger:");         System.out.println(integerNewNum==integerNewNum1);         //比较两个小于128的声明变量         Integer integerNum1 = 127;         System.out.print("小于128的Integer与Integer:");         System.out.println(integerNum==integerNum1);         //比较两个大于等于128的声明变量         Integer integerNum2 = 128;         Integer integerNum3 = 128;         System.out.print("大于等于128的Integer与Integer:");         System.out.println(integerNum2==integerNum3);     } }

运行结果:

int与Integer:trueint与NewInteger:trueInteger与NewInteger:falseint与int:trueNewInteger与NewInteger:false小于128的Integer与Integer:true大于等于128的Integer与Integer:false

问题:

1.为什么当我们使用数值相等的integerNum、integerNewNum与intNum比较时结果为true?

2.为什么当我们使用数值相等的integerNum与integerNewNum进行比较时结果为false?

3.为什么integerNum与integerNum进行比较时会出现大于128和小于等于128不同结果的情况?

我的理解:

一下所有讨论问题的前提是:两个int型变量所赋值的数值相同时,比较结果为true,即12行的结果。

1.17行与21行所得到的结果为true,其实我们如果我们从源码来理解就会知道其本质了。在此之前我们应该先补充一个感念,Integer integerNum =127在执行时会被翻译成

Integer integerNum = Integer.valueOf(127)。源码如下

 public static Integer valueOf(String arg) throws NumberFormatException {         return valueOf(parseInt(arg, 10));     }     public static Integer valueOf(int arg) {         return arg >= -128 && arg <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[arg + 128]                 : new Integer(arg);     }
 private static class IntegerCache {         static final int low = -128;         static final int high;         static final Integer[] cache;         static {             int arg = 127;             String arg0 = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");             int arg1;             if (arg0 != null) {                 try {                     arg1 = Integer.parseInt(arg0);                     arg1 = Math.max(arg1, 127);                     arg = Math.min(arg1, 2147483518);                 } catch (NumberFormatException arg3) {                     ;                 }             }             high = arg;             cache = new Integer[high - -128 + 1];             arg1 = -128;             for (int arg2 = 0; arg2 < cache.length; ++arg2) {                 cache[arg2] = new Integer(arg1++);             }             assert high >= 127;         }     }
 private final int value; public Integer(int arg0) {         this.value = arg0;     }     public Integer(String arg0) throws NumberFormatException {         this.value = parseInt(arg0, 10);     }

以上jdk源码可以得到,Integer 无论是声明还是新建对象,最终所得的值都是int型,所以我们问题1就等到了答案。两个int型比较所得结果必然是ture.

2.25行所得结果为false,为什么呢?不是都转成int型嘛?结果不是应该为false嘛?额额额额。new了地址就不一样了所以当我们使用”==”进行比较时尽管数值相同,但内存地址却早已不相同。这就涉及到了下一篇博文中会讲的”==”与”.equals”的区别。

3.为什么会出现问题3这种情况,128会是一个零界点呢?其实答案在源码中我们也可以找到

1 public static Integer valueOf(String arg) throws NumberFormatException {2         return valueOf(parseInt(arg, 10));3     }45     public static Integer valueOf(int arg) {6         return arg >= -128 && arg <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[arg + 128]7                 : new Integer(arg);8     }

当arg大于等于-128且小于等于127时则直接从缓存中返回一个已经存在的对象。如果参数的值不在这个范围内,则new一个Integer对象返回。

以上就是int与Integer的区别,我们再日常的项目或者练习中经常拿不准该使用int还是Integer,但看了这篇博文你应该已经有了自己的答案了吧!

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,086
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,561
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,410
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,183
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,820
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,903