服务时间:8:30-18:00

首页 >java学习网

int和Integer的区别是什么

发布时间:2022-11-22 22:49 字数:1945字 阅读:138

int和Integer的区别是什么

考点:考察求职者对引用类型和原始类型的区分和理解。

出现频率:★★★★★

【面试题解析】

Java提供引用类型和原始类型(或内置类型)两种不同的类型。另外,Java还为每个原始类型提供了封装类(Wrapper)。

表1列出了原始类型以及对应的对象封装类。

表1原始类型和对应的封装类

原始类型和对应的封装类

引用类型和原始类型的行为完全不同,并且分别具有不同的语义。假定一个方法中有两个局部变量,一个变量为int原始类型,另一个变量是对一个Integer对象的对象引用,如下所示:

        int i = 5;                             // 原始类型
        Integer j = new Integer(10);          // 对象引用

这两个变量都存储在局部变量表中,并且都是在Java操作数堆栈中被操作的。原始类型int和对象引用各占堆栈的32位(要表示一个int或一个对象引用,Java虚拟机实现至少需要使用32 位存储)。Integer对象对应的堆栈项并不是对象本身,而是一个对象引用。对象引用是指向对象存储所在堆中的某个区域的指针。Java中的所有对象都要通过对象引用访问。而当声明一个原始类型时,就为类型本身声明了存储。

引用类型和原始类型具有不同的特征和用法。以哪种类型的数据结构存储,决定了以此类型作为某个类的实例数据时所指定的默认值。对象引用实例变量的默认值为null,而原始类型实例变量的默认值与具体的类型有关。

许多程序的代码将同时包含原始类型以及它们的对象封装。程序员必须了解这两种类型是如何工作和相互作用的,以避免代码出错。

例如,不能对原始类型调用方法,但可以对对象调用方法。

        int j = 5;
        j.hashCode();     // 错误
        //...
        Integer i = new Integer(5);
        i.hashCode();     // 正确

使用原始类型无须调用new,也无须创建对象,这节省了时间和空间。混合使用原始类型和对象,也可能导致与赋值有关的意外结果,看起来没有错误的代码,可能无法完成预期工作。示例代码如下:

        import java.awt.Point;
        class Assign
        {
        public static void main(String args[])
        {
        int a = 1;
        int b = 2;
        Point x = new Point(0,0);
        Point y = new Point(1,1);                 // 1
        System.out.println("a is " + a);
        System.out.println("b is " + b);
        System.out.println("x is " + x);
        System.out.println("y is " + y);
        System.out.println("Performing assignment and " + "setLocation...");
        a = b;
        a++;
        x = y;                                 // 2
        x.setLocation(5,5);                     // 3
        System.out.println("a is "+a);
        System.out.println("b is "+b);
        System.out.println("x is "+x);
        System.out.println("y is "+y);
        }
        }

这段代码生成以下输出:

        a is 1
        b is 2
        x is java.awt.Point[x=0,y=0]
        y is java.awt.Point[x=1,y=1]
        Performing assignment and setLocation...
        a is 3
        b is 2
        x is java.awt.Point[x=5,y=5]
        y is java.awt.Point[x=5,y=5]

修改整数a和b后结果没意外。b的值被赋予整型变量a,a值增加了1。令人感到意外是在赋值并调用setLocation()函数之后,x和y对象的输出结果。我们在完成x=y赋值之后,特意对x调用了setLocation,x和y的值怎么会相同呢?将y赋予x,然后更改了x,这与我们对整数a和b进行的操作没什么不同。

这种混淆是由原始类型和对象的使用造成的。赋值对这两种类型所起的作用没什么不同。赋值运算符“=”左边的值等于右边的值,这一点对于原始类型(如前面的int类型值a和b)是显而易见的。对于非原始类型(如Point对象),赋值修改的是对象引用,而不是对象本身。

换句话说,x和y是对象引用,因此,在语句“x=y;”之后,x和y引用同一个对象,对x执行的所有方法与对y执行的方法都作用于同一个对象。