zoukankan      html  css  js  c++  java
  • JAVA里面"=="和euqals的区别

    (1)基本数据类型,用双等号“==”比较,比较的是他们的值,值类型是存储在内存中的栈中

    (2)复合数据类型中, 当他们用“==”进行比较的时候,比较的是他们在内存中的存放地址,其变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。所以只有同一个类new出来的对象比较结果为true,不同对象成员变量比较结果始终为false。

    equals操作比较两个对象存储的堆中的内容是否相同

    “==”比较的是2个对象的地址,所以当equals为true时,“==”不一定为true。

    -------------------------------------------------------------------------------------

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    这题考的是引用和内存。
    //声明了3个Square类型的变量a, b, c
    //在stack中分配3个内存,名字为a, b, c
    Square a, b, c; 
    //在heap中分配了一块新内存,里边包含自己的成员变量width值为48L,然后stack中的a指向这块内存
    a = new Square(42L);
    //在heap中分配了一块新内存,其中包含自己的成员变量width值为48L,然后stack中的b指向这块内存
    b = new Square(42L);   
    //stack中的c也指向b所指向的内存
    c = b;
    //在stack中分配了一块内存,值为42
    long s = 42L; 
    如图所示:
     
    来看4个选项:
    A: a == b
    由图可以看出a和b指向的不是同一个引用,故A错
    B:s == a
    一个Square类型不能与一个long型比较,编译就错误,故B错
    c:b == c
    由图可以看出b和c指向的是同一个引用,故C正确
    d:a equal s
    程序会把s封装成一个Long类型,由于Square没有重写Object的equals方法, 所以调用的是Object类的equals方法,源码如下
    1
    2
    3
     public boolean equals(Object obj) {
         return (this == obj);
     }
    其实就是判断两个引用是否相等,故D也错误。
     

     -----------------------------------------------------------------------------

    Integer i01=59 的时候,会调用 Integer 的 valueOf 方法,

    1
    2
    3
    4
    5
      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); }

    这个方法就是返回一个 Integer 对象,只是在返回之前,看作了一个判断,判断当前 i 的值是否在 [-128,127] 区别,且 IntegerCache 中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新的对象。

    在这里的话,因为程序初次运行,没有 59 ,所以,直接创建了一个新的对象。

    int i02=59 ,这是一个基本类型,存储在栈中。

    Integer i03 =Integer.valueOf(59); 因为 IntegerCache 中已经存在此对象,所以,直接返回引用。

    Integer i04 = new Integer(59) ;直接创建一个新的对象。

    System. out .println(i01== i02); i01 是 Integer 对象, i02 是 int ,这里比较的不是地址,而是值。 Integer 会自动拆箱成 int ,然后进行值的比较。所以,为真。

    System. out .println(i01== i03); 因为 i03 返回的是 i01 的引用,所以,为真。

    System. out .println(i03==i04); 因为 i04 是重新创建的对象,所以 i03,i04 是指向不同的对象,因此比较结果为假。

    System. out .println(i02== i04); 因为 i02 是基本类型,所以此时 i04 会自动拆箱,进行值比较,所以,结果为真。

  • 相关阅读:
    [译]async/await中使用阻塞式代码导致死锁
    C# 对象与JSON字符串互相转换的三种方式
    C# form 传参数的几个方法
    C# 跨线程调用控件的4中方法
    Task的取消
    Task总结
    一个开发10年程序员论:学习Python最正确的步骤
    阿里大神总结的Python基础知识实例,超详细
    十条Python面试题陷阱,看看你是否会中招
    Python程序员编程10大原则,请牢牢记住,避免吃亏
  • 原文地址:https://www.cnblogs.com/zedosu/p/6514640.html
Copyright © 2011-2022 走看看