`
pengjunwu
  • 浏览: 1769 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

Int/Integer 基本类型与封装类型

 
阅读更多
转自:http://hi.baidu.com/fandywang_jlu/blog/item/c5590b4eae053cc3d1c86a13.html
这是CSDN上的一个帖子,问题如下:

public static void main(String[] args) {

        Integer a = 128;

        Integer b = 128;

        System.out.println(a == b);

    }


请问输出结果是什么,并给出解释。

-------------------------------------------------------------------------------

输出结果为:false,分析如下:

首先,看看Integer的封装吧:

    public static Integer valueOf(int i) {

          final int offset = 128;

          if (i >= -128 && i <= 127) { // must cache 

             return IntegerCache.cache[i + offset];

          }

           return new Integer(i);

        }
当你直接给一个Integer对象一个int值的时候,其实它调用了valueOf方法,然后你赋的这个值很特别,是128,那么没有进行cache方法,相当于new了两个新对象。所以问题中定义a、b的两句代码就类似于:

        Integer a = new Integer(128);

        Integer b = new Integer(128);
这个时候再问你,输出结果是什么?你就知道是false了。如果把这个数换成127,再执行:

        Integer a = 127;

        Integer b = 127;

        System.out.println(a == b);
结果就是:true

由上可知,我们进行对象比较时最好还是使用equals,便于按照自己的目的进行控制。

--------------------------------------------------补充-----------------------------------------------------------------------

我们看一下IntegerCache这个类里面的内容:

    private static class IntegerCache {

       private IntegerCache() {

       }


       static final Integer cache[] = new Integer[-(-128) + 127 + 1];
       static {

           for (int i = 0; i < cache.length; i++)
              cache[i] = new Integer(i - 128);
       }

    }


由于cache[]在IntegerCache类中是静态数组,也就是只需要初始化一次,即static{......}部分,所以,如果Integer对象初始化时是-128~127的范围,就不需要再重新定义申请空间,都是同一个对象---在IntegerCache.cache中,这样可以在一定程度上提高效率。
public static void main(String[] args) { 
Integer b = 0; 
int c = 0; 
if (b == c) { 
System.out.println(true); 
} else { 
System.out.println(false); 
} 


输出的结果为true,但并不意味这他们两个不同类型的值就相等,是因为其过程中系统自动拆箱造成的,b==c的时候java自动拆箱了,最后比较的是两个int

结论:
Java中的关系操作符==和!=比较的都是对象的引用,并非对象的内容,如果想比较两个对象的实际内容是否相同,必须使用所有对象都适合的特殊方法equals(),但是,equals()默认行为也是比较引用,所以,一般需要自己重写该方法。注意:equals不适合基本类型。


分享到:
评论

相关推荐

    Java基本数据类型与封装类型详解(int和Integer区别)

    主要介绍了Java基本数据类型与封装类型详解(int和Integer区别) ,需要的朋友可以参考下

    Java中int与integer的区别(基本数据类型与引用数据类型)

     integer 是引用数据类型,是int的封装类型,默认值为null,创建该类型需要进行实例化。  基本数据类型是可以用“==”进行比较,而引用数据类型则不可以,一般是通过equals方法来实现比较。 二 、再说说基本数据...

    mybatis返回Integer

    mybatis返回int会报错,改成Integer封装类型可以解决,具体参考我的博客

    Integer和int的不同

    Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加...

    (HttpServlet封装类)Action.java

    通过JAVA反射技术对HttpServlet进行简单封装,类似于struts框架,页面请求过来的参数名只需要与Action&lt;T&gt; T这个Bean里的变量对应即可,getForm()就是获得页面传过来的参数[注:当前这个只能传T里的string和int/...

    Java数据类型及其转换详解

    ⑴ Java简单类型与封装类 我们知道,Java语言是...当然,Java在提供大量的其它类时,也提供了与简单数据类型对应的封装类,于是,Java中就有了诸如int和Integer(float和Float、double和Double……)的不同的数据类型。

    125条常见的java面试笔试题大汇总

    Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer long Long float Float double ...

    JAVA程序员面试宝典

    原始类型封装类booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和...

    java笔试题 大学生应聘

    原始类型封装类,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和...

    基本数据类型包装类.txt

    byte——Byte short——Short int——Integer ...封装了字符串转化成基本数据类型的方法(重点) 常用的字符串转化为基本数据类型的方法: Integer.parseInt() Long.parseLong() Double.parseDouble()

    java笔试题大汇总

    intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构...

    企业java工程师测试题

    企业java工程师测试题 1. 面向对象的特征有哪些方面? 答案:最基本特征:封装,继承,多态...答案:int是基本类型。Integer是引用类型。Integer可以把String转换成int。 5. 运行时异常与一般异常有何异同? 。。。。。

    java考试题大总结

    intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储...

    java试题经典考试试题

    面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择...intInteger longLong floatFloat doubleDouble

    java程序员面试技巧

    intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它 们包括:大小和速度问题,这种类型、、、、、、

    Integer类的缓存机制

    存在下述例子,判断其输出结果。 public class Main{ public static void main(String[] agrs){ Integer a = 110;...我们知道,在Java中存在基本数据类型和引用数据类型,而Integer作为int的封装类,Integer

    Java面试汇总05101

    1.int是基本数据类型,Integer是int的封装类,是引用类型 2.基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间,必须

    Java面试题大全(doc)

    1、面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个...Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类booleanBoolean charCharacter byteByte sho

    Excel POI读取封装(文件+示范代码)

    Excel POI读取封装(文件+示范代码) package org.excel.service; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java....

Global site tag (gtag.js) - Google Analytics