13.2集合Set和Map,hashset,linkedhashset,treeset,hashmap,linkedhashmap,treemap

集合

在这里插入图片描述

Set集合

在这里插入图片描述

可以存储任意对象类型的数据 包括null。
无序(存储时的顺序跟遍历时的顺序不一定一样)
数据不能重复(自动去重)
数据结构跟List不同,没有下标
查找慢,插入删除快。(插入和删除不会引起元素位置改变。红黑二叉树)

使用hashset

  HashSet asdc = new HashSet();
        asdc.add('s');
        asdc.add("dscsd");
        Iterator iterator = asdc.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        for (Object o : asdc) {
            System.out.println(o);
        }
        System.out.println();

常用方法

在这里插入图片描述

迭代器

iterator HashSet类中没有提供根据集合索引获取索引对应的值的⽅法, 因此遍历HashSet时需要使⽤Iterator迭代器。Iterator的主要⽅法如下 在这里插入图片描述

HashSet的底层就是HashMap

Set中元素不可以重复,是无序的(这里无序是指存入元素的先后顺序与输出元素的先后顺序不一致)HashSet:内部的数据结构是哈希表,是线程不安全的。HashSet 中保证集合中元素是唯一的方法:通过对象的hashCode和equals方法来完成对象唯一性的判断。

TreeSet

实现原理:TreeSet 基于 TreeMap 实现,需要实现比较器基本数据类型 按照默认的排序 。和String类中重写了compareTo()方法定义了字符排序的规则。默认按照元素的自然顺序进行排序,必须实现Comparable接口

有序
无重复
添加、删除元素、判断元素是否存在,效率比较高

TreeSet:可以对Set集合中的元素进行排序,是线程不安全的。
TreeSet中判断元素唯一性的方法是:根据比较方法的返回结果是否为0,如果是0,则是相同元素,不存,如果不是0,则是不同元素,存储。
TreeSet对元素进行排序的方式:如果是基本数据类型和String类型,无需其它操作,可以直接进行排序。对象类型元素排序1,需要实现Comparable接口,并覆盖其compareTo方法。并按照方法中的定义的规则排序

package ClassTestletter;
import java.util.List;
import java.util.TreeSet;
public class Person implements Comparable<Person> {
    String name;
    int age;
    private List<Person> friend;

    public String getName() {
        return name;
    }

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

    public List<Person> getFriend() {
        return friend;
    }

    public void setFriend(List<Person> friend) {
        this.friend = friend;
    }

    public Person() {
    }

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

    public Person(List<Person> friend) {
        this.friend = friend;
    }

    public int getAge() {
        return age;
    }

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

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

    public static void main(String[] args){
        Person person = new Person();
        person.setName("张三");

        Person person1 = new Person();
        person1.setName("张四");
        person1.setAge(25);
        Person person2 = new Person();
        person2.setName("张四1");
        person2.setAge(21);
        Person person3 = new Person();
        person3.setName("张四2");
        person3.setAge(22);

        TreeSet tr = new TreeSet<>();
        tr.add(person1);
        tr.add(person2);
        tr.add(person3);
        for (Object o : tr) {
            System.out.println(o);
        }
    }
    @Override
    public int compareTo(Person o) {
        if (age == o.age){
            return 0;
        }else if (age > o.age){
            return 1;
        }
        return -1;
    }
}

HashSet 去重,无序 取值 添加值

Map

HashMap

存取方式是 key-value形式Key和value都可以是任意对象类型。Key不能重复,value可以重复,可以为null。HashMap是无序的。如果put重复的key,后⾯的覆盖前⾯的。

HashMap创建和使用

containsKey(“key”)获取map中是否包含某个key。containsValue(“value”)判断map中是否包含某个value。 增 :put() 方法
删 :remove() 方法
改 :map.put(“key”,“value”) 直接修改
遍历: map.keySet():
获取所有keySet集合 通过遍历keySet集合得到单个的key,然后使用map.get(key)方法得出需要的value。
map.entrySet():直接遍历map.entrySet()方法得到的set集合,得到entrySet映射关系key=value,通过entry.getKey() 和entry.getValue() 来取出对应的key和value。

package Map01;
import java.util.*;

public class HashMap001 {
   public static void main(String[] args){

       HashMap<Object, Object> map = new HashMap<>();

       ArrayList<String> objects = new ArrayList<>();
       objects.add("sdc");
       objects.add("sdc");
       HashSet<Object> objects1 = new HashSet<>();
       objects1.add(objects);
       Iterator<Object> iterator = objects1.iterator();
       System.out.println(iterator.next());

       map.put("name","dscsd");
       map.put("age", 18);
       map.put("height",179);

       map.get("name");
       Set a =  map.keySet();
       for (Object o : a) {
           System.out.println(o +" "+ map.get(o));
       }

       Set<Map.Entry<Object, Object>> entries = map.entrySet();
       for (Map.Entry<Object, Object> entry : entries) {
           System.out.println(entry.getKey()+""+entry.getValue());
       }
   }
}

HashMap底层原理

在这里插入图片描述
HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,依次来解决Hash冲突的问题,因为HashMap是按照Key的hash值来计算Entry在HashMap中存储的位置的,如果hash值相同,而key内容不相等,那么就用链表来解决这种hash冲突。

HashTable

线程同步,锁定所有数据,键和值都不能为null;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杵意

谢谢金主打赏呀!!

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

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

打赏作者

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

抵扣说明:

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

余额充值