zoukankan      html  css  js  c++  java
  • 【重走Android之路】【番外篇】关于==和equals

    【重走Android之路】【番外篇】关于==和equals
     
    在实际的编程当中,经常会使用==和equals来判断变量是否相同。但是这两种比较方式也常常让人搞得云里雾里摸不着头脑。下面是我个人做的总结,希望能起到拨云见日的作用。
     
    【讲前普及】
    请阅读
    了解Java基本数据类型和引用数据类型
     

    1、"=="运算符

    通俗点讲,==运算符比较的是两个变量在栈中的内容是否相同。
    以a == b为例:

    1.1 如果a,b都是基本数据类型

    •     a,b不兼容,无法比较
    •     a,b兼容,比较栈内的数值
    //Code:
    int a = 1000;
    int b = 1000;
     
    //Result:
    a == b : true

    1.2 如果a为基本数据类型,b为引用类型

    •     a,b不兼容,无法比较
    •     a,b兼容,则比较的仍然是a、b在栈内的内容
    1 //Code:
    2 int a = 1000;
    3 Integer b = 1000;
    4 Integer c = new Integer(1000);
    5  
    6 //Result:
    7 a == b:true
    8 a == c:true

    1.3 如果a、b均为引用类型

    •     a、b不兼容,无法比较
    •     a、b兼容,则比较的是对象a、b在栈内保存的地址(不考虑null情况)
     1 // 简单说,就是比较a、b是否指向的是同一个实例(内存块)。
     2 Code:
     3 String a = "Test";
     4 String b = "Test";
     5 String c = new String("Test");
     6 String d = new String("Test");
     7  
     8 Integer x = 1000;
     9 Integer y = new Integer(1000);
    10 Integer z = new Integer(1000);
    11  
    12 Result:
    13 a == b:true
    14 a == c:false
    15 c == d:false
    16  
    17 x == y:false
    18 y == z:false
    19 // 上例中,"Test"被放在常量池中,对象a、b的地址均指向该常量。c和d则在堆内重新开辟内存分别存储"Test",所以c和d指向的内存地址也不相同。

     

    2、equals方法

    除去自定义的equals方法,和一些类对equals方法的特殊实现,一般情况下,equals比较的就是两个对象的实质内容是否相同。
    还以b.equals(a)为例:

    2.1 如果a、b都是基本数据类型,不可比较

    2.2 如果a为基本数据类型,b为引用类型

    •     如果a、b不兼容,则结果必为false
    •     如果a、b兼容,则比较a在栈内的数值和b在堆内存中的值是否相同
    1 //Code:
    2 int a = 1000;
    3 Integer b = 1000;
    4 Integer c = new Integer(1000);
    5  
    6 //Result:
    7 b.equals(a):true
    8 c.equals(a):true

    2.3 如果a、b均为引用类型

    •     如果a、b不是相同实例,则结果必为false
    1 //Code:
    2 Object a = new String("Test");
    3 Object b = new StringBuilder("Test");
    4 
    5 //Result:
    6 b.equals(a):false
    • 如果a、b是相同实例,则比较a、b在堆内存中的值是否相同
    //Code:
    String a = "Test";
    String b = "Test";
    String c = new String("Test");
    String d = new String("Test");
     
    Integer x = 1000;
    Integer y = new Integer(1000);
    Integer z = new Integer(1000);
     
    //Result:
    b.equals(a):true
    c.equals(a):true
    c.equals(d):true
     
    y.equals(x):true
    y.equals(z):true

    作者:Nodin
    出处:http://www.cnblogs.com/monodin
    个人博客网站:http://www.coderself.com
    关于作者:爱摄影,爱旅行,爱自由,爱生活,更要爱自己。活在当下,也在为未来打拼!
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    QT内置的ICON资源
    Spark源代码阅读笔记之MetadataCleaner
    Android API Guides---Bluetooth
    做一个WINDOWS下破解WIFI。不须要Linux抓包!
    CPU GPU设计工作原理《转》
    杭电 1280 前m大的数
    机房收费系统——报表(2)
    概览C++之const
    Android动态禁用或开启屏幕旋转工具
    shrink-to-fit(自适应宽度)
  • 原文地址:https://www.cnblogs.com/monodin/p/3841219.html
Copyright © 2011-2022 走看看