如题,请高手用浅显易懂的语言解答。

解决方案 »

  1.   

    书上这么说的:
      equals()本身是比较对象的内存地址是否相同,您可以重写该方法。-----------(1)
      在重写该方法时,建议同时重写hashCode()方法。-------------(2)
      因为在哈希码为基础的相关环境中,需要比较两个对象是否为相同的对象时,除了使用equals之外,还会依hashCode方法来判断。-------(3)
      例如加入HashSet容器中的对象就必须重写equals与hashCode,作为加入HashSet中唯一对象的识别。---------(4)
    对(1)理解。
    对(2)中”建议“请坐解释。
    对(3)中“哈希码为基础的相关环境”和为什么“还会依hashCode方法来判断”请分别解释。
    对(4)中此时的“必须”作解释并与问题(2)中的“建议”作区别。同时指出怎样成为“HashSet中唯一对象的识别”的过程作解释。谢谢前辈们。
      
      

  2.   

    import java.util.HashSet;
    import java.util.Set;class Person {
    private String name; Person(String name) {
    this.name = name;
    } public String getName() {
    return this.name;
    }
    }public class Test { public static void main(String[] args) {
    Set set = new HashSet();
    set.add(new Person("A"));
    set.add(new Person("A"));
    System.out.println(set.size());
    }
    }
    结果: 2
    //是不是和我们期待想象的结果1有出入?!这里就需要重写equals方法了
    在Person中添加equals方法
    public boolean equals(Object obj) {
    return this.name.equals(((Person) obj).name);
    }
    结果:2
    //这就是为什么建议(实际大多数时候必须)重写hashCode,因为Set在比较两个对象是否相等时还需要比较它们的hashCode)
    在Person中添加hashCode方法(完整代码如下)
    import java.util.HashSet;
    import java.util.Set;class Person {
    private String name; Person(String name) {
    this.name = name;
    } public String getName() {
    return this.name;
    } public boolean equals(Object obj) {
    return this.name.equals(((Person) obj).name);
    } public int hashCode() {
    //下面的代码只为说明问题使用,实际不可能这样!!
    if (this.getName() == "A")
    return 1;
    else
    return 2;
    }
    }public class Test { public static void main(String[] args) {
    Set set = new HashSet();
    set.add(new Person("A"));
    set.add(new Person("A"));
    System.out.println(set.size());
    }
    }
    //结果:1
    OK,正常了!!
      

  3.   

    这里equals hashCode 也没用,它怎么自己调用的呢?
      

  4.   

    有用啊,如果不重写equals(),那么2个PERSON “A”由于都会被添加到SET中,与想表达的意思出现了差距吧
      

  5.   

    这段代码中 也没有直接的调用equals 和 hashcode方法啊 请指教
      

  6.   

    2.建议的意思就是你重写了equals(),但是你不重写hashCode()并不会有问题,只是以后可能会在某处出现你意想不到的事情。
    3.你去看下HashSet类的add等相关方法。
    4.其实4楼已经举了例子了。也就是说,把对象加入到HashSet容器的时候,你不重写equals与hashCode方法也不会报错,
    只是,不重写equals与hashCode,恐怕对编程人员来讲就失去了用HashSet的意义了。
    所以要重写equals方法,重写过后发现姓名相同的对象被认为是同一个人,这没问题。
    可是HashSet还要去检查这两个对象是否有相同的hashCode,(类似于我们国家,要检查你身份证一样,毕竟重名的人太多)
    如果hashCode返回的值还是相同,则认为相同,则不加入到HashSet中,
    对我们编程人员来讲,HashSet的意义变得重大了。
    这样我们就能根据我们自己的规定,来认为,到底什么样的人算是一个人。当对象要作为键值或者索引来使用的时候,要重写equals与hashCode,也是一样的道理。
    不重写不会报错,只是这样做,对我们没有什么意思。
      

  7.   


    HashSet.add();public boolean add(E e) {
    return map.put(e, PRESENT)==null;//这里其实是把加入add中的参数作为key,用静态常量的Object作为value,储存在map中
        }
    然后:public V put(K key, V value) {
            if (key == null)
                return putForNullKey(value);
            int hash = hash(key.hashCode());//这里,调用了add中参数的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))) {
                    V oldValue = e.value;
                    e.value = value;
                    e.recordAccess(this);
                    return oldValue;
                }
            }        modCount++;
            addEntry(hash, key, value, i);
            return null;
        }