(本系列同步更新于 个人博客小站)
本系列整理Java相关的笔试面试知识点,其他几篇文章如下:
1、String的split(String regex)方法参数注意点
使用这个方法时,当我们直接以“.”为参数时,是会出错的,如:
String str = "12.03";
String[] res = str.spilt("."); //出错!!!
此时,我们得到的res是为空的(不是null),即str = [];
因为String的split(String regex)根据给定的正则表达式的匹配来拆分此字符串,而"."是正则表达式中的关键字,没有经过转义split会把它当作一个正则表达式来处理的,需要写成str.split("\\.")进行转义处理。
2、关于hashCode方法
【参考文章:
】
我们可以先通过HashMap中hashCode的作用来体验一下。
我们知道HashMap中是不允许插入重复元素的,如果是插入的同一个元素,会将前面的元素给覆盖掉,那势必在HashMap的put方法里对key值进行了判断,检测其是否是同一个对象。其put源码如下:
public V put(K key, V value) {
if (table == EMPTY_TABLE) { //key的hashCode值放在了table里面
inflateTable(threshold);
}
if (key == null)
return putForNullKey(value);
int hash = hash(key); //计算我们传进来的key的hashcode值
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { //将传进来的key的hashcode值于HashMap中的table里面存放的hashCode值比较
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
可以看到这里的判断语句 if (e.hash == hash && ((k = e.key) == key || key.equals(k))),里面通过&&逻辑运算符相连,先判断e.hash == hash,即判断传进来的key的hashCode值与table中的已有的hashCode值比较,如果不存在该key值,也就不会再去执行&&后面的equals判断;当已经存在该key值时,再调用equals方法再次确定两个key值对象是否相同。从这里可以看出,hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率。
可以看到,判断两个对象是否相同,还是要取决于equals方法,而两个对象的hashCode值是否相等是两个对象是否相同的必要条件。所以有以下结论:
(1)如果两个对象的hashCode值不等,根据必要条件理论,那么这两个对象一定不是同一个对象,即他们的equals方法一定要返回false;