论坛首页 Java企业应用论坛

Java-之-Set--equlas,hashCode机密--01

浏览 2375 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-02  
OO

废话不说,代码先行!

 

package com.bobo;

import java.util.Set;
import java.util.HashSet;

public class TestA {
    public static void main(String[] args) {
        Set<Student> set = new HashSet<Student>();//1
        set.add(new Student());//2
        set.add(new Student());//3
        //set大小->2
        System.out.println("set大小->" + set.size());//4
        //set包含 new Student()-->false
        System.out.println("set包含 new Student()-->" + set.contains(new Student()));//5
        set.clear();//6
        System.out.println("--------------清空集合----------");
        Student s  =new Student();//7
        set.add(s);//8
        set.add(s);//9
        //set大小->1
        System.out.println("set大小->" + set.size());//10
        //set包含 new Student()-->false
        System.out.println("set包含 new Student()-->" + set.contains(new Student()));//11
        //set包含 s指向的对象吗-->true
        System.out.println("set包含 s指向的对象吗-->" + set.contains(s));//12
    }
}
class Student extends Object{
}
简单分析:2,3行生成2个对象放进去就是2个;为什么?

             首先,java的泪默认集成Object得到

       public boolean equals(Object obj) {
        return (this == obj);
       }

       public native int hashCode();

      都是通过对象地址产生hashcode和比较的!

      这样产生hashcode自然不同就放进去[不用考虑equals哦,呵呵后面在继续]

 

         8,9行一个对象2个引用放进去就是1个,为什么?

         上面类似 s指向的对象相同就是s的内容一样[一个地址数据],这样生成的hashcode一样,放不进!

 

        5,11行 false为什么?

        因为到集合找东西首先把找的对象生成hashcode看看集合有没有这个hashcode对应的,假设2,3分别的hashcode是2,3现在找的这个生成的hashcode是4,自然没有,返回false

     12行,返回true

     英文是一个s指向自然hashcode一样,在看equals返回是true

 

 

   发表时间:2009-07-09  
rrsy23 写道

废话不说,代码先行!

 

package com.bobo;

import java.util.Set;
import java.util.HashSet;

public class TestA {
    public static void main(String[] args) {
        Set<Student> set = new HashSet<Student>();//1
        set.add(new Student());//2
        set.add(new Student());//3
        //set大小->2
        System.out.println("set大小->" + set.size());//4
        //set包含 new Student()-->false
        System.out.println("set包含 new Student()-->" + set.contains(new Student()));//5
        set.clear();//6
        System.out.println("--------------清空集合----------");
        Student s  =new Student();//7
        set.add(s);//8
        set.add(s);//9
        //set大小->1
        System.out.println("set大小->" + set.size());//10
        //set包含 new Student()-->false
        System.out.println("set包含 new Student()-->" + set.contains(new Student()));//11
        //set包含 s指向的对象吗-->true
        System.out.println("set包含 s指向的对象吗-->" + set.contains(s));//12
    }
}
class Student extends Object{
}
简单分析:2,3行生成2个对象放进去就是2个;为什么?

             首先,java的泪默认集成Object得到

       public boolean equals(Object obj) {
        return (this == obj);
       }

       public native int hashCode();

      都是通过对象地址产生hashcode和比较的!

      这样产生hashcode自然不同就放进去[不用考虑equals哦,呵呵后面在继续]

 

         8,9行一个对象2个引用放进去就是1个,为什么?

         上面类似 s指向的对象相同就是s的内容一样[一个地址数据],这样生成的hashcode一样,放不进!

 

        5,11行 false为什么?

        因为到集合找东西首先把找的对象生成hashcode看看集合有没有这个hashcode对应的,假设2,3分别的hashcode是2,3现在找的这个生成的hashcode是4,自然没有,返回false

     12行,返回true

     英文是一个s指向自然hashcode一样,在看equals返回是true

 

 


好文。 override equals的时候要注意一个陷阱 请看这里, http://www.artima.com/lejava/articles/equality.html
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics