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

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 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真