java integer引用_JAVA中Integer对象的引用

本文探讨了Java中Integer对象的缓存机制,通过示例代码展示了-128到127之间Integer对象的复用,以及通过反射修改缓存对象值的影响。同时,分析了new Integer()与直接赋值的区别,强调了装箱、引用及缓存理解的重要性。
摘要由CSDN通过智能技术生成

JAVA中没有指针一说,但也有引用的概念。这里要说的主要是Integer是不是同一个对象。

1、先看一段代码:

public static void main(String[] args){

Integer a1 = 100;

Integer b1 = a1;//另一种也可以b1=100

Field field = null;

try {

field = a1.getClass().getDeclaredField("value");

} catch (NoSuchFieldException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SecurityException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

field.setAccessible(true);

try {

field.set(a1, 5000);

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("b1="+b1);

Integer c1 = 100;

System.out.println("c1="+c1);

}

结果:

b1=5000

c1=5000

从上面,首先这里要说明几个,

1)、对于Integer来说,-128-127之间的整型已经初始化放在IntegerCache中,如果是装箱的话,就会从这里面取对象。

2)、b1=a1到底是数字赋值还是同一个对象?这个从结果实际就可以看出来,b1和a1指向同一个对象,而不是同一个数值

3)、c1=100,说明对于-128-127之间的数值,都是从IntegerCache中获取的对象,100对应的Integer对象被改变后,后续对于100的装箱都被改变。因为获取cache中对象时用的是数组索引,而不是数值比较获取的。

不过修改这个缓存会比较危险,不介意。谁知道什么jar包或者什么平台来个100的装箱,但得到结果又不是100,到时就崩溃了。

2、通过上面描述,那么如果改成这样又是什么答案

public static void main(String[] args){

Integer a1 = 200;

Integer b1 = a1;

Field field = null;

try {

field = a1.getClass().getDeclaredField("value");

} catch (NoSuchFieldException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SecurityException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

field.setAccessible(true);

try {

field.set(a1, 5000);

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("b1="+b1);

Integer c1 = 200;

System.out.println("c1="+c1);

}

3、那么再改一下

public static void main(String[] args){

Integer a1 = new Integer(100);

Integer b1 = a1;

Field field = null;

try {

field = a1.getClass().getDeclaredField("value");

} catch (NoSuchFieldException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SecurityException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

field.setAccessible(true);

try {

field.set(a1, 5000);

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("b1="+b1);

Integer c1 = 100;

System.out.println("c1="+c1);

}这又是什么答案。对于new的操作,是不进行装箱的,而是在堆中生成对象的。

理解了装箱、缓存、引用就不难理解了。可以自己试试。

原文:http://blog.csdn.net/danielinbiti/article/details/44907625

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值