HashSet<Object> hs = new HashSet<Object>();
WarpString ws1 = new WarpString("aaa");
WarpString ws2 = new WarpString("aaa");
String s1 = new String("aaa");
String s2 = new String("aaa");
hs.add(ws1);
hs.add(ws2);
hs.add(s1);
hs.add(s2);
System.out.println(hs.size());
打印结果是:3
但是不明白为什么,哪位可以帮忙指点指点?

解决方案 »

  1.   

    WarpString 是自己封装的类吧
    你重写下 equals 方法 就会发现原因
    HashSet.add 方法内用的是 equals 来比较2个对象的
    看看源码就知道了
      

  2.   

    String的二个视为相同
    WarpString的二个视为不同
    因为String默认有重写equals方法
    而你自己的WarpString没重写equals方法
      

  3.   

    WarpString好像用得不多。
    HashSet什么情况下用?为什么不用ArrayList?
      

  4.   

    HashSet保证里面的元素不重复(通过equals方法进行比较)
    集合的概念,元素唯一
      

  5.   

    正如楼上几位所说,我个人认为这道题考点就是String和HashSet。
    String s1 = new String("aaa");
    String s2 = new String("aaa");
    hs.add(s1);
    hs.add(s2);
    因为hashset的add是通过equals比较的,所以s1.equals(s2)比较的是字符串内容,所以加入的是一个
    然而
    WarpString ws1 = new WarpString("aaa");
    WarpString ws2 = new WarpString("aaa");
    同样也是通过equals方法,因为是两个普通类对象,所以结果ws1,ws2是两个不同的对象,所以加入的是两个。最后打印出来的结果是3
      

  6.   

    直接上代码    public V put(K key, V value) {
            if (key == null)
                return putForNullKey(value);
            int hash = hash(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))) {
                    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)))
      

  7.   

    重点在这行if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
    为毛错个大小写就不显示了,强烈鄙视下