1.集合中的对象连续相同
这里要求的是同一个集合中去重的方法 public class ArraysListDemo {
public static void main(String[] args) {
ArrayList c=new ArrayList();
c.add("abc");
c.add("amos");
c.add("hello");
c.add("abc");
c.add("amos");
c.add("hello");
c.add("hello");
c.add("abc");
c.add("abc");
c.add("amos");
c.add("hello");
for(int x=0;x<c.size()-1;x++)
for(int y=x+1;y<c.size();y++){
if(c.get(x).equals(c.get(y))) {
c.remove(y);
}
}
for (int i = 0; i < c.size(); i++) {
String s= (String)c.get(i);
System.out.println(s);
}
}
}
输出:
abc
amos
hello
hello
abc
这上面出现了hello的重复,没有预想到的去重。
原因分析:
当集合中连续的两个元素为相同的时候,在使用c.remove(y)后,第一个元素会被去除,但是第二个元素并没有,而此次循环又过去了,我们需要使本次索引再次被除去,代码的循环部分应该改为:
for(int x=0;x<c.size()-1;x++) for(int y=x+1;y<c.size();y++){ if(c.get(x).equals(c.get(y))) { c.remove(y); y--; } }
改进后结果:
abc
amos
hello
2.集合中的元素为对象
当集合中存储的是对象的时候,我们需要创建心得集合来存储不重复的对象,这个时候我们使用 contains()函数来判断是不是有重复时候会产生错误。原因分析:
contains(Object o) 方法源码是:
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; }
由此可知,contains()底层是equals()方法,Object类中equals()方法比较的是地址值,不是比较内容,所以当然不正确。我们必须重写equals()方法才能按照我们的想法比较内容。
总结:
在我们日常使用中,经常会需要重写equals()方法,只要我们判断的时候和我们想的不一样,在排除其他错误后,我们需要查看一下源码,看看这个判断函数底层有没有使用equals()方法,一般我们出错就是因为没有重写equals()方法。