Java成长记 hashCode

     前几天写了一篇博客,这两天又琢磨了一下,感觉写的还是不够简洁,hashCode作为散列码,或者也可以称为哈希码,其实并没有我一直想的那么神奇。通过一个简单的例子我们来说说hashCode的那些事。

    首先看一段代码:

public class Test {
	public static void main(String[] args) {
		A a1 = new A("a1");
		A a2 = new A("a1");
		System.out.println(a1.hashCode()+"   "+a2.hashCode());
	}
}

class A {
	String name;
	
	public A(String name){
		this.name = name;
	}
	
}
实例化两个对象a1、a2,最后的输出值为“851664923    953853606”,可以很明显的看到a1和a2的散列值不同,为什么呢??我们一直听到一个说法,就是hashCode可以唯一标识一个对象,是这样么?

    我们都知道java中所有的类有一个共同的父类Object,查看他的源代码我们可以发现,Object中就存在hashCode()方法,他的返回值是对象的内存地址。因为A没有父类,所以他直接继承了Object,因为a1和a2是new的不同的对象,有不同的内存地址,所以哈希值当然不同。

    我们给A加上一段代码:

//重写hashCode()方法
	@Override
	public int hashCode() {
		return name.hashCode();
	}
     重新编译程序,输出结果为"3056   3056",相同,这是为什么呢???难道是因为a1和a2的name值相同,我们点击查看String类的源代码,可以发现String类也重写了hashCode()方法,String类型对象的散列值是依据内容的,内容相同散列值就想同。即name值相同,所以此时的哈希值相同。由此我们可以知道,我们一直认为hashCode可以唯一标识一个对象,这个说法是不准确的,要看 对象对应的类是否重写了hashCode()方法。所有的包装器类也都重写了hashCode()方法。这就是hashCode()散列值。

    但上式存在一个问题,那就是我们实例化对象时name是可以输入null的,现在试试就会发现程序报NullPointerException空指针异常,因为null没有散列值。所以我们要借助与Objects这个类,通过Objects.hashCode(xx)这个方法,当为null时会返回0。如果存在多个参数我们还可以使用Objects.hash(Object... values);这个静态方法。

    其实hashCode就是这么简单,Object这个父类存在好几个方法,包括toString(),equals(),也会经常被重写,只要稍微钻研一下源码,就会感觉java语言这个设计确实很奇妙,也不知道怎么想出来的,赞一个。所以我还是学的太浅薄了,要多学习,多钻研。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值