请参考我在4楼的回复,程序很多时候需要从语义上去理解 contains内部如何实现要看具体是哪种容器,ArrayList这种随机访问容器内部就是用equals去比较的,和你常识中的实现应该是一样的,HashSet这类容器就是用hashcode来比较的了 下面我粘一段ArrayList的代码吧 public boolean contains(Object o) { return indexOf(o) >= 0; } public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; }
例如,一个AarryList 有1000个String元素,现在需要你判断里面是否有我的String id:lzw0286,
你难道不用contains ,而会自己去写个一方法,来迭代arrayList,取出一个一个String来equals吗?其实这2个方法主要看使用的情形,看样子楼主还不是很理解这2者的区别。
equals是比较两个东西是否等同,这个适用于任何类别的对象
contains是是否包含的意思,那肯定.左边的对象是一个容器了
String现在也有一个contains,那是因为String是一个字符的容器
contains内部如何实现要看具体是哪种容器,ArrayList这种随机访问容器内部就是用equals去比较的,和你常识中的实现应该是一样的,HashSet这类容器就是用hashcode来比较的了
下面我粘一段ArrayList的代码吧
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
首先,hashcode是一种查找对象的算法,当比较2个对象是否相等时,先会到hashcode对应的内存空间里去找,如果2个对象是在同一个内存空间,再去比较2个对象的equals方法。
至于性能,这个就没有研究过了。感觉有点扯远了。楼主记住以下2点就可以了。
当比较对象A与对象B是否相等时要调用 equal方法
当判断对象A是否在集合里时使用contains.在使用contains的地方你可以不使用,而自己用equal一个一个比较
但是当使用equal的地方,你是无法使用contains替代的。
contains常用与集合中判断某个对象是否含有这个元素
equals是判断2对象是否相等
而contains是判断某个对象是否在一个容器里面,是包含的关系·
contains容器里面判断某个对象是否含有这个元素
包含和相等时不一样的!!