Object的方法equals,hashCode,toString,clone。另外Comparable接口的方法
生活随笔
收集整理的這篇文章主要介紹了
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
總結
以上是生活随笔為你收集整理的Object的方法equals,hashCode,toString,clone。另外Comparable接口的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Consolidate Conditio
- 下一篇: Mockito教程--思维导图笔记