`
rrsy23
  • 浏览: 182562 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多

废话不说,代码先行!

 

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

 

 

分享到:
评论
1 楼 martinfans 2009-07-09  
<div class="quote_title">rrsy23 写道</div><div class="quote_div"><p>废话不说,代码先行!</p>
<p> </p>
<p>package com.bobo;</p>
<p>import java.util.Set;<br>import java.util.HashSet;</p>
<p>public class TestA {<br>    public static void main(String[] args) {<br>        Set&lt;Student&gt; set = new HashSet&lt;Student&gt;();//<span style="background-color: #ff0000;">1<br></span>        set.add(new Student());//<span style="background-color: #ff0000;">2<br></span>        set.add(new Student());//<span style="background-color: #ff0000;">3<br></span>        //set大小-&gt;2<br>        System.out.println("set大小-&gt;" + set.size());//4<br>        //set包含 new Student()--&gt;false<br>        System.out.println("set包含 new Student()--&gt;" + set.contains(new Student()));//5<br>        set.clear();//6<br>        System.out.println("--------------清空集合----------");<br>        Student s  =new Student();//7<br>        set.add(s);//8<br>        set.add(s);//9<br>        //set大小-&gt;1<br>        System.out.println("set大小-&gt;" + set.size());//10<br>        //set包含 new Student()--&gt;false<br>        System.out.println("set包含 new Student()--&gt;" + set.contains(new Student()));//11<br>        //set包含 s指向的对象吗--&gt;true<br>        System.out.println("set包含 s指向的对象吗--&gt;" + set.contains(s));//12<br>    }<br>}<br>class Student extends Object{<br>}<br>简单分析:2,3行生成2个对象放进去就是2个;为什么?</p>
<p>             首先,java的泪默认集成Object得到</p>
<p>       public boolean equals(Object obj) {<br>        return (this == obj);<br>       }</p>
<p>        public native int hashCode();</p>
<p>      都是通过对象地址产生hashcode和比较的!</p>
<p>      这样产生hashcode自然不同就放进去[不用考虑equals哦,呵呵后面在继续]</p>
<p> </p>
<p>         8,9行一个对象2个引用放进去就是1个,为什么?</p>
<p>         上面类似 s指向的对象相同就是s的内容一样[一个地址数据],这样生成的hashcode一样,放不进!</p>
<p> </p>
<p>        5,11行 false为什么?</p>
<p>        因为到集合找东西首先把找的对象生成hashcode看看集合有没有这个hashcode对应的,假设2,3分别的hashcode是2,3现在找的这个生成的hashcode是4,自然没有,返回false</p>
<p>     12行,返回true</p>
<p>     英文是一个s指向自然hashcode一样,在看equals返回是true</p>
<p> </p>
<p>  </p></div><br/>好文。
override equals的时候要注意一个陷阱
请看这里,
http://www.artima.com/lejava/articles/equality.html

相关推荐

Global site tag (gtag.js) - Google Analytics