最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • Java—27—Set集合及其子类HashSet

    Set中元素是无序的(存入和取出的顺序不1定1致),元素不可以重复。

     

    Set中的方法和Collection中的方法是1样的。

    常见子类:HashSet  TreeSet

    HashSet 底层数据结构是哈希表

    TreeSet 底层数据结构是2叉树


    import java.util.HashSet;
    import java.util.Iterator;
    class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }
    //set and get methods
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }

    }
    public class SetDemo {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    //method1();
    method2();
    }

    public static void method1() {
    HashSet hs = new HashSet();

    hs.add("01");
    hs.add("02");
    hs.add("03");
    hs.add("04");
    // 无序性
    sop(hs);

    hs.add("02");
    // 唯1性
    sop(hs);
    sop("是不是添加进去:" + hs.add("02"));
    }
    /**
    * 存入自定义对象,如果姓名和年龄相同视为同1个人,重复元素
    */
    public static void method2 (){
    HashSet hs = new HashSet();

    hs.add(new Person("01",10));
    hs.add(new Person("02",11));
    hs.add(new Person("03",12));
    hs.add(new Person("04",13));
    /*打印
    Iterator it = hs.iterator();
    while (it.hasNext()){
    Person person = (Person)it.next();
    sop(person.getName()+"::"+person.getAge());
    }
    */
    //添加1个相同元素
    hs.add(new Person("01", 10));
    Iterator it = hs.iterator();
    while (it.hasNext()){
    Person person = (Person)it.next();
    sop(person.getName()+"::"+person.getAge());
    }
    //没解决啊。。。两个01::10

    }
    public static void sop(Object object) {
    System.out.println(object);
    }

    }

    我们要求 姓名和年龄相同视为是重复元素,依照Set的特性来讲是不应当被保存的,结果却是存上了。。。

     

    解决:覆盖元素的hashCode 方法,建立自己的哈希值,同时覆盖equals方法。

     

    覆盖元素HashCode方法 是由于,在Set中存入元素,首先被判断的就是元素的哈希值,只有当元素的哈希值没有出现过的时候,才会将元素存入。

    覆盖equals方法是由于,两个元素的哈希值相同,但是这两个元素不1定是相同的,因此来判断1下,并根据返回值来决定该元素终究能否被存入。



    package ssssssss;
    import java.util.HashSet;
    import java.util.Iterator;
    class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }
    public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    if (!(obj instanceof Person))
    return false;
    Person person = (Person) obj;
    //打印 表示此方法被调用
    System.out.println(this.name + "******equals*****" + person.name);

    return this.name.equals(person.name) && this.age == person.age;
    }
    //覆盖hashCode方法 建立Person自己的哈希值
    public int hashCode() {
    // TODO Auto-generated method stub
    System.out.println(this.name + "……….hashCode");
    return 13;
    //依照条件设定哈希值
    //return name.hashCode() + age;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }

    }
    public class SetDemo {

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    method2();
    }
    /**
    * 存入自定义对象,如果姓名和年龄相同视为同1个人,重复元素
    */
    public static void method2 (){
    HashSet hs = new HashSet();

    hs.add(new Person("01",10));
    hs.add(new Person("02",11));
    hs.add(new Person("03",12));
    hs.add(new Person("04",13));
    /*打印
    Iterator it = hs.iterator();
    while (it.hasNext()){
    Person person = (Person)it.next();
    sop(person.getName()+"::"+person.getAge());
    }
    */
    //添加1个相同元素
    hs.add(new Person("01", 10));
    Iterator it = hs.iterator();
    while (it.hasNext()){
    Person person = (Person)it.next();
    sop(person.getName()+"::"+person.getAge());
    }
    //没解决啊。。。两个01::10
    //覆盖 hashcode方法,建立自己的哈希值

    }
    public static void sop(Object object) {
    System.out.println(object);
    }

    }

    打印结果:

    01……….hashCode
    02……….hashCode
    02******equals*****01
    03……….hashCode
    03******equals*****01
    03******equals*****02
    04……….hashCode
    04******equals*****01
    04******equals*****02
    04******equals*****03
    01……….hashCode
    01******equals*****01
    01::10
    02::11
    03::12
    04::13

    返回1个相同的哈希值,通过打印结果我们不难猜出此程序的运行进程:

    01先生成1个哈希值,由于此时就只有011个元素,所以存入

    02再生成1个相同的哈希值,然后跟01比较,不是同1元素,存入

    03再生成相同的哈希值,然后跟01和02进行比较,肯定没有相同元素,存入

    04也是1样,跟01 02 03比较完后,存入

    接着就是重复元素01了,比较发现跟第1次存入的01是相同的,

    返回false,没有存入。

     

    结论:

    HashSet是如何保证元素唯1性的呢?

    通过元素的两个方法:hashCode和equals

    只有当元素的哈希值相等的时候才会判断equals方法

     

    那如果生成不同的哈希值的话,就能够大大的减少程序的运行次数。


    package ssssssss;
    import java.util.HashSet;
    import java.util.Iterator;
    class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }
    public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    if (!(obj instanceof Person))
    return false;
    Person person = (Person) obj;
    //打印 表示此方法被调用
    System.out.println(this.name + "******equals*****" + person.name);

    return this.name.equals(person.name) && this.age == person.age;
    }
    //覆盖hashCode方法 建立Person自己的哈希值
    public int hashCode() {
    // TODO Auto-generated method stub
    System.out.println(this.name + "……….hashCode");
    //return 13;
    //依照条件设定哈希值
    return name.hashCode() + age;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }

    }
    public class SetDemo {

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    method2();
    }
    /**
    * 存入自定义对象,如果姓名和年龄相同视为同1个人,重复元素
    */
    public static void method2 (){
    HashSet hs = new HashSet();

    hs.add(new Person("01",10));
    hs.add(new Person("02",11));
    hs.add(new Person("03",12));
    hs.add(new Person("04",13));
    /*打印
    Iterator it = hs.iterator();
    while (it.hasNext()){
    Person person = (Person)it.next();
    sop(person.getName()+"::"+person.getAge());
    }
    */
    //添加1个相同元素
    hs.add(new Person("01", 10));
    Iterator it = hs.iterator();
    while (it.hasNext()){
    Person person = (Person)it.next();
    sop(person.getName()+"::"+person.getAge());
    }
    //没解决啊。。。两个01::10
    //覆盖 hashcode方法,建立自己的哈希值

    }
    public static void sop(Object object) {
    System.out.println(object);
    }

    }


    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » Java—27—Set集合及其子类HashSet

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级