Integer和int的区别

Integer和int的区别:

1.Integer是int的包装类,int的初值为0,Integer的初值为null。

2.无论值是否相同,Integer与new Integer都不会相等,结果为false。

  情况一:Integer范围在-128~127之间,指向专门存放它的常量池;new Integer引用指向堆。它们的内存地址不一样,所以无论值是否相同,比较结果都为false。

  情况二:Integer范围不在-128~127之间,编译时Integer.valueOf()返回的是new Integer();而new Integer引用指向堆。这样两者是两个不同的堆栈对象,无论堆上的值是否相同,引用地址不同,比较结果都为false。

  情况三:两个Integer范围都不在-128~127之间,则依然是两个new Integer对象,则比较结果为false。

3.两个都是非new出来的Integer,如果数在-128~127之间,值相同则为true,否则为false。原因:java在编译Integer时,会翻译成Integer i = Integer.valueOf(),而valueOf()会对-128~127之间的数进行缓存。

4.两个都是new出来的,无论堆上的值是否相同,引用地址不同,结果为false。

5.int和Integer比,无论Integer是new出来的还是-128~127范围之外的,值相同则为true,否则为false。原因:Integer会自动拆箱为int再比较。

经典面试题:两个Integer的引用对象传给一个change方法在方法内部进行交换,返回后,两个引用值是否会发生变化

public static void main(String[] args) {
        Integer a=1,b=2;
        System.out.println("initial:a:"+a +",b:"+ b);
        change(a,b);
        System.out.println("change:a:"+a +",b:"+ b);
        change2(a,b);
        System.out.println("change2:a:"+a +",b:"+ b);
    }

    private static void change2(Integer a, Integer b) {
        //通过反射,通过反射去修改private final变量
        try {
            Field field=Integer.class.getDeclaredField("value");
           // 添加访问权限,才能访问私有属性,不然会报错
            field.setAccessible(true);
            Integer tmp=new Integer(b.intValue());
           //通过set方法,互换值
            field.set(b,a.intValue());
            field.set(a,tmp);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    private static void change(Integer a, Integer b) {
        //把数据两个进行交换,看看数据修改没
        Integer tmp=a;
        a=b;
        b=tmp;
    }

输出结果:

initial:a:1,b:2
change:a:1,b:2
change2:a:2,b:1
Field 成员变量的介绍
每个成员变量有类型和值。
java.lang.reflect.Field 为我们提供了获取当前对象的成员变量的类型,和重新设值的方法。

获取变量的类型
类中的变量分为两种类型:基本类型和引用类型:

基本类型( 8 种)
整数:byte, short, int, long
浮点数:float, double
字符:char
布尔值:boolean
引用类型
所有的引用类型都继承自 java.lang.Object
类,枚举,数组,接口都是引用类型
java.io.Serializable 接口,基本类型的包装类(比如 java.lang.Double)也是引用类型

猜你喜欢

转载自blog.csdn.net/GoldWashing/article/details/82664493