28_Set集合

Posted bajiaotai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了28_Set集合相关的知识,希望对你有一定的参考价值。

技术图片

 

 

 1.概念

技术图片

 

 2.接口方法

技术图片

 

 3.Set接口特点

技术图片

 

 4.HashSet

技术图片

 

 5.LinkedHashSet

技术图片

 

 6.什么原因导致了Set集合不重复

package com.bfd;

import java.util.HashSet;

public class Demo01 {

    public static void main(String[] args) {
        /*1.什么原因导致Set集合元素不重复
         *        1.实现的数据结构导致的-hashtable
         *              通过 集合元素的hashCode方法 分配在那条链表或者红黑树上
         *              通过 集合元素的equals方法,判断链表或集合中是否已存在此元素
         * 2.Object的hashCode方法为:public native int hashCode(); 对象内存地址的h整数值
         * 3.Object的equals方法为:return (this == obj);
         * 4.String的hashCode
         *
         * */

        //"哈希冲突"问题
        System.out.println("重地".hashCode());
        System.out.println("通话".hashCode());
        //String的哈希算法
        char[] val = new String("重地").toCharArray();
        int h = 0;
        for (int i = 0; i < "重地".length(); i++) {
            h = 31 * h + val[i];
        }
        System.out.println(h);
        //31*37325+22320
        System.out.println(‘重‘ + 0);//37325
        System.out.println(‘地‘ + 0);//22320
        System.out.println(31 * 37325 + 22320);

        //36890+31*35805+35805
        System.out.println(‘通‘ + 0);//36890
        System.out.println(‘话‘ + 0);//35805
        System.out.println(31 * 36890 + 35805);

        System.out.println("=====测试hash冲突==========");
        //模拟哈希冲突
        HashSet set = new HashSet<>();
        System.out.println(set.add(new Person("张飞",18)));
        System.out.println(set.add(new Person("关羽",22)));
        System.out.println(set.size());



    }
}

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;

        Person person = (Person) o;

        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    /*    @Override
    public int hashCode() {
        return 1;
    }

    @Override
    public boolean equals(Object obj) {
        return true;
    }*/
}

 

7.什么原因导致了hashset无序和linkedhashset有序

package com.bfd;

import org.apache.commons.lang3.builder.HashCodeBuilder;

import java.util.HashSet;
import java.util.Iterator;

public class Demo01 {

    public static void main(String[] args) {
        /*1.什么原因导致hashset无序和linkedhashset有序呢?
         *    存放的顺序和hashcode的value有关,Integer的value是它的数值
         *    value/16就是它存放第几条链表的位置*/
        HashSet hashset = new HashSet();
        hashset.add(5);
        hashset.add(4);
        hashset.add(9);
        hashset.add(1);
        hashset.add(16);
        for (Object i : hashset
        ) {
            System.out.println(i);
        }
        //存放HashCode的值相同,就会存放在一条链表或者红黑树上
        hashset.clear();
        hashset.add(new Person("x", 1));
        hashset.add(new Person("y", 2));
        hashset.add(new Person("z", 4));
        hashset.add(new Person("m", 3));
        Iterator iterator = hashset.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }
}

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        return 1;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name=‘" + name + ‘‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}

 

以上是关于28_Set集合的主要内容,如果未能解决你的问题,请参考以下文章

代码片段 - Golang 实现集合操作

[Aizu] ITP2_9_A~D: Set Operation

比较 C# 中的字符串片段并从集合中删除项目

集合类不安全_List_Set_HashMap

Python__16--集合

python之set集合深浅拷贝