摘要:好用的类在中,新增了一个工具类,就是类。事实上,我们进行比较的对象,除了引用对象之外,就是自动装箱后等类型了。我们在重写时,可以参考上面的类的写法。
好用的java.util.Objects类
在jdk1.7中,新增了一个工具类,就是java.util.Objects类。它有3个简单的封装方法,对于平常的使用来说挺有用的,分别是:hashCode、equals、toString这3个方法。
1、hashcode生成// 1. Objects.hash(Object... values) public static int hash(Object... values) { return Arrays.hashCode(values); } // 2. Arrays.hashCode(Object a[]) public static int hashCode(Object a[]) { if (a == null) return 0; int result = 1; for (Object element : a) result = 31 * result + (element == null ? 0 : element.hashCode()); return result; } // 3. Object.hashCode() public native int hashCode();
首先,Objects的hash方法接收可变参数,可变参数的内部是一个数组。然后内部调用Arrays的hashCode方法,我们来看一下其方法:核心是遍历每一个参数来计算result值,在计算的过程中,每一个参数上转型为Object使用hashCode来生成随机值。那么Object的hashCode又是什么?这是一个本地方法,源码不给出实现,其数值和对象的内存地址有关。
参数虽然上转型为Object,但是对于String、Integer等对象类型,它们都重写了hashCode方法。2、对象equals比较因为是基于内存地址的生成,所以不同对象生成的hashcode值冲突的几率是很小的。
// 1. Objects.equals(Object a, Object b) public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } // 2. Object.equals(Object obj) public boolean equals(Object obj) { return (this == obj); }
首先是对象的引用判断,其次就是调用对象自身的equals方法来比较,如果对象类型没有重写equals的话,就会调用Object的equals方法(仍然是对象的引用比较)。
hashCode与equals方法的重要性事实上,我们进行equals比较的对象,除了引用对象之外,就是String、Integer(自动装箱后)等类型了。
对于String,直接进行引用比较。而对于Integer、Double等对象类型,它们都重写了equals方法,贴出Integer的equals方法:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }可以看到,内部是进行值相等判断。
对于散列结构(hash)的集合类型,比如说HashMap、HashSet等,如果我们用它们来存储我们自定义的对象,那么我们就必要重写类的hashCode与equals方法。为什么要重写,这个原因就不赘述了。 还有Set集合类,由于它存储不重复的元素。
下面我们给出利用Objects工具类的一种较为简单实用的重写方式:
public class Building { private String name; private double area; @Override public int hashCode() { return Objects.hash(name, area); } @Override public boolean equals(Object obj) { // 引用相等判断 if (obj == this) { return true; } // 类型判断 if (!(obj instanceof Building)) { return false; } Building building = (Building) obj; // 关键域相等判断 // 基本类型不要用用Objects.equals()方法,会自动装箱带来额外开销 return Objects.equals(name, building.name) && (area == building.area); } @Override public String toString() { return Objects.toString("name = " + name, "name is undefined") + ", " + Objects.toString("area = " + area, "area is undefined"); } // setter、getter }3、toString
我们自己重写toString方法时,有一点比较难写,就是默认值设置。
// Objects.toString(Object o, String nullDefault) public static String toString(Object o, String nullDefault) { return (o != null) ? o.toString() : nullDefault; } // Objects.toStirng(Object 0) public static String toString(Object o) { return String.valueOf(o); }
我们在重写toString时,可以参考上面的Building类的写法。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76704.html
摘要:在学习的源码过程中我遇到了一些有趣有用的方法,在此之前如果要使用这些工具方法,我首先会想到的是和这样的语言扩展包,但现在如果是写一些,使用原生即可达到目的。 在学习JDK的源码过程中我遇到了一些有趣有用的方法,在此之前如果要使用这些工具方法,我首先会想到的是commons-lang和guava这样的语言扩展包,但现在如果是写一些demo,使用原生即可达到目的。当然我们也不能否认它们的作...
摘要:时间年月日星期六说明本文部分内容均来自慕课网。慕课网教学源码学习源码第一章概述课程简介本课程是在之前的初识微信公众号开发课程基础之上的。慕课网课程涵盖前端开发等前沿技术语言,包括基础课程实用案例高级分享三大类型,适合不同阶段的学习人群。 时间:2017年08月12日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:http://img.m...
摘要:类是日期时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换也就是可以在对象与对象之间进行来回转换。构造方法由于为抽象类,不能直接使用,所以需要常用的子类。 day01【Object类、常用API】 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 教学目标 -[ ] 能够说出...
摘要:时间年月日星期二说明本文部分内容均来自慕课网。慕课网教学源码学习源码第一章观察者模式概述课程简介观察者模式的定义定义对象间的一种一对多的依赖关系。 时间:2017年08月29日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源码:https://github.com/z...
摘要:存储自定义类型键值集合保证是唯一的作为的元素必须重写方法和方法以保证唯一存储自定义类型键值类型类就必须重写方法和方法以保证唯一类型可以重复创建集合往集合中添加元素女王英国秦始皇秦国普京俄罗斯女王毛里求斯使用和增强遍历集合存储自定义类型键 package com.itheima.demo02.Map; import java.util.HashMap;import java.util.M...
阅读 956·2023-04-25 23:50
阅读 1958·2021-11-19 09:40
阅读 601·2019-08-30 13:50
阅读 2729·2019-08-29 17:11
阅读 1043·2019-08-29 16:37
阅读 2987·2019-08-29 12:54
阅读 2794·2019-08-28 18:17
阅读 2637·2019-08-26 16:55