Objects是Java 7新增的一个工具类,它提供了一些工具方法来操作对象,这些工具方法大多是“空指针”安全的。

Objects实现的方法如下:

在源码中Objects工具类中equals(Object,Object)是如何定义的:

 public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b));}

通过以上程序不难发现当两个对象a、b都为null时,返回的也是true,而且保证了只有在其中一个对象a 不为null的情

况下去比较对象a与对象b是否相等。通过以上方法可以避免NullPointerException的异常。

OK,我们看看以下程序:

class User {private String name;private int age;public User(String name,int age){this.name=name;this.age=age;}protected String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "name="+name+"\nage="+age;}}
public class Main {private static User user1;private static User user2;public static void main(String[] args) {System.out.println(Objects.equals(user1, user2));System.out.println(user1.equals(user2));}}

输出结果:

true
Exception in thread "main" java.lang.NullPointerException
at code2.Main.main(Main.java:37)

当user1和user2都为null时,执行Objects的equals(Object,Object)方法时得到true,当执行Object的equals(Object)时,

抛出NullPointerException异常。

接着我们来看看deepEquals(Object, Object)方法在源码中是如何定义的:

   public static boolean deepEquals(Object a, Object b) {if (a == b)return true;else if (a == null || b == null)return false;elsereturn Arrays.deepEquals0(a, b);}

在上面程序中,可以看出,如果两个对象的是相等,相等返回true,反之,判断其中一个是否为null,如果其中一个

为null的话返回false,反之执行Arrays.deepEquals0(a,b)的方法。我们看下Arrays.deepEquals0(a,b)在源码中是如何实

现的:

 static boolean deepEquals0(Object e1, Object e2) {assert e1 != null;boolean eq;if (e1 instanceof Object[] && e2 instanceof Object[])eq = deepEquals ((Object[]) e1, (Object[]) e2);else if (e1 instanceof byte[] && e2 instanceof byte[])eq = equals((byte[]) e1, (byte[]) e2);else if (e1 instanceof short[] && e2 instanceof short[])eq = equals((short[]) e1, (short[]) e2);else if (e1 instanceof int[] && e2 instanceof int[])eq = equals((int[]) e1, (int[]) e2);else if (e1 instanceof long[] && e2 instanceof long[])eq = equals((long[]) e1, (long[]) e2);else if (e1 instanceof char[] && e2 instanceof char[])eq = equals((char[]) e1, (char[]) e2);else if (e1 instanceof float[] && e2 instanceof float[])eq = equals((float[]) e1, (float[]) e2);else if (e1 instanceof double[] && e2 instanceof double[])eq = equals((double[]) e1, (double[]) e2);else if (e1 instanceof boolean[] && e2 instanceof boolean[])eq = equals((boolean[]) e1, (boolean[]) e2);elseeq = e1.equals(e2);return eq;}

先看看assert这个关键字,在Java中,assert这个关键字表示的是断言。当断言开启时(执行 java -ea AssertFoo,默认是

不开启的:java AssertFoo)以上assert的用法是,当assert后面的boolean表达式为true时,继续执行,如果为false,程

序抛出AssertionError,并且终止执行。assert除了以上用法之外还可以按下面格式使用:

assert<boolean表达式> : <错误信息表达式>;

那么它的功能是,当后面的boolean表达式为true时,继续执行,反之抛出java.lang.AssertionError,并且输出错误信

息。

以上使用assert确保了e1不为null,以免当执行到eq=e1.equsls(e2)时抛出异常,接着看到在if语句中使用到了

instanceof关键字来判断是否是同一个类的实例,如果是的话,分别执行对应if下的语句。

如果if(e1 instanceof Object[] && e2 instanceof Object[])为 true时,执行以下方法:

 public static boolean deepEquals(Object[] a1, Object[] a2) {if (a1 == a2)return true;if (a1 == null || a2==null)return false;int length = a1.length;if (a2.length != length)return false;for (int i = 0; i < length; i++) {Object e1 = a1[i];Object e2 = a2[i];if (e1 == e2)continue;if (e1 == null)return false;// Figure out whether the two elements are equalboolean eq = deepEquals0(e1, e2);if (!eq)return false;}return true;}

在程序中分别判断了两个Object数组的长度是否,相等,并通过for循环对每个对象先通过==来判断它们的地址是否

相等,否则执行deepEquals0(Object , Object)方法来判断每个对象在堆中的内容是否相等。

接着我们看看以上每个if语句后的方法:

 public static boolean equals(byte[] a, byte[] a2) {if (a==a2)return true;if (a==null || a2==null)return false;int length = a.length;if (a2.length != length)return false;for (int i=0; i<length; i++)if (a[i] != a2[i])return false;return true;}
 public static boolean equals(short[] a, short a2[]) {if (a==a2)return true;if (a==null || a2==null)return false;int length = a.length;if (a2.length != length)return false;for (int i=0; i<length; i++)if (a[i] != a2[i])return false;return true;}
 public static boolean equals(int[] a, int[] a2) {if (a==a2)return true;if (a==null || a2==null)return false;int length = a.length;if (a2.length != length)return false;for (int i=0; i<length; i++)if (a[i] != a2[i])return false;return true;}
 public static boolean equals(long[] a, long[] a2) {if (a==a2)return true;if (a==null || a2==null)return false;int length = a.length;if (a2.length != length)return false;for (int i=0; i<length; i++)if (a[i] != a2[i])return false;return true;}
public static boolean equals(char[] a, char[] a2) {if (a==a2)return true;if (a==null || a2==null)return false;int length = a.length;if (a2.length != length)return false;for (int i=0; i<length; i++)if (a[i] != a2[i])return false;return true;}
 public static boolean equals(float[] a, float[] a2) {if (a==a2)return true;if (a==null || a2==null)return false;int length = a.length;if (a2.length != length)return false;for (int i=0; i<length; i++)if (Float.floatToIntBits(a[i])!=Float.floatToIntBits(a2[i]))return false;return true;}
 public static boolean equals(double[] a, double[] a2) {if (a==a2)return true;if (a==null || a2==null)return false;int length = a.length;if (a2.length != length)return false;for (int i=0; i<length; i++)if (Double.doubleToLongBits(a[i])!=Double.doubleToLongBits(a2[i]))return false;return true;}
public static boolean equals(boolean[] a, boolean[] a2) {if (a==a2)return true;if (a==null || a2==null)return false;int length = a.length;if (a2.length != length)return false;for (int i=0; i<length; i++)if (a[i] != a2[i])return false;return true;}

现在我们可以发现,以上的方法都有一个相同点,都是判断数组的长度,以及每个元素是否相同。也就是

deepEquals0方法是对数组做深层次的比较。

我们看以下程序:

public class Main {public static void main(String[] args) {int[] i_int1=new int[]{1,2,3,4};int[] i_int2=new int[]{1,2,3,4};System.out.println(Objects.deepEquals(i_int1, i_int2));int[] i_int3=new int[]{1,2,3,5};int[] i_int4=new int[]{1,2,3,4};System.out.println(Objects.deepEquals(i_int3, i_int4));}
}

通过前面对 deepEquals0方法的介绍,可以很快的得出以上程序的结果。

输出结果为:

true
false

转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/43926545    情绪控_

Java学习笔记18相关推荐

  1. Java学习笔记18:Java_Map集合_HashMap集合_可变参数_Stream流_多线程_线程同步_生产者消费者

    文章目录 1.Map集合 1.1Map集合概述和特点[理解] 1.2Map集合的基本功能[应用] 1.3Map集合的获取功能[应用] 1.4Map集合的遍历(方式1)[应用] 1.5Map集合的遍历( ...

  2. java学习笔记12--异常处理

    java学习笔记系列: java学习笔记11--集合总结 java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 j ...

  3. java学习笔记十三

    11. 凡是继承了FilterOutputStream或FilterInputStream的类都是过滤流,也就是说他们不能直接跟目标(键盘,文件,网络等,节点流可以)数据打交道,只能包装 Intput ...

  4. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  5. Java学习笔记22:并发(2)

    Java学习笔记22:并发(2) 图源:PHP中文网 终止任务 终止线程有一种非常简单的方式:设置一个多线程共享的标记位,子线程用轮询的方式检查这个标记位,如果该标记位显示取消状态,就让子线程退出执行 ...

  6. Java学习笔记——流程控制

    Java学习笔记--流程控制 Day05 一.用户交互Scanner 1.Scanner对象 我们通过Java工具包java.util.Scanner中的Scanner类来获取用户的输入 基本语法:S ...

  7. Java学习笔记Day02

    Java学习笔记Day02 一.细化Hello程序 1.详解代码 //公有的类,叫做Hello public class Hello{//主方法public static void main(Stri ...

  8. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  9. java学习笔记---5

    IO流 I〇流概述: lO:输入/输出(Input/Output) 流:是一种抽象概念,是对数据传输的总称.也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的: ...

最新文章

  1. 向oracle中导入*.csv文件
  2. 区块链时代的拜占庭容错:Tendermint(四)
  3. POJ3268 Silver Cow Party(最短路径)
  4. 关羽在韩国有块私家地?
  5. 为什么jsp的form表单不能跳转_手把手教你实现SEM投放监控转化--表单类
  6. ads s参数拟合_数据分析--拟合
  7. E - 最长上升子序列
  8. 移动端mintUI mt-datetime-picker 组件使用详解
  9. poj 1276 Cash Machine(多重背包)
  10. Java语言中String累的总结
  11. 基于SSM的电脑商城
  12. smart原则_一百天目标达成:SMART原则
  13. SHT30温湿度传感器使用记录(AVR atmega128)
  14. 关于ajax同步状态及sucess,complete的顺序的理解
  15. 流量分类方法设计(一)——参考论文整理
  16. 博士申请 | 澳大利亚麦考瑞大学王岩教授招收机器学习方向全奖博士生
  17. OneNav一为主题魔改教程(一):优化后台新增网站时调用API却没有赋好值的BUG,以减少复制编辑工作量--一梦
  18. 【springboot错误】 Failed to instantiate [org.springframework.transaction.interceptor.BeanFactoryTransac
  19. java中instanceof的用法
  20. android开发 dts、各种接口porting

热门文章

  1. 使用 markdown-it 解析 markdown 代码(读 VuePress 三)
  2. 作业(二)—python实现wc命令
  3. vs2017通过snippet代码片断进行标准化注释
  4. ubuntu server 改变系统语言支持中文
  5. Java记录 -24- equals方法重写
  6. 根据Android架构分层推荐开发书籍
  7. 滑动换屏——Fragment
  8. 東方茸回廊 汉化补丁
  9. 2010-08-22 动漫店 员工卡缓存出现问题。
  10. Zookeeper源码解读