首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

求java好手解释一下Integer的等于判断,本人学习java也有一定水平,实在费解

2013-08-09 
求java高手解释一下Integer的等于判断,本人学习java也有一定水平,实在费解Integer c 3Integer d 3In

求java高手解释一下Integer的等于判断,本人学习java也有一定水平,实在费解
    Integer c = 3;
    Integer d = 3;
    Integer e = 321;
    Integer f = 321;

    System.out.println(c == d);
    System.out.println(e == f);

输出 true false
     Integer???相等 Java
[解决办法]

引用
“==”比较的应该是hashcode吧,但是源码中的hashcode即value,也就是初始化时的int值;为什么大于128的就会new Integer呢
 javap指令怎么用? 

static final Integer cache[] = new Integer[-(-128) + 127 + 1];

static {
    for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
    }
这是源码中的,也就是说cache中已有-128到127,不在这范围的会新new ,这时可以理解比较是内存地址,也就是是不是同一对象,并不是比较hashCode,hashcode相同对象不一样相同,毕竟hashcode是int大小是有限的,看来lz的==,equal,hashcode什么的还有待提高哈。。
[解决办法]
引用:
 public void setLocation(int x, int y) {
 
this.x = x;
this.y = y;
}




<1>.

private static void modifyPoint(Point p1, Point p2)
{
   /* Point tmpPoint = p1;
    p1 = p2;
    p2 = tmpPoint;*/
    p1.setLocation(5, 5);
    p2 = new Point(5, 5);
}


结果是[5,5], [0,0]



<2>.

private static void modifyPoint(Point p1, Point p2)
{
    Point tmpPoint = p1;
    p1 = p2;
    p2 = tmpPoint;
    p1.setLocation(5, 5);
    p2 = new Point(5, 5);


}


结果是[0,0], [5,5]



咋回事?哪位大师解释一下?


Java的Reference问题
Java的对象在堆中,Java在方法在执行时,会为每个方法创建栈帧,并压入当前线程的栈,每个栈帧都保存有方法的变量,字节码,引用等信息,以<1>为例子,P1,P2在main方法的栈帧中很老实的指向堆中的两个对象。而在modifyPoint栈帧中,p2 = new Point(5,5);创建了一个新的对象,并将该栈帧中的p2指向堆中的新对象。 
注意,此问题的根本原因是两个方法中的P2是指向同一个堆对象的不同引用,对引用本身的更改,在不同的栈帧中是不相影响的。
对于<2>也同样分析即可。

热点排行
Bad Request.