zyf4005 2016-05-18 03:38 采纳率: 100%
浏览 6430
已采纳

java中 Integer a=5;和Integer a = new Integer(5);的区别?请高手赐教。

/*首先要知道的常识:
1.关系操作符==:计算"操作数"的 值 之间的关系,结果为true或者false;这操作数指的是所有的基本数据类型以及所有对象;
2.equals():是Object类中的方法,equals()作用和==相同,但是不适用于基本数据类型;
3.自己定义的类可以覆盖Object类中的equals(); 
*/

//下面来看一个例子:
class Da 
    {   

/*此时a==b和a.equals(b)均为false; 因为a
和 b指向了不同的对象,虽然这两个对象的内容相同;*/
//int c;
//Da(int c){this.c=c;}
//static Da a=new Da(5);  //
//static Da b=new Da(5);  //



/*此时a==b为false;a.equals(b)为true;前者因为a和b的值不一样,指向了不同的对象;
  后者因为Integer覆盖了Object类中的equals(),此时equals()比较的是Integer的对象的内容,也即int值;
*/
//static Integer a=new Integer(5);  
//static Integer b=new Integer(5);   



/*此时a==b和a.equals(b)均为true;现在问题来是:
在jdk1.5以后,可以使用自动装箱机制,我用的是jdk1.8,那么Integer a=5;是和Integer a = new Integer(5);一样的
那为啥结果就和上面的不一样呢?请高手赐教,多谢了。
*/
static Integer a=5;  
static Integer b=5;   
public static void main(String[] args) 
{

    System.out.println(a==b);
    System.out.println(a.equals(b));
}
}
  • 写回答

2条回答 默认 最新

  • 毕小宝 博客专家认证 2016-05-18 03:52
    关注

    System.out.println(a==b);
    这个结果为true,根本原因是java的包装类Integer使用了缓存,对包装类的自动装箱、自动拆箱也是一种语法糖, Java的new Integer操作,当参数值在【-128,127】之间时,new操作返回的对象是有缓存的,你使用的5在这个范围内,所以使用的是ab是同一个对象,但是如果改下:

     static Integer a=256;  
        static Integer b=256;   
        public static void main(String[] args) 
        {
    
            System.out.println(a==b);
            System.out.println(a.equals(b));
        }
    
    

    那么此时a==b就是false,就不是同一个对象 了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题