JAVA中Integer对象的引用
来源:互联网 发布:好吃的蛋糕 知乎 编辑:程序博客网 时间:2024/05/29 17:21
JAVA中没有指针一说,但也有引用的概念。这里要说的主要是Integer是不是同一个对象。
1、先看一段代码:
public static void main(String[] args){Integer a1 = 100;Integer b1 = a1;//另一种也可以b1=100Field field = null;try {field = a1.getClass().getDeclaredField("value");} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} field.setAccessible(true); try {field.set(a1, 5000);} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} field.setAccessible(true); try {field.set(a1, 5000);} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} field.setAccessible(true); try {field.set(a1, 5000);} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} System.out.println("b1="+b1); Integer c1 = 100; System.out.println("c1="+c1); }这又是什么答案。对于new的操作,是不进行装箱的,而是在堆中生成对象的。
理解了装箱、缓存、引用就不难理解了。可以自己试试。
0 0
- JAVA中Integer对象的引用
- 在java中String,对象,Integer(包装类型的)关于引用传递还是值传递
- java 中对象的引用
- Java中对象的引用
- Java中对象的引用
- Java中对象的引用
- Java中对象的引用
- Java中int和Integer的区别:int 是基本类型,直接存数值 ;integer是对象,用一个引用指向这个对象
- java中对象和对象的引用
- java中对象和对象的引用
- JAVA中对象和对象的引用
- java中对象的引用(强引用、软引用、弱引用、虚引用)
- Java 中对象引用的类型
- java中对象和引用的理解
- Java中对象的几种引用
- Java中对象与引用的理解
- java中对象的引用与赋值
- Java中对象的引用传值
- 第二章作业P51.15(输入一个正整数n,输出正三角形图案。)
- [BZOJ 1047] HAOI 2007 理想的正方形 · 单调队列
- 需求来自哪儿?
- POJ-1243 One Person (经典级dp)猜数字
- P53 第35题 编程求给定的4个数字全排列
- JAVA中Integer对象的引用
- 创建自定义 AngularJS 指令:Part I 指令基础知识
- C++编程练习(002)
- 安卓基础知识总结
- Android SDK开发包国内下载地址
- Ettercap结合sslstrip对ssl/https进行攻击
- Redis的内存优化与对持久化机制的分析
- android-常见控件的使用方法
- POJ 2570