java 反射 数组的反射(上)其实是讲ArrayList HashSet HashCode
ArrayList HashSet HashCode
--------------------
--------------------------------
-------------------------关于测试,下一篇再说一下吧
ArrayList HashSet HashCode
--------------------
package com.ncs;
public class Point {
private int x;
public int y;
public String s1 ="ball";
public String s2="hubin";
public String s3="zhangxiaoxiang";
//做实验而已,字段不可能是 public 的
public Point(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 Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
--------------------------------
package com.ncs;
import java.util.Collection;
import java.util.HashSet;
public class ReflectInCollection {
public static void main(String[] args) {
//Collection collection = new ArrayList();
Collection collection = new HashSet();
Point p1 = new Point(3,3);
Point p2 = new Point(5,5);
Point p3 = new Point(3,3); //看看和 p1有什么不一样
collection.add(p1);
collection.add(p2);
collection.add(p3);
collection.add(p1);
System.out.println(collection.size()); //4
//如果 ArrayList() 换成 HashSet() //3
//ArrayList类似数组,有顺序 你放进去 哪怕是同一个对象,放十次
//★就有十个格子新出来,只不过那十个格子存放的地址都一样,[因为刚刚说的是同一个对象嘛]
//所以ArrayList还可以插队,你插哪里你定好了
//HashSet()放东西前要 判断 里面是不是已经有了,有了不放, 不是覆盖★
//刚刚测试说明了 ,p1 和 p3 不是一个,如果你希望相同,就要自己写 eques方法
//★默认的eques方法通常是比较 hashcode ,hashcode是根据内存值算出来的
//现在回去修改 Point 类的两个方法 equals hashcode
//IDE有专门的 菜单的,看看好了
//自动生成 ,非常不错
//现在 HashSet() 变2了 认为 p1 == p3
//如果把public int hashCode() 去了,又变3了
//就是说 HashSet() 根据 hashCode() 方法判断两个对象是不是一样的
//hash这东西,有点难度的
//就比如说你不想存一样的东西到集合里吧,
//这个集合你怎么实现???一个一个判断????假如这个集合有上千亿条记录呢??
//假如你想放进去的记录是条新的,那是不是说你要比较千亿次后才可以放进去呢??
//有高手发明 一种哈稀 算法,把集合分若干 存储 区域 ,每个区域 存放 的对象匹配那个
//对象算出的Hash值,
//说白了就是你这个对象 算出来的 那个HASH码 只可以存到 特定的某段 区域里
//我找的时候也好找了
//再说白一点,每个object都可以算出 哈稀 值 ,
//当把这个对象 存到 具有HASH功能的集合的时候,★[存ArrayList之类的不管了]
//不是随便就可以存的,规定你只可以存特定某段内存
//要比较是不是一样,先到那一段内存 ,然后一个一个判断equals,
//有趣的是,我这段 没有 equals,其他段有的,JVM还是认为你没有,它只认那一段
//可见 hashset集合有很好的对象 检索功能,但是存储对象的效率会低一些,
//因为先要算你这个对象改放 哪段 内存呢!
//同一个对象在程序运行期间任何时候返回的 哈稀值 是始终不变的
//所以 即使两个对象的equals方法比较结果一样,他们默认的
//hashcode方法返回的值也是不一样的
//所以有一说法,你让两个对象的equals一样了,就也把 hashcode弄一样吧
//其实,如果你确定不会把对象放 hash功能的集合里,大可不管 hashcode
//一般来说
//只有类的实例对象要被采用哈稀算法进行存储和检索时,这个类才需要按照
//要求覆盖hashCode()方法,即使程序可能暂时不会用到当前类的
//hashCode()方法,但是为它提供一个hashcode()方法也没有什么不好
//所以通常这两个方法会同时覆盖,IDE也设计了这样的菜单
//通常,一个类的两个实例用equals比较一样时,他们的hashcode也必须一样
//但是反之就不一定了,"BB" "Aa"的equals肯定不一样,但是
//hashcode()返回的就是一样的
//★★最后,当一个对象存储进hash集合后,不要去修改这个对象里参与计算
//哈稀值的字段,要不然contains方法都检索不到了,到时候内存益出了..
}
}
-------------------------关于测试,下一篇再说一下吧