Integer与int的区别
简述: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:true int与NewInteger:true Integer与NewInteger:false int与int:true NewInteger与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 }
4
5 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,但看了这篇博文你应该已经有了自己的答案了吧!
Integer与int的区别的更多相关文章
- Integer与int的区别(转)
如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1; ...
- Java|从Integer和int的区别认识包装类
https://blog.csdn.net/darlingwood2013/article/details/96969339?utm_medium=distribute.pc_relevant.non ...
- java中Integer和int的区别(转)
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...
- Integer与int的区别(包装类和基本数据类型的区别)
1. 默认值 int默认值为0,Integer的默认值为null.推论:Integer既可以表示null又可以表示0 2. 包装类中提供了该类型相关的很多算法操作方法 如把十进制装换为2进制(toBi ...
- Integer和int的区别
1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,当new一个Integer ...
- Java中Integer 和 int的区别
基本概念的区分: 1.Integer 是 int 的包装类,int 则是 java 的一种基本数据类型 2.Integer 变量必须实例化后才能使用,而int变量不需要 3.Integer 实际是对象 ...
- Integer 与int 的区别
int 是java 提供的8 种原始数据类型之一.Java 为每个原始类型提供了封装类,Integer 是java 为int 提供的封装类.int 的默认值为0,而Integer 的默认值为null, ...
- 面试题:Integer和int的区别?在什么时候用Integer和什么时候用int
/* * (1) int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类. * (2)int的默认值为0, 而Integer的默 ...
- Integer跟int的区别(备份回忆)
int与Integer的区别 int 是基本数据类型Integer是其包装类,注意是一个类.为什么要提供包装类呢???一是为了在各种类型间转化,通过各种方法的调用.否则 你无法直接通过变量转化.比如, ...
随机推荐
- .NET跨平台之旅:corehost 是如何加载 coreclr 的
在前一篇博文中,在好奇心的驱使下,探秘了 dotnet run ,发现了神秘的 corehost —— 运行 .NET Core 应用程序的幕后英雄.有时神秘就是一种诱惑,神秘的 corehost ...
- [网站公告]数据库服务器IOPS跑满造成网站不能正常访问
今年下午13:20-14:20左右,突增的访问量引发数据库服务器(阿里云RDS)IOPS跑满,造成大量请求执行缓慢,从而严重影响了网站的正常访问,给大家带来很大的麻烦,望大家谅解! 在出现故障时,当我 ...
- webBrowser1
HTMLDocument类的引用 using mshtml;
- CentOS安装Redis详细教程
构建 Redis redis 目前没有官方 RPM 安装包,我们需要从源代码编译,而为了要编译就需要安装 Make 和 GCC. 如果没有安装过 GCC 和 Make,那么就使用 yum 安装. yu ...
- 【转】javascript浏览器参数的操作,js获取浏览器参数
原文地址:http://www.haorooms.com/post/js_url_canshu html5修改浏览器地址:http://www.cnblogs.com/JiangXiaoTian/ar ...
- [转]HQL中的子查询
原文地址:http://blog.csdn.net/xb12369/article/details/8638683 子查询: 子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一 ...
- 如何使用PullToRefresh
这里有详解 PullToRefresh使用详解(一)--构建下拉刷新的listView PullToRefresh使用详解(二)---重写BaseAdapter实现复杂XML下拉刷新 PullToRe ...
- 【BZOJ 4580】【Usaco2016 Open】248
http://www.lydsy.com/JudgeOnline/problem.php?id=4580 区间dp,f(i,j)表示区间[i,j]全部合成一个数,这个数是多少. 可以归纳证明[i,j] ...
- Newick format tree
1. all branches + leaf names + internal supports ((D:0.723274,F:0.567784)1.000000:0.067192,(B:0.2793 ...
- cookie
1.基本操作 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给 ...