A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梵天的梦 中级黑马   /  2014-2-22 14:33  /  943 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package cn.itcast.day1;
import java.util.*;
public class ReflectTest2 {
        /**         * @param args         */        public static void main(String[] args) {                // TODO Auto-generated method stub                Collection collection = new HashSet();                ReflectPoint pt1 = new ReflectPoint(2,3);                ReflectPoint pt2 = new ReflectPoint(3,3);                ReflectPoint pt3 = new ReflectPoint(2,3);                                collection.add(pt1);                collection.add(pt2);                collection.add(pt3);                                pt1.y = 8;                collection.remove(pt1);                System.out.println(collection.size());//由于RelectPoint的成员变量y是参加hashCode计算的,所以在这里修改pt1.y的值后再执行remove集合的      size值还是2。remove(pt1),这里的pt1是修改前的还是修改后的?                               Iterator iterator=collection.iterator();                 while(iterator.hasNext()){                           System.out.println(iterator.next());//结果:[2,8] [3,3]                 }        }
}由于remove没有找到pt1进行删除,那么是不是在执行pt1.y=8这条语句之后collection对象自动调用什么方法又从新向集合中添加了一个new ReflectPoint(2,8)对象?---------package cn.itcast.day1;
/** * @author thinkpad * */public class ReflectPoint {        private int x;        public int y;
        public ReflectPoint(int x, int y) {                super();                this.x = x;                this.y = y;        }
        @Override        public int hashCode() {                final int prime = 31;                int result = 1;                result = prime * result + x;                result = prime * result + y;                return result;        }
        @Override        public boolean equals(Object obj) {                if (this == obj)                        return true;                if (obj == null)                        return false;                if (getClass() != obj.getClass())                        return false;                final ReflectPoint other = (ReflectPoint) obj;                if (x != other.x)                        return false;                if (y != other.y)                        return false;                return true;        }}



点评

代码不整理,无法正常评分  发表于 2014-2-22 15:51

评分

参与人数 1黑马币 +5 收起 理由
何伟超 + 5 先把代码整理一下!

查看全部评分

5 个回复

倒序浏览
好乱的一坨,麻烦整理清楚了啊
回复 使用道具 举报
package cn.itcast.day1;
import java.util.*;
public class ReflectTest2 {
        /**         * @param args         */        
                public static void main(String[] args) {               
                        // TODO Auto-generated method stub               
                       
                        Collection collection = new HashSet();               
                        ReflectPoint pt1 = new ReflectPoint(2,3);               
                        ReflectPoint pt2 = new ReflectPoint(3,3);               
                        ReflectPoint pt3 = new ReflectPoint(2,3);
                       
                        collection.add(pt1);               
                        collection.add(pt2);               
                        collection.add(pt3);      
                       
                        pt1.y = 8;               
                        collection.remove(pt1);               
                        System.out.println(collection.size());//由于RelectPoint的成员变量y是参加hashCode计算的,所以在这里修改pt1.y的值后再执行remove集合的size值还是2。
                        //remove(pt1),这里的pt1是修改前的还是修改后的?                              
                       
                        Iterator iterator=collection.iterator();                 
                        while(iterator.hasNext()){                           
                                System.out.println(iterator.next());//结果:[2,8] [3,3]                 
                        }        
                }
}         
由于remove没有找到pt1进行删除,那么是不是在执行pt1.y=8这条语句之后collection对象自动调用什么方法又从新向集合中添加了一个new ReflectPoint(2,8)对象?

之前不好意

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
没有新添加对象,
hashset的add方法
  1.     public boolean add(E e) {
  2.         return map.put(e, PRESENT)==null;
  3.     }
复制代码

这儿调用了map里面的put,继续跟踪
  1.     public V put(K key, V value) {
  2.         if (key == null)
  3.             return putForNullKey(value);
  4.         int hash = hash(key);
  5.         int i = indexFor(hash, table.length);
  6.         for (Entry<K,V> e = table[i]; e != null; e = e.next) {
  7.             Object k;
  8.             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
  9.                 V oldValue = e.value;
  10.                 e.value = value;
  11.                 e.recordAccess(this);
  12.                 return oldValue;
  13.             }
  14.         }

  15.         modCount++;
  16.         addEntry(hash, key, value, i);
  17.         return null;
  18.     }
复制代码


根据上面的方法,可以看出put进去的时候是根据hash之确定放的位置的。pt1的地址就存在这个hashcode对应的位置。
调用remove以后的核心代码是
  1.     final Entry<K,V> removeEntryForKey(Object key) {
  2.         int hash = (key == null) ? 0 : hash(key);
  3.         int i = indexFor(hash, table.length);
  4.         Entry<K,V> prev = table[i];
  5.         Entry<K,V> e = prev;

  6.         while (e != null) {
  7.             Entry<K,V> next = e.next;
  8.             Object k;
  9.             if (e.hash == hash &&
  10.                 ((k = e.key) == key || (key != null && key.equals(k)))) {
  11.                 modCount++;
  12.                 size--;
  13.                 if (prev == e)
  14.                     table[i] = next;
  15.                 else
  16.                     prev.next = next;
  17.                 e.recordRemoval(this);
  18.                 return e;
  19.             }
  20.             prev = e;
  21.             e = next;
  22.         }

  23.         return e;
  24.     }
复制代码

你调用pt1.y = 8;    以后pt1算出来的hashcode变了,remove的时候就肯定找不到了。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
楼主的代码有点乱 看着累了点
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马