Set系列集合和Map系列集合

Set系列集合的特点

Set系列集合概述

Set系列集合特点

  • 无序:存取顺序不一致(但存储完毕后,集合的顺序不会再变动

  • 不重复:可以去除重复

  • 无索引:没有待索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素

set集合实现类特点

HashSet:无序,不重复,无索引

LinkedListSet:有序,不重复,无索引

TreeSet:排序,不重复,无索引

Set集合的功能上基本上与Collection的API一致

HashSet元素无序的底层原理:哈希表

HashSet底层原理

HashSet集合底层采取哈希表存储数据

哈希表是一种对于增删改查数据性能都较好的结构

哈希表的组成

JDK8之前的,底层使用数组+链表组成

JDK8之后,底层采用数组+链表+红黑树组成

哈希值

是JDk根据对象的地址,根据某种规则算出来的int类型的数值

Object类的API

public int hashCode():返回对象的哈希值

HashSet1.7版本原理解析:数组+链表+(集合哈希算法)

  1. 创建一个默认长度16的数组,默认加载因为0.75,数组名为table

  1. 根据元素的哈希值跟数组的长度求余计算出应存入的位置(哈希算法)

  1. 判断当前位置是否为null,如果是null直接存入

  1. 如果不为null,表示有元素,则调用equals方法比较(此处比较的是地址

  1. 如果一样,则不存。如果不一样,则存入数组

  • JDK7新元素占老元素位置,指向老元素

  • JDK8中新元素挂在老元素下边

当数组存到16*0.75(加载因)=12时,就自动扩容,每次扩容到原来的两倍

JDK1.8版本开始HashSet原理解析

底层结构:哈希表(数组,链表,红黑树的结合体

当挂在元素下面的数据过多时,查询性能降低,从JDK8开始后,当链表长度超过8时,自动转化成红黑树

HashSet元素去重复的底层原理

hashCode和equals方法默认都是通过地址判断是否重复

可以通过重写hashCode和equals方法保证集合中不出现重复元素

实现类:linkedHashSet

LinkedHashSet作为HashSet的子类

可以保证存储和取出的元素顺序一致

底层数据结构依然是哈希表,但每个元素又额外多了一个双链表的机制记录存储的顺序

实现类:TreeSet

按照元素的大小默认升序排序

TreeSet集合底层是基于红黑树的数据结构实现的,增删改查性能都较好

TreeSet集合是一定要排序的,可以见元素按照指定的规则进行排序

TreeSet集合默认排序的规则

对于数值类型:Integer,Double,官方默认按照大小进行升序排序

对于字符串类型:默认按照首字符的编号进行升序排序

对于自定义类型,无法直接排序,需要指定排序规则

TreeSet集合自定义排序规则

两类方法

  • 类实现Comparable接口,重写比较规则

  • 集合自定义Comparator比较器对象,重写比较规则

当二者同时存在,会优先调用集合自己的比较器

Collection体系的特点,使用场景总结

1,如果希望集合可以重复,又有索引,索引查询要快?

  • ArrayList基于数组

2,如果希望元素可以重复,有有索引,增删首位操作快?

  • LinkedList基于链表

3,如果希望增删改查都快,但元素不重复,无序,无索引

  • HashSet基于哈希表

4,如果希望增删改查都快,但是元素不重复,有序,无索引

  • LinkedHashSet基于哈希表和双链表

5,如果要对对象进行排序

  • TreeSet基于红黑树

补充知识:可变参数

可变参数

可变参数用在形参中可以接收多个数据(用在方法定义时

可变参数的格式:数据类型...参数名称

可变参数的作用

传输参数非常灵活,方便。可以不传输参数,可以传输一个或多个,也可以传输一个数组

可变参数在方法内部本质上就是一个数组

可变参数注意事项

  1. 一个形参列表中可变参数只能有一个

  1. 可变参数必须放在形参列表的最后边

补充知识:集合工具类Collections

Collections集合工具类

Java.utils.Collections属于工具类

作用:Collections并属于集合,是用来操作集合的工具类

向集合中添加数据

Collections.addAll(list,"只因");

打乱集合(通过索引打乱集合

Collections.shuffle(list);

排序和TreeSet差不多

类实现Comparable接口,重写比较规则
集合自定义Comparator比较器对象,重写比较规则
当二者同时存在,会优先调用集合自己的比较器

Collection体系的综合案例

Map集合体系

Map集合概述和使用

Mao集合是一种双列集合,每个元素包含两个数据

Map集合的每个元素的格式:key=value(键值对元素

Map集合也被称为“键值对集合”

Map集合整体格式

完整格式{key1=value1,kery2=value2,key3=value3....}

Map集合体系特点

使用最多的是HashMap

重点掌握HashMap,LinkedHashMap,TreeMap即可,其后续理解

  • Map集合的键无序,不重复

  • Map集合的值不做要求,可以重复

  • Map集合的特点都是由键决定的

  • Map集合的简直都可以为Null

  • Map集合后面重复的键对应的值会

Map集合实现类特点

HashMap:元素按照键是无序,不重复,无索引,值不做要求。

LinkedHashMap:元素按照键是有序的,不重复,无索引,值不做要求

TreeMap:元素按照键是排序,不重复,无索引的,值不做要求

Map集合API

Map集合是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的

Map<String,Integer> map=new HashMap<>();
        //1,向集合内添加元素
        map.put("小黑子",1);
        map.put("香精煎鱼",1);
        map.put("香翅捞饭",1);
        map.put("再看一眼就爆炸",1);
        map.put("在靠近点就融化",1);

        System.out.println(map);
        //2,清空集合
        //map.clear();
        //3,判断集合是否为空,为空则返回true
        System.out.println(map.isEmpty());
        //4,根据键获取对应值
        System.out.println(map.get("小黑子"));
        //5,根据键删除整个元素,会返回键的值
        System.out.println(map.remove("小黑子"));
        //6.判断是否包含某个键,包含则返回true
        System.out.println(map.containsKey("小黑子"));
        //7,判断是否包含某个值,包含则返回true
        System.out.println(map.containsValue(1));
        //8,获取全部键的集合public Set<K> KeySet()
        Set<String> keys = map.keySet();
        System.out.println(keys);
        //9,获取全部值的集合public Set<V> Values();
        Collection<Integer> values = map.values();
        System.out.println(values);
        //10,集合大小
        System.out.println(map.size());
        //11,合并其他Map集合
        Map<String,Integer> map1=new HashMap<>();
        Map<String,Integer> map2=new HashMap<>();

        map1.put("蒸虾头",2);
        map1.put("油饼",3);

        map2.put("树脂",2);
        map2.put("蒸虾头",1);
        map1.putAll(map2);//把集合map2的元素拷贝一份到map1,键相同的,使用map2的值覆盖
        System.out.println(map1);

Map集合的遍历方式一:键找值

  • 先获取Map集合的全部键的Set集合

  • 遍历键的Set集合,然后通过键提取相应值

Map集合的遍历方式二:键值对

  • 先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型了

  • 遍历Set集合,然后提取键以及提取值

Map集合的遍历方式三:Lambda表达式

map.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String s, Integer integer) {
                System.out.println(s+integer);
            }
        });

Map集合的实现类HashMap

HashMap是Map里的一个实现类元素按照键是无序,不重复,无索引,值不做要求。

直接使用Map里的方法即可

HashMap跟HashSet底层原理是一样的,只是HashMap的每个元素包含两个值而已

实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已

同时也是依赖HashCode和equals保证键的唯一性·

如果键要存储的是自定义对象,需要重写hashcode和equals方法

Map集合的实现类LinkedHashMap

这里的有序值得是保证存储顺序和取出的元素顺序一致

底层结构仍是哈希表,只是每个键值对元素又多了一个双链表的储存机制记录存储的顺序

Map集合的实现类TreeMap

不重复,无索引,可排序

按照键数据的大小默认升序,只对键排序

如果是自定义类作为键,同样

两类方法
1,类实现Comparable接口,重写比较规则
2,集合自定义Comparator比较器对象,重写比较规则
当二者同时存在,会优先调用集合自己的比较器

补充知识:集合的嵌套

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值