Java的Set原理

Set :
1.不包含重复元素的接口
2.不包含索引
3.不能使用普通的for循环遍历

Java.util包下 Set接口
实现类:
1)HashSet :它不保证set的迭代顺序
1.实现了set接口
2.是一个无序的集合
3.底层是一个hash表结构:查询的速度非常快

public static void main(String[] args) {
        Set<Integer> set=new HashSet<>();
        //使用add向集合中添加元素
        set.add(1);
        set.add(2);
        set.add(2);
        set.add(3);

        Iterator<Integer> it=set.iterator();
        while(it.hasNext())
        {
            Integer n=it.next();
            System.out.println(n);
        }
        System.out.println("----------------");
        for (Integer integer : set) {
            System.out.println(integer);
        }
    }

哈希值:
Object对象有一个方法:hashCode() :获取hash值
hashCode方法的源码

public native int hashCode();
native :代表该方法调用的是本地操作系统的方法

哈希表结构:HashSet集合存储的数据结构
哈希表=数组+链表
哈希表=数组+红黑树

哈希表的特点:查询速度快

Java的Set原理_第1张图片

Set集合不允许存储重复元素的原理:

public static void main(String[] args) {
        HashSet<String> set=new HashSet<>();

        String s1=new String("abc");
        String s2=new String("abc");
        
        set.add(s1);
        set.add(s2);
        set.add("种地");
        set.add("通话");
        System.out.println(set);

    }

调用add()方法时:会进行比较

Java的Set原理_第2张图片

HashSet存储自定义的数据类型:

HashSet存储自定义类型的元素
1)set集合会报错元素唯一
2)存储的元素:(String ,Integer,Student,Person)
3)必须重写:hashCode和equals方法

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
//测试
     HashSet<Person> set=new HashSet<>();
        Person p1=new Person("美女",18);
        Person p2=new Person("美女",18);
        Person p3=new Person("美女",19);

        set.add(p1);
        set.add(p2);
        set.add(p3);
        System.out.println(set);

LinkedHashSet集合:继承自HashSet,实现了Set
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序)保证元素有序
1)方法和HashSet的方法一样
2)具有可预知迭代顺序

 System.out.println("------------");
        LinkedHashSet<String> linked=new LinkedHashSet<>();
        linked.add("www");
        linked.add("abc");
        linked.add("ddd");
        System.out.println(linked);

可变参数(参数类型 …参数名)
1)jdk1.5之后出现的新特性
2)使用前提:当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数

使用格式:修饰符 返回值类型 方法名(数据类型 …变量名)
原理:
底层就是一个数组,根据传递参数个数不同,创建不同长度的数组,来存储这些参数

传递的参数个数:可以是0个,一个,多个

 public static int add(int ...arr)
    {
        int sum=0;
        for (int i : arr) {
            sum+=i;
        }
        return sum;
    }

你可能感兴趣的:(Java精进,java,数据结构)