• Java 中 == 和 equals 的区别


      有一段时间,== 和 equals 的区别一直困扰着我。因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解。

      == 和 equals 最大的区别就是  它们对比的东西不一样,前者对比的是 栈的一个地址。后者对比的是  栈中的值。不知道我这样说对不对,如果不对的话请指教,谢谢。

            String a = "1";
            String b = "1";
            String c = new String("1");
            System.out.println(a==b);
            System.out.println(a.equals(b));
            System.out.println(a==c);
            System.out.println(a.equals(c));  

      上面这段代码的输出是 true true false true

      这样的结果和我的理解相同,首先 声明一个变量 a 并赋值为 "1",在赋值的过程中,程序首先回去String缓冲池中寻找是否有"1"存在,如果发现没有,则新建一个。这时候,

      声明了一个变量b,也赋值为"1" ,这时候String缓冲池中有"1",那么这时,b也指向了缓冲池中"1"的地址。这时,变量a和变量b就指向了同一个地址。所以前面两个判断都是

      true。在声明第三个变量c的时候,程序写到新建一个存放"1"的内存空间,之前的那个变量c不要了。这时内存空间中就有两个存储"1"的地址,存储的地址不一样,但是值相同,

      这就造成了 第三个输出语句为false,第四个为true。不得不说的是,变量c的做法很浪费,在实际开发过程中很少用到。最起码我没用到过,当然,可能是我资历还是不足。

      这里,在用两个很形象的比喻来区别 == 和 equals  。   现在我要去肯德基吃午饭,三个同事a,b,c给了我三个不同的路线,于是按照这三条路线我都走了一遍,发现 a和b同事虽然

      给了我不同的路线,但是按照路线走下来却是同一家KFC,c同事的路线走下来也是KFC,但是和之前的KFC不是同一家。结果我吃的都是KFC,但是a同事和b同事给的地址是同一家

      KFC,c同事则是另一家KFC。

      上面这个例子中,吃的是KFC  代表的是值,KFC的地址代表 内存中的地址。虽然吃的都是KFC,但是不是同一家店就对应代码中的虽然值相同,但值在内存中的地址不同,而变量

      指向的地址也不同,这时候用==判断值是否相等的话就会出现错误。

      

  • 相关阅读:
    am335x gpio控制
    递归删除子目录下所有.la后缀文件
    linphone 在am335x的编译过程
    linphone 调试信息
    【POJ 3020】Antenna Placement(二分图匹配)
    【POJ 1062】昂贵的聘礼(最短路)
    【POJ 2485】Highways(Prim最小生成树)
    【Gym 100947E】Qwerty78 Trip(组合数取模/费马小定理)
    解决already defined in .obj 的问题(定义/声明的区别)
    C语言+SDL2 图形化编程
  • 原文地址:https://www.cnblogs.com/hongcong/p/5675291.html
Copyright © 2020-2023  润新知