当前位置: 首页 > 面试题库 >

Java null.equals(对象o)

闻人志
2023-03-14
问题内容

我知道不可能在这样的空对象上调用equals方法:

//NOT WORKING
            String s1 = null;
            String s2 = null;
            if(s1.equals(s2))
            {
                System.out.println("NOT WORKING :'(");
            }

但就我而言,我想比较两个数据库中的两个对象,这两个对象的属性可以为null …

那么,知道我们不确定该值是否为null或填充后,比较两个属性的方法是什么。

这个方法好不好?

//WORKING
            String s1 = "test";
            String s2 = "test";
            if(s1 == s2 || s1.equals(s2))
            {
                System.out.println("WORKING :)");
            }

            //WORKING
            String s1 = null;
            String s2 = null;
            if(s1 == s2 || s1.equals(s2))
            {
                System.out.println("WORKING :)");
            }

我不确定,因为在这种情况下它不起作用…:

//NOT WORKING
            String s1 = null;
            String s2 = null;
            if(s1.equals(s2)|| s1 == s2  )
            {
                System.out.println("NOT WORKING :'''(");
            }

问题答案:

我通常使用我编写的静态实用程序函数equalsWithNulls来解决此问题:

class MyUtils {
  public static final boolean equalsWithNulls(Object a, Object b) {
    if (a==b) return true;
    if ((a==null)||(b==null)) return false;
    return a.equals(b);
  }
}

用法:

if (MyUtils.equalsWithNulls(s1,s2)) {
  // do stuff
}

这种方法的优点:

  • 在单个函数调用中解决了完全相等性测试的复杂性。我认为这比每次执行此操作时在代码中嵌入一堆复杂的布尔测试要好得多。结果导致错误的可能性要小得多。
  • 使您的代码更具描述性,因此更易于阅读。
  • 通过在方法名称中明确提及空值,您可以向读者传达他们应该记住的一个或两个参数可能为空值。
  • 首先进行(a == b)测试吗(一种优化方法避免了在a和b为非空但引用完全相同的对象这一相当普遍的情况下无需调用a.equals(b)的情况)


 类似资料:
  • 问题内容: 问题在于确定以下符号之间的权衡: 基于JSON : 基于数组 : 关于同一问题的这篇文章,我已经决定(在前端)使用JSON对象表示法而不是对象数组,因为它符合我的要求,更好的性能和更少的浏览器代码。 但是问题在于列表本身不是静态的。我的意思是,该列表正在生成,即从DB(NoSQL)获取/存储,并通过服务器上的JavaAPI为新条目创建。我无法决定在后端应使用哪种表示法(最终也会影响UI

  • File 对象 File 对象代表一个文件,用来读写文件信息。它继承了 Blob 对象,或者说是一种特殊的 Blob 对象,所有可以使用 Blob 对象的场合都可以使用它。 最常见的使用场合是表单的文件上传控件(<input type="file">),用户选中文件以后,浏览器就会生成一个数组,里面是每一个用户选中的文件,它们都是 File 实例对象。 // HTML 代码如下 // <input

  • URL 是互联网的基础设施之一。浏览器提供了一些原生对象,用来管理 URL。 Location 对象 Location对象是浏览器提供的原生对象,提供 URL 相关的信息和操作方法。通过window.location和document.location属性,可以拿到这个对象。 属性 Location对象提供以下属性。 Location.href:整个 URL。 Location.protocol:

  • ArrayBuffer 对象 ArrayBuffer 对象表示一段二进制数据,用来模拟内存里面的数据。通过这个对象,JavaScript 可以读写二进制数据。这个对象可以看作内存数据的表达。 这个对象是 ES6 才写入标准的,普通的网页编程用不到它,为了教程体系的完整,下面只提供一个简略的介绍,详细介绍请看《ES6 标准入门》里面的章节。 浏览器原生提供ArrayBuffer()构造函数,用来生成

  • window.navigator属性指向一个包含浏览器和系统信息的 Navigator 对象。脚本通过这个属性了解用户的环境信息。 Navigator 对象的属性 Navigator.userAgent navigator.userAgent属性返回浏览器的 User Agent 字符串,表示浏览器的厂商和版本信息。 下面是 Chrome 浏览器的userAgent。 navigator.user

  • Table of Contents Objects 对象 Prefilters 预过滤器 Postfilters 后过滤器 Output Filters 输出过滤器 Cache Handler Function 缓冲处理函数 Resources 资源 Smarty allows access to PHP objects through the templates. There are two w

  • 表示邮件合并操作中的邮件合并数据源。 使用 OfficeDataSourceObject 对象 要使用 OfficeDataSourceObject 对象,请声明一个 OfficeDataSourceObject 对象的变量。然后即可使用该对象相关的不同属性和方法。使用 SetSortOrder 方法指定如何排序数据源中的记录。本示例首先对数据源按邮政编码降序排序,然后再按姓名升序排序。 Sub

  • 表示应用于附加到邮件合并发布内容的数据源的所有筛选。ODSOFilters 对象由 ODSOFilter 对象组成。 使用 ODSOFilters 对象 使用 ODSOFilters 对象的Add 方法在查询中新添一个筛选条件。本示例在查询字符串中添加一行,然后将合并的筛选应用于数据源。 Sub SetQueryCriterion() Dim appOffice As OfficeData