Ingeter与int的比较
,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?
首先看代码:

1 package com.test;
2 /**
4 * @author
5 *
6 */
7 public class TestInteger {
8
9 /**
10 * @param args
11 */
12 public static void main(String[] args) {
13 int i = 128;
14 Integer i2 = 128;
15 Integer i3 = new Integer(128);
16 //Integer会自动拆箱为int,所以为true
17 System.out.println(i == i2);
18 System.out.println(i == i3);
19 System.out.println("**************");
20 Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
21 Integer i6 = 127;
22 System.out.println(i5 == i6);//true
23 /*Integer i5 = 128;
24 Integer i6 = 128;
25 System.out.println(i5 == i6);//false
26 */ Integer ii5 = new Integer(127);
27 System.out.println(i5 == ii5); //false
28 Integer i7 = new Integer(128);
29 Integer i8 = new Integer(123);
30 System.out.println(i7 == i8); //false
31 }
32
33 }

首先,17行和18行输出结果都为true,因为Integer和int比都会自动拆箱(jdk1.5以上)。
22行的结果为true,而25行则为false,很多人都不动为什么。其实java在编译Integer i5 = 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127);所以关键就是看valueOf()函数了。只要看看valueOf()函数的源码就会明白了。JDK源码的valueOf函数式这样的:
1 public static Integer valueOf(int i) {
2 assert IntegerCache.high >= 127;
3 if (i >= IntegerCache.low && i <= IntegerCache.high)
4 return IntegerCache.cache[i + (-IntegerCache.low)];
5 return new Integer(i);
6 }
看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。所以22行的结果为true,而25行为false。
对于27行和30行,因为对象不一样,所以为false。
我对于以上的情况总结如下:
①无论如何,Integer与new Integer不会相等。不会经历拆箱过程,i3的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false
java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存
③两个都是new出来的,都为false
④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比
public static void main(String[] args) {
int a = 1;
Integer a1 = 1;
System.out.println(a1 == a);// true a1自动拆箱
int b = 128;
Integer b1 = 128;
System.out.println(b1 == b);// true
Integer c = 1;
Integer c1 = new Integer(1);
Integer c2 = new Integer(2);
System.out.println(c == c1);// false c指向常量池,c1指向堆
System.out.println(c1 == c2);// false 两个不同的对象
Integer d = 127;
Integer d1 = 127;
Integer d2 = 128;
Integer d3 = 128;
System.out.println(d == d1);// true 执行Integer.valueof()方法
// -128到127之间的数会有缓存,从缓存中取值,不会new
System.out.println(d2 == d3);// false 没缓存会new
}
Ingeter与int的比较的更多相关文章
- Integer与int的种种比较
package com.lxm.basics; public class IntegerTest { public static void main(String[] args) { Integer ...
- Integer与int的种种比较你知道多少?
如果面试官问Integer与int的区别:估计大多数人只会说道两点,(1)Ingeter是int的包装类,int的初值为0:(2)Ingeter的 初值为null.但是如果面试官再问一下Integer ...
- Java中 int和Integer的区别+包装类
--今天用Integer 和Integer 比较 发现有问题,于是去查了查. 1.Java 中的数据类型分为基本数据类型和引用数据类型 int是基本数据类型,Integer是引用数据类型: Inget ...
- java中int和Integer的区别
Integer与int的种种比较你知道多少? 转载自http://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html 如果面试 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- Java Integer 与 int 深刻理解
今天在做Object 自动转为Integer 类型之后的判断,遇到一个不理解的点,当数值超过127之后,两个数值相同的Object 对象用 == 判断的结果是false. Object a = 128 ...
- Integer与int区别
Integer与int的区别:估计大多数人只会说道两点,一开始我也不太清楚,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i ...
- Integer与int的区别(转)
如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1; ...
- Java的Integer和int有什么区别
Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper cla ...
随机推荐
- 还在为工作发愁?学JavaScript吧
事实上,每家专业招聘机构,从Glassdoor.com和Linkedin到美国劳工部,都报导了就业市场对开发人员需求的增长速度出于意料地快.这种需求可能已经不新鲜了,但是就业市场对哪种开发语言的需求量 ...
- Bootstrap 标签页(Tab)插件
摘自: http://www.runoob.com/bootstrap/bootstrap-tab-plugin.html Bootstrap 标签页(Tab)插件 标签页(Tab)在 Bootstr ...
- (转)GrabPass捕捉屏幕纹理
转自:http://blog.sina.com.cn/s/blog_89d90b7c0102va4m.html 最近在看热扭曲效果,里面用到了GrabPass. 之前看过官方翻译版本的说明http:/ ...
- Tuxedo低版本客户端(Tuxedo 9)连接到高版本Tuxedo服务端(Tuxedo 12.1.3)的问题
经过我实测,是没问题的.但是客户端的Tuxedo DLL必须全部是Tuxedo 9的DLL,不能混用.不然即使用Dependency Walker 分析DLL依赖完全正确,但是实际运行时结果也会出现奇 ...
- 【LeetCode】242. Valid Anagram (2 solutions)
Valid Anagram Given two strings s and t, write a function to determine if t is an anagram of s. For ...
- Atitit 类库冲突 解决方案
Atitit 类库冲突 解决方案 表现情况,找到不某些方法 类等,一个情况是真的找不到,一个情况是加载了错误的jar,导致正确的jar无法加载.. 1.1. 查找现在ide正在使用的jar1 1.2. ...
- android studio build.gradle 中的dependencies 的 compile jar文件
1.其下载之后的存放地址 例如:compile 'com.qiniu:happy-dns:0.2.5' 存放在:.gradle\caches\modules-\files-\c0ee826650468 ...
- 《Essential C++》读书笔记 之 C++编程基础
<Essential C++>读书笔记 之 C++编程基础 2014-07-03 1.1 如何撰写C++程序 头文件 命名空间 1.2 对象的定义与初始化 1.3 撰写表达式 运算符的优先 ...
- github新建repositories后import已有code 随后同步更新
github上,可以forks别人已有的项目,而且同步更新合并也很方便,但如果是自己新建的项目,而导入的是别人的代码修改后,别人的又更新了,自己想获取他的更新,怎么办呢?其实很简单. # git cl ...
- Java知多少(102)多媒体基础
本节介绍 Java程序播放幻灯片和动画,播放声音和视频的方法. 播放幻灯片和动画 用实例说明播放幻灯片和动画的方法. [例 12-7]小应用程序先将幻灯片读入数组在存储,单击鼠标变换幻灯片,逐张显示. ...