set集合接口,HashSet实现类,HashSet唯一特点存储原理分析-红黑树,TreeSet实现类,LinkedHashSet实现类,Map顶级集合接口,HashMap实现类

一、继承Collection接口的set集合接口

  1. 特点:
  2. 无序 ,存取不一致的
  3. 唯一,不能重复数据
  4. set集合的实现类:HashSet、TreeSet
  5. 代码用例HashSet继承属性特点:无序、存取不一致
package qf22020301;

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

public class Demo01 {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("a");
        set.add("w");
        set.add("w");
        set.add("c");
        set.add("d");
        set.add("d");
        //方式1
        for (String obj : set) {
            System.out.println(obj);
        }
        System.out.println("=====================");
        //方式2
        Iterator<String> itr = set.iterator();
        while (itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}
  1. 代码用例TreeSet特点:有序、存取不一致
package qf22020301;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class Demo01 {
    public static void main(String[] args) {
        Set<String> set = new TreeSet<>();
        set.add("a");
        set.add("w");
        set.add("w");
        set.add("c");
        set.add("d");
        set.add("d");
        //方式1
        for (String obj : set) {
            System.out.println(obj);
        }
        System.out.println("=====================");
        //方式2
        Iterator<String> itr = set.iterator();
        while (itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

  1. 结果:在这里插入图片描述

二、实现Set接口的HashSet实现类

  1. 简介:HashCode 值是根据内存地址生成的一个十进制数,可以被重写,不能根据HashCode值来表示内存地址(引用数据类型一般会重写HashCode值)
  2. 例子:可以查看String的构造方法,里面重写了HashCode的值,所以String相同内容,其哈希吗值也相等
  3. 注意:字符串存在哈希值冲突,即内容不同,哈希值相同
    在这里插入图片描述

三、HashSet唯一特点存储原理分析-红黑树

  1. 红黑树:在这里插入图片描述

  2. 特点

  3. 数据结构是有Hash表结构进行存储

  4. 此实现类不是同步的,在多线程中是不安全

  5. 默认初始容量为16

  6. 哈希表结构如下图:在这里插入图片描述

  7. HashCode唯一特点原理分析
    在这里插入图片描述

注意:String中,"abc"存储的哈希值一样内容一样,s3,s4 哈希值一样内容不一样

  1. 例子:把四个对象存放到HashSet集合中,相同属性的对象只存放一个
  2. 创建一个Person类
package qf22020301.Demo08;

import java.util.Objects;

public class Person {
    private Integer age;
    private String name;

    public Person() {
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    //把原来比较的包名+类名改成用对象之间的属性进行比较,
    //根据hash表数据存储结构:比较顺序为先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 Objects.equals(age, person.age) &&
                Objects.equals(name, person.name);
    }

    //把原来根据内存地址生成的哈希值重写为用年龄、姓名生成
    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}
  1. 测试类
package qf22020301.Demo08;

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

public class Demo01 {
    public static void main(String[] args) {
        Set<Person> set = new HashSet<>();
        set.add(new Person(20,"小明"));
        set.add(new Person(20,"小明"));
        set.add(new Person(22,"小红"));
        set.add(new Person(22,"小明"));
        System.out.println(set);
    }
}

  1. 输出结果在这里插入图片描述

四、实现Set接口的TreeSet实现类

特点:对元素进行排序

  1. Comparable 或 Comparator 提供这个两个类来定义比较规则

  2. 此实现类不是同步的,在多线程中是不安全的
    排序规则:

  3. 数值类型是按照升序(从小到大)

  4. 字符类型是按首个字母的ascmall来进行比较(中文首个字符)

  5. 自定义数据类型:定义其规则(如根据对象属性),如果没有直接添加则会报错

  6. 使用Comparable类比较定义规则:

  7. 定义一个Person类

package qf22020301.Demo09;

public class Person implements Comparable {
    private Integer age;
    private String name;

    public Person() {
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    @Override
    public int compareTo(Object o) {
        Person p = (Person) o;
        //根据年龄来排序
        //返回值为零时,不加入,这里加判断把它加入
        //从小到大排序(本类-传入的类),否则相反
        return this.age - p.age == 0 ? 1 : this.age - p.age;
    }
}

  1. 定义一个测试
package qf22020301.Demo09;

import java.util.Set;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        Set<Object> objects = new TreeSet<>();
        objects.add(new Person(20,"小明"));
        objects.add(new Person(80,"小李"));
        objects.add(new Person(23,"小明"));
        objects.add(new Person(73,"小王"));
        System.out.println(objects);
    }
}

  1. 结果:在这里插入图片描述
  2. Comparator类比较定义规则:
  3. 定义一个Person类
package qf22020301.Demo09;

public class Person {
    private Integer age;
    private String name;

    public Person() {
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

}

  1. 测试
package qf22020301.Demo09;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        Set<Person> objects = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                //根据年龄从大到小排序
                return o2.getAge() - o1.getAge();
            }
        });
        objects.add(new Person(20, "小明"));
        objects.add(new Person(80, "小李"));
        objects.add(new Person(23, "小明"));
        objects.add(new Person(73, "小王"));
        System.out.println(objects);
    }
}

  1. 结果:在这里插入图片描述

五、继承于HashSet类与实现Set接口的LinkedHashSet实现类

特点:

  1. 具有可预知迭代顺序的Set接口的Set的哈希表和链接列表的实现

  2. 数据结构hash表+双链表

  3. 具有有序,并且唯一性,有序是值存取时的位置和值一样

  4. 此实现类不是同步的,所以是多线程不安全

  5. 例子:

package qf22020302.Demo01;
import java.util.HashSet;
import java.util.LinkedHashSet;

public class Demo01 {
    public static void main(String[] args) {
        HashSet<Object> lhs = new LinkedHashSet<>();
        lhs.add(1);
        lhs.add(45);
        lhs.add(2);
        lhs.add(778);
        System.out.println(lhs);
        System.out.println("===================");
        lhs.clear();
        lhs.add("a");
        lhs.add("h");
        lhs.add("b");
        lhs.add("e");
        System.out.println(lhs);
    }
}

  1. 结果 在这里插入图片描述

六、Map顶级集合接口

特点:

  1. 将键映射到值的对象
  2. 一个映射不能包含重复的键:每个键最多只能映射到一个值
  3. 不是同步的,在多线程不安全的
    实现类:
  4. TreeMap 有序 HashMap无序 (解释:有序是值存取的位置(key)不变,无序是值存取的位置(key)可能变了)

七、实现Map接口的HashMap实现类

  1. 单列集合与双列集合的比较
  2. 单列集合的数据结构针对的是元素
  3. 双列集合,键值来进行映射,数据结构针对的是键(键是唯一的
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT阿生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值