DESKTOP-F6K5GEP_20200828-崔婧涓

一、问题

hashCode()与identiyhashCode() 有什么区别?

解决

private String type ;

public Birds(String type) {
    super();
    this.type = type;
}

@Override
public String toString() {
    // 通过super调用父类Object的toString方法
    System.out.println( super.toString() );
    return "Birds[type=" + type + "]";
}

@Override
public int hashCode() {
    
    int hash = super.hashCode();
    System.out.println( "object hashcode : " + hash );
    
    final int prime = 31;
    int result = 1;
    result = prime * result + ((type == null) ? 0 : type.hashCode());
    return result;
}

@Override
public boolean equals( Object o ) {
    if( o != null ) {
        // o instanceof Birds 判断不严谨
        // 因为 o 如果是 Birds 子类类型的对象时,o instanceof Birds 也返回true
        if( this.getClass() == o.getClass() ) {
            Birds b = (Birds)o;
            return this.type.equals( b.type ) ;
        }
    }
    return false;
}

​ 测试:

public static void main(String[] args) {
    
    Birds b = null ;
    System.out.println( b );// b == null ? "null" : b.toString()
    
    b = new Birds( "候鸟" ); ;
    System.out.println( b );
    
    System.out.println( b.hashCode() );
    System.out.println( System.identityHashCode( b ) );
    
}

运行结果:

null
object hashcode : 1562557367
com.itlaobing.hashcode.Birds@a5145
Birds[type=候鸟]
object hashcode : 1562557367
676165
1562557367

得出结论:

hashCode() 是继承了Object重写后的方法,可以改写重写后的hashCode()方法。

identiyhashCode() 是由c和c++编写的来自Object本身的方法,不可以改写。无论子类是否重写hashCode()方法,它都会返回Object默认的哈希码值。

所以用identiyhashCode()比较严谨。

二、吐槽

今天老韩说的内容都很清楚,就是有一点点“啰嗦”,没什么可吐槽的。

标签

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1