当前位置: 代码迷 >> J2EE >> java 外覆类 Integer 查看reference,该怎么处理
  详细解决方案

java 外覆类 Integer 查看reference,该怎么处理

热度:527   发布时间:2016-04-21 21:27:39.0
java 外覆类 Integer 查看reference

Integer i = new Integer(1);
Object oi = i;
System.out.println("oi add is: " + oi);

i ++;
Object oii = i;
System.out.println("Integer i is: " + i);
System.out.println("oii add is: " + oii);


按理说,java的外覆类,只能在初始化时设定其值,不能在产生i后再改变它的值(i++)。
但是像上面代码中表示的那样,其实可以用i++,而且打印出i的值也确实+1了。
我想验证一下,是不是i++的过程中,java默认重新new了一个Integer,并让i指向了这个新的Integer,但是i++前后,i的地址打印不出来,即使向上转型为Object类后,打印出来的还是1 和2,不是地址。
oi add is: 1
Integer i is: 2
oii add is: 2

请教各路大神,这个i++到底是咋回事,是重新new了一个Integer对象吗,还是怎么实现的?
and,怎么才能把Integer指向的地址打印出来呢
外覆类

------解决方案--------------------
引用:
Quote: 引用:

Integer支持++运算符是因为Integer包装器类内部重载(operator)了++运算符。

可是,如果我写成这样:
Integer i = new Integer(1);
Integer j = i;
j++;
System.out.println("Integer i is: " + i);
打印的结果仍然是1,而不是2
j和i指向的是同一块内存吧,通过j++的操作为什么不能把i的值加1呢

j和i指向的根本就不是同一块内存,Integer j = i;表示用i的值去构造j,而不是生命了另一个引用,包装器类跟普通的类在这点上是有本质区别的。
------解决方案--------------------
引用:
Quote: 引用:

看一下Integer中的构造方法和hashcode方法:
private final int value;

 public Integer(int value) {
this.value = value;
    }

 public int hashCode() {
return value;
    }
其它类的hashcode方法,例如HashMap中的:
 public int hashCode() {
int h = 0;
Iterator<Entry<K,V>> i = entrySet().iterator();
while (i.hasNext())
    h += i.next().hashCode();
return h;
    }
Thread类中的hashcode方法:
public native int hashCode();

ok,hashcode是经过计算后的所谓地址,有些可以可以看得见,有些看不见,但是要知道的是Integer里面就是返回的value的值!


Integer确实是返回了value的值,不过我把Integer向上转型为Object后,它调用的不是Object的hashCode()吗?还是说,仍然调用了Integer的hashCode()?

对比!
  相关解决方案