一、值是null的情况:

1.a.equals(b), a 是null, 抛出NullPointException异常。

2.a.equals(b), a不是null, b是null,  返回false

3.Objects.equals(a, b)比较时, 若a 和 b 都是null, 则返回 true, 如果a 和 b 其中一个是null, 另一个不是null, 则返回false。注意:不会抛出空指针异常。

null.equals("abc")    →   抛出 NullPointerException 异常  
"abc".equals(null)    →   返回 false  
null.equals(null)     →   抛出 NullPointerException 异常

Objects.equals(null, "abc")    →   返回 false  
Objects.equals("abc",null)     →   返回 false  
Objects.equals(null, null)     →   返回 true

二、值是空字符串的情况:

"abc".equals("")    →   返回 false  
"".equals("abc")    →   返回 false  
"".equals("")       →   返回 true

Objects.equals("abc", "")    →   返回 false  
Objects.equals("","abc")     →   返回 false  
Objects.equals("","")        →   返回 true

三、源码分析

public final class Objects {  
    private Objects() {  
        throw new AssertionError("No java.util.Objects instances for you!");  
    }  
   
    /**  
     * Returns {@code true} if the arguments are equal to each other  
     * and {@code false} otherwise.  
     * Consequently, if both arguments are {@code null}, {@code true}  
     * is returned and if exactly one argument is {@code null}, {@code  
     * false} is returned.  Otherwise, equality is determined by using  
     * the {@link Object#equals equals} method of the first  
     * argument.  
     *  
     * @param a an object  
     * @param b an object to be compared with {@code a} for equality  
     * @return {@code true} if the arguments are equal to each other  
     * and {@code false} otherwise  
     * @see Object#equals(Object)  
     */  
    public static boolean equals(Object a, Object b) {  
        return (a == b) || (a != null && a.equals(b));  
    }

2.说明

首先,进行了对象地址的判断,如果是真,则不再继续判断。

如果不相等,后面的表达式的意思是,先判断a不为空,然后根据上面的知识点,就不会再出现空指针。

所以,如果都是null,在第一个判断上就为true了。如果不为空,地址不同,就重要的是判断a.equals(b)。

四、“a==b”和”a.equals(b)”有什么区别?

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true。

而 a.equals(b) 是进行逻辑比较,当内容相同时,返回true,所以通常需要重写该方法来提供逻辑一致性的比较

a.equals(b) 判断对象相等的更多相关文章

  1. scala 判断对象相等/equals

    package scala_enhance.scalaextends import scala.collection.mutable.HashMap /** * scala中判断对象相等 * 原则: ...

  2. Java中判断对象是否为空的方法

    首先来看一下工具StringUtils的判断方法:    一种是org.apache.commons.lang3包下的:    另一种是org.springframework.util包下的.这两种S ...

  3. java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...

  4. 深入Java虚拟机--判断对象存活状态

    程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...

  5. js中判断对象具体类型

    大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...

  6. java虚拟机判断对象是否存活的方式

    引用计数算法:   给对象添加一个引用计数器,每当有地方应用时,计数器值就加一,当引用失效时,程序计数器就减一,只要引用计数器的值为零时,就表示对象不可能再被引用,例如微软的 component ob ...

  7. 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法

    获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...

  8. JavaScript中判断对象类型方法大全1

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  9. freemarker判断对象是否为空

    freemarker中显示某对象使用 ${name}.   但如果name为null,freemarker就会报错.如果需要判断对象是否为空: <#if name??> …… </# ...

随机推荐

  1. CAD简介

    Computer-aided design (CAD) is the use of computers (or workstations) to aid in the creation, modifi ...

  2. Netty之ByteBuf

    本文内容主要参考<<Netty In Action>>,偏笔记向. 网络编程中,字节缓冲区是一个比较基本的组件.Java NIO提供了ByteBuffer,但是使用过的都知道B ...

  3. C++ 德才论

    输入样例: 14 60 80 10000001 64 90 10000002 90 60 10000011 85 80 10000003 85 80 10000004 80 85 10000005 8 ...

  4. linux 挂载本地iso

    mount -t iso9660 -o loop /mnt/temp/rhel-server-6.5-i386-dvd.iso /mnt/cdrom -t :设备类型 iso9660是指CD-ROM光 ...

  5. awk的基本用法

    最近遇到导入的csv文件首行为日期,但需要将日期作为列导入到数据库中,直接使用ctl文件好像无法实现,了解到awk这个强大的命令. 导入的CSV文件除了首行为日期,其他的都是格式相同的.需要将首行单独 ...

  6. Android 高级UI组件(二)

    1.ExpandableListView 显示垂直滚动两级列表的条目,只允许两个层次 整体思路: 要给ExpandableListView设置适配器,那么必须先设置数据源. 数据源,就是此处的适配器类 ...

  7. Linux基础命令---mirror获取ftp目录

    mirror 使用lftp登录ftp服务器之后,可以使用mirror指令从服务器获取目录   1.语法       mirror [OPTS] [source [target]]   2.选项列表 选 ...

  8. File类及常用操作方法

    import java.io.File; import java.io.IOException; public class file { public static void main(String[ ...

  9. 程序员Meme 第01期

  10. [BUUCTF]PWN——pwnable_start

    pwnable_start 附件 步骤: 例行检查,32位程序,什么保护都没开,首先想到的是ret2shellcode的方法 本地试运行一下,看看程序大概的情况 32位ida载入,没法f5,好在汇编不 ...