本帖最后由 masai158 于 2014-8-10 15:06 编辑
- import java.util.HashSet;
- /**hashCode的作用:当需要在hash结构的集合中存储时就需要根据自己的属性来覆写hashCode。为什么呢?
- * 因为在hash结构中,必须要确保元素的唯一性,在判断唯一性的最重要的依据就是 hashCode 和 equals。如果这2个都相等的那就是同一个元素。
- * 程序是有限判断 hashCode值,如果相等在判断equals。所以提高程序的效率 最好就根据 自己的属性来覆写hashCode.
- * */
- public class HashCode {
- public static void main(String[] args)
- {
- HashSet hs = new HashSet();
- hs.add(new Person5("xiaozhang",20));
- hs.add(new Person5("xiaozi",10));
- hs.add(new Person5("xiaoxia",20)); //不写hashCode的话。和下面的对象都可以同时存入集合中
- hs.add(new Person5("xiaoxia",20));
-
- Person5 xiaojian = new Person5("xiaojian",15);
- hs.add(xiaojian);
- System.out.println(hs.size());// 4
-
- xiaojian.age = 10; //我修改一个对象的成员属性以后。
- System.out.println(hs.remove(xiaojian)); //在删除对象,是没办法删除的
- /**我在创建的时候是记录的是一个哈希值,我删除的时候也必须是当时记录的哈希值,
- * 当我修改对象的属性后,他的哈希值将随之改变,肯定不是 之前的哈希值,所以没办法删除。
- *
- * 这种现象叫内存泄漏:当我需要删除一个对象时。这个对象已经不可达,而且也无法回收内存的话,这样白白的占用了内存的空间,
- * 当我的对象很多的,同时这种浪费资源的空间越来越多的时候,就会造成内存溢出
- * 内存溢出:递归的时候也应该尽量控制递归次数,不然也容易引发内存溢出。
- * */
- System.out.println(hs.size());// 4
- }
- }
- class Person5
- {
- public String name;
- public int age;
- public Person5(String name, int age)
- {
- this.name = name;
- this.age = age;
- }
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + age;
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- return result;
- }
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- Person5 other = (Person5) obj;
- if (age != other.age)
- return false;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- return true;
- }
- }
复制代码
刚刚总结完了。看对你有帮助不嘛!!我是后悔没看反射,就教答案了。不然又可以多混点技术分了 |