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)也是引用类型