呵呵,张老师的高新技术视频我看三遍了,每次都有新的收获。关于这个,请看代码中我加的注释- import java.util.Collection;
- import java.util.HashSet;
- public class ReflectTest {
- public static void main(String[] args) {
- Collection collections=new HashSet();
- ReflectPoint pt1=new ReflectPoint(3, 3);
- ReflectPoint pt2=new ReflectPoint(5, 5);
- ReflectPoint pt3=new ReflectPoint(3, 3);//这个加不进去了,
- <span style="color: rgb(51, 102, 153); font-family: Monaco, Consolas, 'Lucida Console', 'Courier New', serif; font-size: 12px; line-height: 21.600000381469727px; background-color: rgb(255, 255, 255); ">ReflectPoint </span> 的hashcode是根据,x、y算出来的
- collections.add(pt1);
- collections.add(pt2);
- collections.add(pt3);//加不进去,重复了
- collections.add(pt1);//加不进去,重复了
-
- System.out.println(collections.size());//结果是2
- System.out.println(collections);
- //目前集合中的元素是 <span style="background-color: rgb(255, 255, 255); "> [x:3 y:3, x:5 y:5]</span>
-
- pt1.y=7;//修改了pt1的y值,hashcode变掉了,由于移除对象需要判断它的hashcode,此时集合中不存在这个被修改的hashcode值,集合保存的hashcode仍然是修改前的hashcode,所以这个对象移除不了
- collections.remove(pt1);
- //虽然集合中已经有了个x=3,y=7的pt1对象,但是集合中它所在的hash区域,仍然是根据x=3,y=3时计算出的hashcode值确定的,而加入的对象的hashcode值是根据x=3,y=7计算出来的,所以在集合中与pt1的hashcode值不同,则认为这个对象在集合中不存在所以存了进来
复制代码 过程都写在了注释中了,楼主好好体会下,不是看x、y值,重点看hashcode的值,对象放在集合中的位置是根据加入集合时的hashcode值确定的,加入新的对象时,根据hashcode值判断下相应区域是否有这个对象,明白这些,就能理解了
|