Set的存储机制是equals与hashcode相结合的。一般ADD一个对象会先根据equals方法判断与其他对象是否相等,因为Set是不允许重复add的。如你不覆盖equals方法,JAVA默认所有的对象都是不同的,也就是它们的内存地址。假如你NEW一个对象,人,你认为只要它们名字相同就是同一个对象,此时你就需要覆盖equals方法了,否则同名也是两个对象。java先通过equals方法判断存储位置,如果不同直接存入;如果通过equals方法比较现在要存入的对象与结合中的某个对象相等,那么它就会再根据hashcode来判断它们是否hashcode也相等,如果相等那就存不进去了,说明它们确实是同一个对象,不等就可存入。所以一般在写程序的时候,两个对象你认为它们不同就去覆盖equals方法。这样可以提高效率,不要让JAVA再去判断hashcode
|
java代码:
- public class A {
- private String name;
- /**
- * @return the name
- */
- public String getName() {
- return name;
- }
- /**
- * @param name
- * the name to set
- */
- public void setName(String name) {
- this.name = name;
- }
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#equals(java.lang.Object)
- */
- @Override
- public boolean equals(Object obj) {
- System.out.println("equals");
- return true;
- }
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#hashCode()
- */
- @Override
- public int hashCode() {
- System.out.println("hashcode");
- return 1;
- }
- }
java代码
- public void testHashA() {
- A a = new A();
- Set l = new HashSet();
- for (int i = 0; i < 10; i++) {
- a = new A();
- a.setName(String.valueOf(i));
- l.add(a);
- }
- System.out.println(l.size());
- for (Iterator iter = l.iterator(); iter.hasNext();) {
- A element = (A) iter.next();
- System.out.println(element.getName());
- }
- }
输出为:
hashcode
hashcode
equals
hashcode
equals
hashcode
equals
hashcode
equals
hashcode
equals
hashcode
equals
hashcode
equals
hashcode
equals
hashcode
equals
1//只有一个元素
0//第一个元素
List、map加入对象时不会调用着两个方法