关于hashCode 分析还有有序集合与无序集合的存取条件,避免造成内容泄露

来源:互联网 发布:淘宝分期免息怎么设置 编辑:程序博客网 时间:2024/05/21 09:02
 

package AdvanceJava;

import static java.lang.System.out;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.TreeSet;
class My implements Comparator
{

 @Override
 public int compare(Object o1, Object o2) {
  // TODO Auto-generated method stub
  return 0;
 }
 }
class Person_Hash implements Comparable
{
 public String name;
 public int age;
 public Person_Hash(String name,int age)
 {
  this.name = name;
  this.age = age;
 }
 public boolean equals(Object obj)
 {
  Person_Hash p = (Person_Hash)obj;
  if(obj==null || !(p instanceof Person_Hash))
   return false;
  if(p.name.equals(this.name)&&(p.age == this.age))
   return true;
  else
   return false;
  
 }
 public int hashCode()
 {
  return name.hashCode()+age*9;
 }
 public int compareTo(Object o) {
  return 1;
 }
 
 
}
/*
 *    对于 存入到 hash 表中的元素(HashSet HashMap)如果存入后
 *    就不要再改变有可以影响hashCode 结果的成员的值,
 *    如果你在存入后改变了它的该对象的HashCode 的值,那么
 *    该对象则不是你已经存入的那个,所以那个对象则不会再被使用,
 *    日积月累,造成内在的泄露
 *   
 *
 */
public class HashCodeTest {
 public static void main(String args[])
 {
  Collection col = new HashSet();
  Person_Hash p1 = new Person_Hash("boy",22);
  Person_Hash p2 = new Person_Hash("boy",22);
  Person_Hash p3 = new Person_Hash("boy",22);
  Person_Hash p4 = new Person_Hash("boy",22);
  col.add(p1);
  col.add(p2);
  col.add(p3);
  col.add(p4);
  out.println(col.size()); //输出结果为1,对于set 集合,其存取的条件在于hashcode 与 equals 两个方法的
        //的返回值,在源代码里有这样一个条件
        // e.hash == hash &&(e.key == k || key.equals(e.key))
  //trytree();
  memeryOut();
 }
 public static void trytree()
 {
  Collection col = new TreeSet();
  Person_Hash p1 = new Person_Hash("boy",22);
  Person_Hash p2 = new Person_Hash("boy",22);
  Person_Hash p3 = new Person_Hash("boy",22);
  Person_Hash p4 = new Person_Hash("boy",22);
  col.add(p1);
  col.add(p2);
  col.add(p3);
  col.add(p4);
  out.println(col.size()); //其结果为4.因为它们的comparator 一直相等,所以都被存入进集合
     // 可知,对于 有序集合来说,其存取的责任都落在了comparator 上,无论hashcode
     //与equals 是否相等,只要comparator 返回不等于0,那它都将会被存入集合
 }
 public static void memeryOut()
 {
  Collection set = new HashSet();
  Person_Hash p1 = new Person_Hash("boy",22);
  Person_Hash p2 = new Person_Hash("girl",21);
  Person_Hash p3 = new Person_Hash("person",222);
  set.add(p1);
  set.add(p2);
  set.add(p3);
  out.println(set.size());// 现在的结果是3
  p1.name = "dog";
  set.remove(p1);
  out.println(set.size());// 现在的结果然后是3,因为我们在前面改变了p1的name.也就是间接改变了hashcode值
    // 而hash 在取值的时候,依靠的就是hashcode,而我们改变了它的hashcode ,所以也就找不到了
    //修改生的 p1 对象,所以:
     //  我们对已经存入set 集合中的对象不要再修改其影响hashcode 计算的属性,不然会
     //造成内在泄露,这个很重要,而且不容易检查出来
  
 }
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 支付宝被骗了钱怎么办 被支付宝骗了钱怎么办 头发出油怎么办小妙招 照相的时候脸歪怎么办 怀孕两个月同床了怎么办 小姐被警察抓了怎么办 我的世界迷路了怎么办 砸到手指甲很痛怎么办 手被锤子砸肿了怎么办 拇指突然疼肿了怎么办 手指甲压紫了痛怎么办 砸到手指头肿了怎么办 小婴儿体重不长怎么办 2岁半宝宝不说话怎么办 米兰叶子掉光了怎么办 qq雷霆战机闪退怎么办 微信限额20万怎么办 欧拉方程x<0怎么办 柿子核吃下去了怎么办 橡胶底白色变黄怎么办 20了丁丁还很小怎么办 5角硬币吞进肚子怎么办 孩子吞了5角硬币怎么办 左腿比右腿微粗怎么办 一个腿长一个腿短怎么办 刚买的毛笔很硬怎么办 我哥哥太爱我了怎么办 如果婚姻无法维持该怎么办 捡了一只流浪狗怎么办 微博加载不出来怎么办 我的脾气很暴躁怎么办 歌单恢复已删除怎么办 家里破产了我该怎么办 对付有心计的人怎么办 上嘴唇无故肿了怎么办 下嘴唇肿了一半怎么办 狗狗早上叫不停怎么办 狗在家乱咬东西怎么办 狗狗晚上一直叫怎么办 金毛幼犬晚上叫怎么办 金毛晚上老是叫怎么办