Object的方法equals,hashCode,toString,clone。另外Comparable接口的方法

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
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

走近“颠覆性技术”:量子通信能否取代传统通信?

来源&#xff1a;人民日报 概要&#xff1a;近些年来&#xff0c;量子通信技术的飞跃发展正让梦想成为现实。   制图&#xff1a;张芳曼 打个电话&#xff0c;会不会被窃听&#xff1f;通过网络传送一份保密文件&#xff0c;途中被他人窃取咋办……现代社会&#xff0c;信息…

oracle 行级死锁_解决Oracle数据库死锁

介绍本文我们尝试总结在多个用户并发情况下&#xff0c;如何识别和解决删除操作期间发生的死锁问题&#xff0c;在开始之前&#xff0c;我们先简单描述一下什么是死锁以及什么东西会导致死锁。死锁在任何数据库中发生死锁都是不愉快的&#xff0c;即使是在一个特殊的情况下发生…

map集合的常用方法和遍历

概念&#xff1a; 现实生活中&#xff0c;我们常会看到这样的一种集合&#xff1a;IP地址与主机名&#xff0c;身份证号与个人&#xff0c;系统用户名与系统用户对象等&#xff0c;这种一一对应的关系&#xff0c;就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对…

麻省理工和 IBM 合作创立 Watson AI 实验室,谨慎推进 AI 研究

来源&#xff1a;36氪 概要&#xff1a;目前&#xff0c;AI 正在迅速成为现代科技的一个重点&#xff0c;并且它对我们日常生活的重要性在未来几年只会不断增加。 2017 年 9 月&#xff0c;IBM 宣布与麻省理工学院&#xff08;MIT&#xff09;建立为期十年的合作伙伴关系&#…

seqkit根据基因id_Microwell-Seq

Microwell-Seq技术&#xff0c;高通量单细胞RNA测序技术的创新High-throughput Single Cell RNA-Seq每个细胞都是独一无二的&#xff0c;但我们的研究对象往往是细胞群体&#xff0c;忽略了这些细胞之间的异质性。正因如此&#xff0c;单细胞基因组学研究受到了越来越多的关注。…

List和Set集合使用

Java提供的众多集合类由两大接口衍生而来&#xff1a;单列集合Collection和双列集合Map Collection接口 Collection接口是所有单列集合的父接口 &#xff0c;每次储存一个元素&#xff0c;接口的主要方法包括&#xff1a; public boolean add(E e) : 把给定的对象添加到当前…

Andrej Karpathy发文谈神经网络后,引发的对硬件,软件和学件的思考

作者&#xff1a;岑峰 概要&#xff1a;近日&#xff0c;Tesla AI总监Andrej Karpathy发表了一篇关于“Software 2.0”的文章&#xff0c;该文章引发了对未来神经网络的编程方式的更深入探讨&#xff0c;本文就是其中之一。 近日&#xff0c;Tesla AI总监Andrej Karpathy发表了…

pythonui自动化测试脚本实战_Python UI自动化测试实战 Zero to Hero Se

1.Selenium介绍Selenium是用于测试Web应用程序的可移植框架。Selenium提供了一种回放工具&#xff0c;用于编写功能测试&#xff0c;而无需学习测试脚本语言(Selenium IDE)。它还提供了一种特定于测试领域的语言(Selenese)&#xff0c;可以用多种流行的编程语言编写测试&#x…

异常与断言

1、接口方法声明异常与实现类方法声明异常的关系 2、异常链——示例 3、try-catch-finally 推荐组织结构&#xff0c;及其缺陷 4、断言 ----------------------------------------------------------------------------------------------- 1、接口方法声明异常与实现类方法…

2019年《自然》迎新子刊:机器智能、新陈代谢和综述物理

来源&#xff1a;Nature自然科研微信公众号 概要&#xff1a;过去十年&#xff0c;人工智能和机器人学背后的技术已取得巨大飞跃&#xff0c;并带来各种精彩应用&#xff0c;如无人驾驶汽车、人工智能引导的医学诊断、智能数字家庭助手等。 《自然-机器智能》将发表和报道人工智…

hdfs 备份数配置_大数据||HDFS HA配置详解

根据HA架构图&#xff0c;规划HA的分布式集群服务器HA集群规划配置参考图根据官方文档配置HA部分说明Architecture在典型的ha集群中&#xff0c;两台独立的机器被配置为namenode。在任何时间点&#xff0c;一个namenodes处于活动状态&#xff0c;另一个处于备用状态。活动NameN…

如何保证添加自定义对象元素的唯一性

以图书管理系统为例 1、首先自定义一个图书类Book&#xff0c;自定义变量id&#xff0c;name&#xff0c;auther&#xff0c;price并重写getset()&#xff0c;toString()方法&#xff0c;此处具体代码省略。 2、再自定义一个管理图书类Manage&#xff0c;在管理类中先定义一个…

未来货运:无人驾驶技术和卡车司机如何配合?

来源&#xff1a;厚势 概要&#xff1a;看看你的周围。你看到的几乎所有东西都经过了卡车运输&#xff0c;无论是咖啡豆&#xff0c;还是你在使用的手机。 特斯拉刚刚发布了电动卡车&#xff0c;其实很多公司都对这一运输工具都在研究革新。Uber 本周&#xff08;17.11.18&…

bat脚本如何自动输入y_在Mac如何写一个相对自动的翻译脚本

近来使用的google翻译的插件有些不稳定&#xff0c; 时灵时不灵的&#xff0c;无奈的使用百度翻译了&#xff0c; 感觉体验也不好&#xff0c; 就想自己写一个翻译的脚本。整体思路简单&#xff0c; 就是调用百度翻译api再将结果呈现出来&#xff0c; 最后使用alias链接一下。大…

RefFieldMethodDetails——查看类的域和方法

RefFieldMethodDetails&#xff0c;通过反射机制查看类的域和方法&#xff08;包括编译器添加的“桥方法”&#xff09; public class RefFieldMethodDetails {/*** 打印出指定类的* 1、声明的所有构造方法&#xff08;包括私有&#xff09;* 2、声明的所有方法&#xff08;包括…

如何将对象中的内容按照一定的顺序进行排序

1、比较comparable和comparator&#xff0c;选择正确的方法进行排序 Comparable&#xff1a;强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序&#xff0c;类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次&#xff0c;不能经常修…

it 部门的建议_应对IT项目阻力的8个建议

点击上方“蓝色字体”&#xff0c;选择 “设为星标”关键讯息&#xff0c;D1时间送达&#xff01;大多数IT主管表示&#xff0c;有关抵触进行坦率的对话有助于产生新信息&#xff0c;从而最终推动项目向前发展。而且&#xff0c;在某些情况下&#xff0c;阻力是由于对需要进行路…

科学家首次在野外直接观察到雀类新物种的快速形成

来源&#xff1a;与峰同行博客 概要&#xff1a;新物种是怎么形成的&#xff1f;这是生物学上最根本的问题之一。大致听说过进化论的人可能都知道&#xff0c;地球上我们现在看到的各种各样的生物都是由最初的单细胞经过亿万年的进化而来的。 科学家首次在野外直接观察到雀类新…

java中的字符,字符串,数字之间的转换

java中的字符&#xff0c;字符串&#xff0c;数字之间的转换 string 和int之间的转换 string转换成int :Integer.valueOf(" “) int转换成string : String.valueOf(int i ) 或者Integer.toString(int i) 或者i” “//i为int类型 其中三者的效率为&#xff1a;Integer.toS…

查看某个分区之前所有的数据_腾讯大数据面试真题汇总

腾讯面试题学长11&#xff09;笔试部分&#xff08;1&#xff09;有一表名t_sh_mtt_netdisk_log&#xff0c;从表名可以看出该表是什么业务的&#xff0c;是什么周期粒度的表。&#xff08;2&#xff09;怎么查看表结构&#xff0c;表创建语句&#xff1f;怎么查看表有哪些分区…