1、equals 方法和hashCode 方法实现示例:

public class EqualHashCodeTest {private boolean b;private int i;private float f;private double d;private String s;public EqualHashCodeTest() {super();}public EqualHashCodeTest(boolean b, int i, float f, double d, String s) {super();this.b = b;this.i = i;this.f = f;this.d = d;this.s = s;}//get/set方法@Overridepublic boolean equals(Object object) {if(object==null || getClass()!=object.getClass()){return false;}EqualHashCodeTest hct = (EqualHashCodeTest) object;return    b==hct.isB() &&i==hct.getI() &&0==Float.compare(f, hct.getF()) &&0==Double.compare(d, hct.getD()) && s==null ? false : s.equals(hct.getS());//虽然 null == null,但是这没有意义!所以这里返回false}@Overridepublic int hashCode() {int result = 17;result = 37*result + Boolean.valueOf(b).hashCode();result = 37*result + Integer.valueOf(i).hashCode();result = 37*result + Float.valueOf(f).hashCode();result = 37*result + Double.valueOf(d).hashCode();result = 37*result + (s==null ? 0 : s.hashCode());return result;}}

继承时,equals 方法和hashCode 方法实现示例

class ExtendEqualHashCode extends EqualHashCodeTest{private String extendName;public String getExtendName() {return extendName;}public void setExtendName(String extendName) {this.extendName = extendName;}public ExtendEqualHashCode() {super();this.extendName = "DEFAULT";}public ExtendEqualHashCode(boolean b, int i, float f, double d, String s, String name) {super(b, i, f, d, s);this.extendName = name;}/*** 父类的equals 方法会检查* 1、object 是否为null* 2、比较的两对象是否为同一 Class 对象*/@Overridepublic boolean equals(Object object) {return super.equals(object) &&extendName == null ? false : ((ExtendEqualHashCode)object).getExtendName().equals(extendName);}@Overridepublic int hashCode() {int result = super.hashCode();result = 37*result + (extendName==null?0:extendName.hashCode());return result;}}

2、toString 方法现实示例

规则:

a、对象用大括号包围 {....}

b、对象内的属性用中括号包围 [.....] ,各个属性之间用逗号分隔(,)

c、属性的表示格式为:$name=GongQiang

class PeopleForTest{private String name;private String sex;private int age;public PeopleForTest() {super();}public PeopleForTest(String name, String sex, int age) {super();this.name = name;this.sex = sex;this.age = age;}//get/set 方法@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());result = prime * result + ((sex == null) ? 0 : sex.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if( obj == null || getClass() != obj.getClass() ){return false;}PeopleForTest people = (PeopleForTest)obj;return   (age == people.age) &&stringEquals(name, people.name) && stringEquals(sex, people.sex);}private boolean stringEquals( String s1, String s2 ){return s1 == null ? false : s1.equals(s2);}@Overridepublic String toString() {String nameString = "[$name=" + name + "]";String sexString  = "[$sex=" + sex + "]";String ageString  = "[$age=" + age + "]";return "{" + nameString +","+ sexString + "," + ageString +"}";}
}

如下对象,如下toString 方法显示

PeopleForTest p = new PeopleForTest( "GongQiang", "man", 24);
System.out.println( p );
//output
{[$name=GongQiang],[$sex=man],[$age=24]}

对集合的信息打印帮助类:

public class CollectionPrintHelper {//Used for print arraypublic static <T> void printArrays( T[] array ){if( array == null ){System.out.println( "Array is null!" );return;}int index = 0;for( T e : array ){System.out.println( "[" + (index++) +"]:" + e );}}//Used for print Collectionpublic static <E> void printCollection( Collection<E> c){if( c== null){System.out.println( "Collection is null!" );return;}int index = 0;for( E e : c){System.out.println( "[" + (index++) +"]:" + e );}}//Used for print Mappublic static <K, V> void printMap( Map<K, V> map ){if( map == null ){System.out.println("Map is null!");return;}int index = 0;for( Entry<K, V> entry : map.entrySet() ){String key         = entry.getKey().toString();String value   = entry.getValue().toString();System.out.print( "[" + (index++)+ "]:");System.out.println(key + "=" + value);}}
}

3、clone 方法实现示例(实现 Cloneable 接口)

限制:对象的field 也为对象,则该field 不能声明为 final !

原因:final 域,有两种方式来初始化,1、直接赋值;2、构造时赋值

当深度克隆时,会有如下语句:

m.hireDay = (Date) hireDay.clone();

如果hireDay 声明为final ,则语法错误!

class Member implements Serializable ,Cloneable ,Comparable<Member>{private static final long serialVersionUID = 259178685941754554L;//other fields get/set method//public void setSalary(double salary) {//this.salary = salary;//}private String name;private final double salary;private Date hireDay;private String department;@Overridepublic Member clone() throws CloneNotSupportedException {Member m = (Member) super.clone();m.hireDay = (Date) hireDay.clone();return m;}@Overridepublic boolean equals(Object o) {if( o==null || getClass()!=o.getClass()){return false;}return fieldEquals(o);}private boolean fieldEquals(Object o){Member m = (Member)o;return name==null ? false : name.equals(m.getName()) &&0==Double.compare(salary, m.getSalary())  &&hireDay==null ? false : hireDay.getTime() == m.getHireDay().getTime() &&department==null ? false : department.equals(m.getDepartment());}//salary is fianl, must give it value when construct!//public Member() {//}public Member(String name ,double salary ,int year ,int month ,int day){this.name = name;this.salary = salary;GregorianCalendar calendar = new GregorianCalendar(year ,month-1 ,day);hireDay = calendar.getTime();}public Member(String name,double salary, int year ,int month ,int day ,String depart){this.name = name;this.salary = salary;GregorianCalendar calendar = new GregorianCalendar(year ,month-1 ,day);hireDay = calendar.getTime();department = depart;}public String toString(){return     "{" + "[$name="+name+ "]" +",[$salary=" + salary + "]" +",[$hireDay=" + hireDay+"]" + ",[$department="+ department + "]" +"}";}@Overridepublic int compareTo(Member member) {if (getClass() != member.getClass()) throw new ClassCastException();if(salary < member.salary)return -1;if(salary > member.salary)return 1;return 0;}
}

要正确实现某个类的 clone 方法

1、父类的 clone 方法必须都正确实现

2、类的对象域还不能声明为 final

可见 clone 方法的限制还是蛮多的,可以自定义copy 的方法:copy constructor 或 copy factory

 //copy constructorpublic Member( Member member ){this.name = member.getName();this.salary = member.getSalary();this.hireDay = new Date( member.getHireDay().getTime() );this.department = member.getDepartment();}
 //copy factorypublic static Member copy( Member member ){return new Member( member );}

4、Comparable 的 compareTo 方法

注意:子类继承父类的 compareTo 方法时,要保存比较的对称性!

因而加了一个判断,是否为同一 Class !

class ExtendMember extends Member{private static final long serialVersionUID = -2054912134719304214L;private Member secretary;private double donus;//get/set methods@Overridepublic int compareTo(Member member) {if (getClass() != member.getClass()) throw new ClassCastException();ExtendMember em = (ExtendMember) member;if(donus < em.donus)return -1;if(donus > em.donus)return 1;return 0;}@Overridepublic ExtendMember clone() throws CloneNotSupportedException {ExtendMember em = (ExtendMember) super.clone();em.setSecretary((Member)this.getSecretary().clone());return em;}@Overridepublic boolean equals(Object o) {if(!super.equals(o))return false;ExtendMember em = (ExtendMember) o;return secretary.equals(em.secretary);}public ExtendMember(String name ,double salary ,int year ,int month ,int day ,String department){super(name ,salary ,year ,month ,day ,department);secretary = null;}//保持打印信息格式public String toString(){return removeLastString(super.toString()) + ",[secretary=" + secretary +"]}";}protected String removeLastString( String str ){if( str == null ){return null;}return str.substring(0, str.length()-1);}
}

compareTo 方法与 equals 方法一致,即:(x.compareTo(y)==0) == (x.equals(y)),强烈推荐!
compareTo 方法与 equals 方法不一致,即:(x.compareTo(y)==0) != (x.equals(y))

示例如下:

public class ComparableVSEqeal {public static void main(String[] args) {BigDecimal bd1 = new BigDecimal("1.0");BigDecimal bd2 = new BigDecimal("1.00");System.out.println("bd1 equals bd2: " + bd1.equals(bd2));Set<BigDecimal> set = new HashSet<BigDecimal>();set.add(bd1);set.add(bd2);CollectionPrintHelper.printCollection(set);System.out.println("-------------------");System.out.println("bd1 compareTo bd2: " + bd1.compareTo(bd2));set = new TreeSet<BigDecimal>(set);CollectionPrintHelper.printCollection(set);}
}

输出结果:

bd1 equals bd2: false
[0]:1.0
[1]:1.00
-------------------
bd1 compareTo bd2: 0
[0]:1.0

排序时有多个项:

public int compareTo(PhoneNumber pn) {// Compare area codesif (areaCode < pn.areaCode)return -1;if (areaCode > pn.areaCode)return  1;// Area codes are equal, compare prefixesif (prefix < pn.prefix)return -1;if (prefix > pn.prefix)return  1;// Area codes and prefixes are equal, compare line numbersif (lineNumber < pn.lineNumber)return -1;if (lineNumber > pn.lineNumber)return  1;return 0; // All fields are equal
}

Object的方法equals,hashCode,toString,clone。另外Comparable接口的方法相关推荐

  1. java继承中的 equals + hashCode+toString

    [0]README 0.1)本文转自 core java volume 1, 旨在理清 equals + hashCode方法: 0.2) 特别说明: 在java中, 只有基本类型不是对象, 例如,数 ...

  2. equals, hashCode, toString方法重写,深入探究equals

    首先是超类Employee: package chapter5_inheritance.equals;import java.time.LocalDate; import java.util.Obje ...

  3. 1.3.1 Object类 equals,hashMode,toString重写, 包装类的装拆箱, 数学处理类

    &&&&&总结&&&&& 1.常用的包(熟悉) lang , util , io , net , sql ... 2.O ...

  4. 2019-9-17【Javase】object、final、实现关系、抽象类、接口、多态、UML类图

    文章目录 Object类 1.equals() hashCode():hash算法 toString(): 一.final 修饰: 类 ,方法,变量: 类: 此类不能被继承: 方法:不能被重写: 变量 ...

  5. java新特性-函数式接口-作为方法参数-作为方法的返回值-常用函数式接口-Supplier-Consumer-Predicate-Function

    文章目录 函数式接口 概念 函数式接口作为方法参数 函数式接口作为方法的返回值 常用函数式接口 Supplier接口 常用函数式接口 Consumer 函数式接口之 Predicate接口 常用接口之 ...

  6. 函数式接口作为方法的返回值

    需求描述 定义一个类(ComparatorDemo),在类中提供两个方法 一个方法是:Comparator<String> getComparator() 方法返回值Comparator是 ...

  7. 函数式接口作为方法的参数案例

    使用Lambda作为参数和返回值 如果抛开实现原理不说,Java中的Lambda表达式可以被当作是匿名内部类的替代品.如果方法的参数是一个函数式接口类型,那么就可以使用Lambda表达式进行替代.使用 ...

  8. 【JDK8 新特性2】JDK 8 接口默认方法/静态方法

    目录 1.接口默认方法 1.1 接口默认方法的定义格式 1.2 接口默认方法的使用 1.2.1 实现类直接调用接口默认方法 1.2.2 实现类重写接口默认方法 2.接口静态方法 2.1 接口静态方法的 ...

  9. java定义接口的方法_java定义接口的方法

    java定义接口的方法 发布时间:2020-06-28 13:50:49 来源:亿速云 阅读:103 作者:Leah 本篇文章为大家展示了java定义接口的方法,代码简明扼要并且容易理解,绝对能使你眼 ...

最新文章

  1. 05 | REST消息通信:如何使用 OpenFeign 简化服务间通信
  2. mongodb mongoose 常用操作符号 整理
  3. java 合并流(SequenceInputStream)
  4. android5.1禁用通知栏,android-阻止通知栏
  5. xUtils 中的BitmapUtils 全面注释
  6. 【MySQL】2、MySQL 创建数据库和表
  7. ubuntu添加windows字体
  8. 同济大学高等数学下册第八章向量代数与空间解析几何以及每日一题
  9. linux系统安装爱快,ESXi安装爱快iKuai OS路由(图文教程)
  10. php 将中文字符转英文字母_php中怎么将中文转换拼音
  11. vue实战优化 打包后 vender文件过大问题
  12. NodeJs C++ addon(插件nan方式)
  13. QT从入门到入土(三)——信号和槽机制
  14. 手写redis@Cacheable注解 支持过期时间设置
  15. 抖音短视频流量获取攻略,掌握好这些一定可以出爆款
  16. Redis(十一) -- Redis数据结构(八) -- Geo
  17. Linux 环境部署|Anaconda及Tensorflow
  18. 阅读笔记 |《科学史和科学哲学导论》舒斯特
  19. springboot 中动态切换数据源(多数据源应用设计)
  20. 逃离贼船?新方舟需要我们去创造。

热门文章

  1. 论文浅尝 | 一种用于新闻推荐的深度知识感知网络
  2. 干货 | 机器学习算法在饿了么供需平衡系统中的应用
  3. 50个数据可视化最有价值的图表(附完整Python代码,建议收藏
  4. 自然语言处理语言资源项目
  5. 【LeetCode】4月3日打卡-Day19-字符串转整数
  6. 介绍一些知识图谱的实际应用类项目
  7. 多页面webpack配置
  8. UVA11427概率期望+独立重复事件
  9. table数据表 边框特效
  10. PowerDesigner-快速入门(极简教程)