原文地址:http://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html
如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱。所以我对它们进行了总结,希望对大家有帮助。
package com.test; /** * * @author 刘玲 * */ public class TestInteger { /** * @param args */ public static void main(String[] args) { int i = 128; Integer i2 = 128; Integer i3 = new Integer(128); //Integer会自动拆箱为int,所以为true System.out.println(i == i2); System.out.println(i == i3); System.out.println("**************"); Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127); Integer i6 = 127; System.out.println(i5 == i6);//true /*Integer i5 = 128; Integer i6 = 128; System.out.println(i5 == i6);//false */ Integer ii5 = new Integer(127); System.out.println(i5 == ii5); //false Integer i7 = new Integer(128); Integer i8 = new Integer(123); System.out.println(i7 == i8); //false } }
首先,17行和18行输出结果都为true,因为Integer和int比都会自动拆箱(jdk1.5以上)。
22行的结果为true,而25行则为false,很多人都不动为什么。其实java在编译Integer i5 = 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127);所以关键就是看valueOf()函数了。只要看看valueOf()函数的源码就会明白了。JDK源码的valueOf函数式这样的:
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再去比
如果大家觉得有什么不对的地方,欢迎指示。
相关推荐
【安卓Android源码——Cnblogs博客园安卓客户端】 这篇内容主要探讨的是关于安卓Android的源码分析,特别是针对Cnblogs博客园的安卓客户端应用。源码是软件开发的核心,它揭示了程序背后的逻辑和设计思路,对于...
这样,其他设备接收到广播后,会检查自己的IP地址是否与广播中提到的相同。如果相同,那么这些设备也会参与到“互怼”过程中,即不断地发送自己的免费ARP广播。 #### 三、免费ARP的作用 1. **检测地址冲突**:免费...
【安卓Android源码——经典源码之博客园客户端】 这篇解析将深入探讨安卓Android源码中的博客园客户端应用。博客园客户端是安卓平台上一个流行的开源项目,它为开发者提供了研究和学习Android应用开发的宝贵资源。...
1. int或double转QString: 当需要将整型或浮点型数值显示为文本时,可以使用QString的构造函数`QString::number()`,该函数接收一个数值和基数作为参数,基数可以是2、8、10或16,表示二进制、八进制、十进制或十六...
《深入剖析Android源码——以博客园客户端为例》 Android作为一个开源的操作系统,其源码是开发者探索移动应用开发的宝库。博客园客户端作为一款广受欢迎的应用,其源码同样蕴含了丰富的Android开发知识。本文将从...
《你必须知道的.NET》作为由知名博主anytao(王涛)所著,并由博客园精心整理发布的一部作品,正是为那些渴望深入理解.NET平台的开发者们提供了一条系统的知识路线图。 该系列文章包含22个部分,每部分都旨在帮助...
【安卓Android源码——[安卓开源]博客园客户端】 这篇内容将深入探讨安卓Android源码在构建博客园客户端中的应用。开源项目为开发者提供了一个学习和理解安卓应用程序开发的宝贵资源,尤其是对于初学者和有经验的...
描述"安卓Android源码——[安卓开源]博客园客户端.7z"与标题相呼应,再次确认了这是一个安卓平台上的应用——博客园客户端的源代码,而且是开源的。这意味着任何人都可以查看、学习甚至修改这些源代码。 【标签解析...
博客园博客PDF生成器是一款专为博客园用户设计的实用工具,它允许用户将自己在博客园上发表的文章集合导出为PDF格式的文档,方便离线阅读、备份或者分享。这款工具通常适用于那些希望保存自己的博客内容或者需要将一...
### 抽象类与抽象方法 #### 内容详情 **摘要:** 本文主要探讨了C#中的抽象类和抽象方法的基本概念、特性和应用场景。通过解析这些概念,旨在帮助读者更好地理解面向对象编程中多态性的实现方式,并掌握如何在实际...
本压缩包“博客园皮肤(比较全)可以自己选择.rar”显然包含了多种博客园主题皮肤,供用户根据自己的需求自由选择。 描述中提到,这些皮肤可能由博主精心收集,他认为这些皮肤种类丰富且设计美观。虽然文件名不小心...
这篇文档将深入解析《安卓Android源码——(精)仿博客园客户端源码》的相关知识点,帮助你理解和学习如何在Android平台上开发一个类似博客园的客户端应用。 首先,我们需要了解Android开发的基础。Android是由Google...
“仿博客园wordpress主题”是一款专为WordPress平台设计的中文三栏式博客模板,旨在模仿国内知名技术社区——博客园的界面风格,提供用户熟悉的浏览体验。这款主题以其简洁、清晰的布局,以及对中文内容的良好支持,...
自动化运维工具——ansible详解(一) - 珂儿吖 - 博客园.html
程序通过分析博客园博 客源码来生成一些必要的数据,可能在以后使用当中出现爬取不了的情况,可能是博客园的源码 结构修改了。程序只是用于学习之用,严禁用于非法目的而照成博客园服务器过载。 由于生成PDF的时候...
博客园作为一个广受欢迎的中文博客平台,为众多技术爱好者提供了分享知识的空间。"Beautifycnblogs博客园样式美化"项目旨在帮助用户提升其博客在博客园上的视觉效果,通过自定义CSS样式,使得博客更加个性化和专业。...
博客园样式
博客园客户端Android源码分析 博客园是一款深受程序员喜爱的在线技术分享平台,其客户端提供了方便的移动阅读体验。分析博客园的Android源码,我们可以深入理解如何构建一个功能完善的移动应用,特别是针对技术社区...
此外,为了提高用户体验,博客园客户端可能还包括了其他一些关键特性,比如适应不同屏幕尺寸的响应式布局、网络状态检测与重试机制、异步任务处理以避免阻塞UI线程、以及友好的错误提示和处理机制。 总的来说,...