黑马程序员技术交流社区

标题: 有关Integer的问题 [打印本页]

作者: 樊占江    时间: 2012-8-23 01:06
标题: 有关Integer的问题
public class AutoBox {
/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  Integer iObj=3;
  System.out.println(iObj+12);
  String s1=new String("abc");
  String s2=new String("abc");
  Integer i1=137;
  Integer i2=137;
  System.out.println(i1==12);
  Integer i3=Integer.valueOf(3);
  Integer i4=Integer.valueOf(3);
  System.out.println(i3==i4);
}
}
我现在想要的是如何让Integer i1=137;
  Integer i2=137;
  System.out.println(i1==12);不为false

作者: 王海亮    时间: 2012-8-23 01:07
public static void main(String args[]){
                Integer a = new Integer(666);
                //a++;
                a = a+1;
                System.out.println(a);
                change(a);
                System.out.println(a);
                }

                public static void change(Integer a){
                a = 10;
                }
作者: 李知伦    时间: 2012-8-23 02:36
先看一下Integer的原码
public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}
从jdk1.5开始,有“自动装箱”这么一个机制,在byte-128到127范围内(ps整型的八位二进制的表示的范围为-128到127),如果存在了一个值,再创建相同值的时候就不会重新创建,而是引用原来那个,用==来比较时,是同一个对象
但是超过byte范围还是会新建的对象new Integer(),那么用==来比较时,地址是不等的

Integer i1=new Integer(128);
int i2=128;
//经历拆箱过程将i1对象变为int i1=128;所以为true
System.out.println("---new Integer与int---"+(i1==i2));
Integer i3=new Integer(128);
//两个都是new。。两个对象间的比较,比较的是地址,所以为false
System.out.println("---new Integer与new Integer---"+(i1==(i3)));
Integer i4=128;
Integer i44=127;
//不会经历拆箱过程,i3的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
System.out.println("---new Integer与Integer---"+(i3==i4));
Integer i5=128;
Integer i55=127;
//Integer与Integer间的比较,自动装箱过程,超过范围则创建新对象
System.out.println("---Integer为128与Integer为128---"+(i4==i5));
System.out.println("---Integer为127与Integer为127---"+(i44==i55));

作者: 王海亮    时间: 2012-8-23 11:06
本帖最后由 王海亮 于 2012-8-23 12:21 编辑
王海亮 发表于 2012-8-23 01:07
public static void main(String args[]){
                Integer a = new Integer(666);
                //a++;

都在八维住用   同一个条线





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2