在面试的时候不少时候会问到“==”和equals()对于不少人来讲都已经很了解了,对于我来讲彷佛和新的知识点同样。下面就来分析一下:java
2.“equals()”面试
在做对象内容进行比较的时候显然“==”是不行的,因此equals()方法随之诞生了。 在基类Object中有方法equals()实现方式,此刻比较的仍然是内存地址: public boolean equals(Object paramObject) { return (this == paramObject); } 在封装的对象类型不少都已经重写了Object中equals方法那么简单看两个: String类中的:函数
public boolean equals(Object paramObject) { if (this == paramObject) return true; if (paramObject instanceof String) { String str = (String) paramObject; int i = this.count; if (i == str.count) { char[] arrayOfChar1 = this.value; char[] arrayOfChar2 = str.value; int j = this.offset; int k = str.offset; while (i-- != 0) if (arrayOfChar1[(j++)] != arrayOfChar2[(k++)]) return false; return true; } } return false; }
String类中的equals()方法首先比较的是内存地址,而后是字符串长度,而后逐个字符进行比较。 Integer类中:this
public boolean equals(Object paramObject) { if (paramObject instanceof Integer) return (this.value == ((Integer) paramObject).intValue()); return false; }
此刻比较的也是内容,因此当咱们建立类的时候,对象作比较的时候须要重写equals方法,由于通常若是使用java中的Map对象进行存储时,他会自动调用hashCode方法来比较两个对象是否相等。设计
3.“hashcode()”code
因此若是咱们对equals方法进行了重写,建议必定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不一样的对象返回不一样的hash值。重写hashcode()方法的目的是提升查找效率。 设计hashCode()时最重要的因素就是:不管什么时候,对同一个对象调用hashCode()都应该产生一样的值。若是在讲一个对象用put()添加进HashMap时产生一个hashCdoe值,而用get()取出时却产生了另外一个hashCode值,那么就没法获取该对象了。因此若是你的hashCode方法依赖于对象中易变的数据,用户就要小心了,由于此数据发生变化时,hashCode()方法就会生成一个不一样的散列码。 所以必定要注意:千万不能改变生产hashcode的相关变量,这个会形成内存泄漏,永远get不到存放在内存中的对象。对象