`
pengjunwu
  • 浏览: 1801 次
  • 性别: 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封装类型之间的差异。 1. 类型区别: - int是Java的八种基本数据类型之一,属于原始类型(Primitive Type),它直接存储整数值,没有对象的概念。int的默认值是0。...

    JAVA-int和Integer的区别

    在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型(Primitive Type),它...

    JAVA-int和Integer的区别1.zip

    如果你需要高效处理大量整数,或者在基本类型和对象之间切换,那么原始类型`int`可能是更好的选择。而在需要使用对象,尤其是与集合框架交互,或者需要额外的功能(如转换字符串、比较等)时,`Integer`则是必要的。...

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

    `Integer` 是 `int` 的封装类,属于引用数据类型。Java提供了针对所有基本数据类型的封装类,如 `Byte`, `Short`, `Character`, `Long`, `Float`, `Double`, `Boolean`。这些封装类主要用于支持面向对象的特性,如...

    int与Integer的区别(Java各种数据类型详细介绍及其区别).doc

    - 类型:`int`是基本类型,`Integer`是`int`的封装类,属于引用类型。 - 存储:`int`在栈中存储,而`Integer`在堆中创建对象实例。 - 默认值:`int`的默认值为0,`Integer`的默认值为`null`。 - 自动装箱与拆箱...

    28.java基本类型封装.docx

    ### Java基本类型封装详解 #### 一、基本概念与背景 在Java中,存在两种数据类型:基本数据类型和引用数据类型。基本数据类型包括`byte`、`short`、`int`、`long`、`float`、`double`、`char`以及`boolean`。这些...

    Mybatis返回int或者Integer类型报错的解决办法

    这种问题通常出现在当Mapper方法试图返回一个可能是`null`的结果,但方法声明的返回类型是基本类型`int`时。由于基本类型不能为`null`,因此会出现`BindingException`,提示尝试从一个方法返回`null`到一个原始类型...

    Integer和int的不同

    对象存在于堆内存中,而`int`则是存在于栈内存中的基本类型。`Integer`的默认值是`null`,这意味着如果没有初始化,`Integer`变量将表示一个空引用,而不是值为0的整数。这使得`Integer`能够区分未赋值和值为0的情况...

    java基本数据类型与其封装类.doc

    这些基本类型在需要以对象形式存在时,就需要使用它们的封装类,分别是Boolean、Byte、Short、Integer、Long、Float、Double和Character。封装类是这些基本类型的对象表示,提供了更多的方法和功能。 1. **Boolean ...

    Java中八种基本数据类型和八种封装数据类型[文].pdf

    这些封装数据类型是基本数据类型的对象形式,可以存储 null 值,例如 Integer i = null。 Java 中的封装数据类型提供了许多有用的方法,例如 intValue()、doubleValue()、toString() 等,可以方便地进行数据类型...

    Java中八种基本数据类型和八种封装数据类型[定义].pdf

    3. Integer:整型封装类型,相当于基本数据类型 int。 4. Long:长整型封装类型,相当于基本数据类型 long。 5. Short:短整型封装类型,相当于基本数据类型 short。 6. Float:浮点型封装类型,相当于基本数据类型 ...

    Java 八种基本类型和基本类型封装类

    1. 整数类型:包括 byte、short、int、long四种基本类型,分别对应的封装类是 Byte、Short、Integer、Long。 2. 浮点数类型:包括 float 和 double 两种基本类型,分别对应的封装类是 Float 和 Double。 3. 布尔...

    全面了解java基本类型和封装类型的区别及应用

    封装类型,也称为包装器类,是Java为每个基本类型提供的一种对应类,如Integer、Double、Character和Boolean。这些类允许我们将基本类型的数据封装进对象中,从而可以利用对象的方法和特性。例如,Integer类提供了如...

    Integer类的使用方法

    在Java编程语言中,`Integer`类是一个非常重要的封装类,它用于将基本数据类型`int`封装成对象。这不仅增强了数据的灵活性,还提供了许多实用的方法来处理整数相关的操作。下面,我们将深入探讨`Integer`类的使用...

    (HttpServlet封装类)Action.java

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

    Java int与integer的对比区别

    然而,由于Java 5引入的自动装箱和拆箱机制,`Integer` 变量也可以像基本类型那样使用,例如: ```java Integer numObj = 10; // 自动装箱 int num = numObj; // 自动拆箱 ``` 尽管如此,`int` 和 `Integer` 之间...

    java中long类型转换为int类型

    与`long`到`int`的向下转换相比,从`int`到`long`的向上转换是安全的,因为`int`的所有值都能被`long`容纳。例如: ```java int intValue = 100; long longValue = (long) intValue; // 安全的转换 ``` ### 溢出...

    java原始数据类型的包装类

    这些包装类将原始类型封装成对象,使得我们可以使用对象的方法和特性。 1. **自动装箱与拆箱**: - **自动装箱**:将原始类型转换为对应的包装类对象,如`Integer i = 10;`,编译器会自动进行装箱操作。 - **自动...

    Java常用类和枚举类型.pdf

    - `TYPE`:表示基本类型int的Class实例。 此外,Integer类还提供了一些常量,如: - `MAX_VALUE`:表示int类型可取的最大值,即2^31-1。 - `MIN_VALUE`:表示int类型可取的最小值,即-2^31。 - `SIZE`:用来以二...

Global site tag (gtag.js) - Google Analytics