• 集合、List、Set、Map、Collections、queue、deque


    概述

    相同类型的数据进行统一管理操作,使用数据结构、链表结构,二叉树
    分类:Collection、Map、Iterator

    集合框架

    在这里插入图片描述

    List接口

    有序的Collection接口,可以对列表中的每一个元u尿素的插入位置进行精确的控制,用户可以根据元素的整数索引访问元素,并搜索列表中的元素
    有序,允许多个null元素
    常用类:ArrayList、Vector、LinkedList

    ArrayList

    实现原理:采用动态对象数组实现,默认构造方法构造了一个空数组
    第一次添加元素,扩容为10,之后的扩容算法为原来的数组大小+原理啊数组的一半
    不适合插入和删除操作
    为了防止数组动态扩充太多,建议给你一个初始容量,
    线程不安全,适合在单线程使用

    Vector

    实现原理采用动态数组实现,默认的初始容量为10动态数组
    扩容算法:当增量为0时,原来的两倍,当增量大于0时,扩容为原来的大小+增量
    不适合插入和删除操作
    对于数组扩充太多的建议使用Vector,有初始容量
    线程安全,效率低,多线程下使用

    LinkedList

    底层实现采用双向链表,高效、无序,插入和删除的特性,性能高,

    实际开发中如何选择?

    1.安全性?Vector
    2.是否频繁插入和操作 LinkedList
    3.是否存储后遍历 ArrayList

    Set接口

    一个不包含重复元素的Collection,set不不包含相同元素,并且最多包含一个null元素、无序
    HashSet、TreeSet、LinkedHashSet,底层实现与Map关联

    HashSet

    实现Set类,由哈希表支持,不保证set的迭代顺序,特别时不保证改顺序恒久不变,运行使用null元素
    实现原理:基于哈希表(HashMap)实现
    不允许重复元素,可以有一个null元素
    不保证恒久不变的顺序
    添加元素时,把元素作为hashMap的key,value使用一个固定的object对象
    排除重复元素使用的时equlas(),如何判断对象是否重复,hashCode()和equals()进行判断
    判断两个元素是否相同,先判断两个对象的hashCode是否相同,(如果相同,不一定是同一个对象,不同一定不是同一个对象),相同在比较equals,相同,才相同。
    自定义对象哟啊任务属性值都是相同为同一个对象,有这种需求时,重写对象所在类的HashCode和eqals方法
    存储结构:数组+链表,数组的元素以链表的形式存储
    要把数据存储到哈希表中,首先是计算HashCode的值,再对数组取余,最终决定数据存储的位置

    TreeSet

    基于TreeMap的NavigableSet实现,让元素的自然顺序进行排序,或者根据创建set提供的Comparator进行排序,取决于构造方法
    有序的,基于TreeMap实现(二叉树结构实现),对象需要比较大小,通过比较器来实现,去除重复数,如果自定义的类没有实现比较器结构,将无法添加到treeSet集合中

    LinkedHashSet

    哈希表和链表的实现
    维护着一个运行于所哟条目的双重链表接列表,链表定义迭代顺序,按照元素插入到set的顺序进行迭代

    区别:
    要排序:TreeSet
    不排序,不用保证顺序hashSet
    不排序,要顺序LinkedHashSet

    Iterator 接口

    package com.ty.collectionPackage;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.List;
    
    public class IteratorDemo {
        public static void main(String[] args) {
            List list = new ArrayList<>();
            Cat c1 = new Cat("oo", 2, 1);
            Cat c2 = new Cat("dd", 3, 2);
            Cat c3 = new Cat("uu", 4, 3);
            Cat c4 = new Cat("oo", 2, 4);
            list.add(c1);
            list.add(c2);
            list.add(c3);
            list.add(c4);
            foreachIterator(list);
            System.out.println("==========");
            IteratorDemo(list);
            System.out.println("=========");
            foreachLambda();
    
        }
        private static void foreachIterator(Collection cats){
            for (Cat cat : cats) {
                System.out.println(cat);
            }
            System.out.println("foreach遍历了");
        }
        private static void IteratorDemo(Collection cats){
            Iterator iterator = cats.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
            System.out.println("Iterator 遍历了");
        }
    
        private static void foreachLambda(){
            List list = new ArrayList<>();
            Cat c1 = new Cat("oo", 2, 1);
            Cat c2 = new Cat("dd", 3, 2);
            Cat c3 = new Cat("uu", 4, 3);
            Cat c4 = new Cat("oo", 2, 4);
            list.add(c1);
            list.add(c2);
            list.add(c3);
            list.add(c4);
            list.forEach((Cat cat) ->{
                System.out.println(cat);
            });
    
           // list.forEach(cat -> System.out.println(cat));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    jdk8新特性之Stream

    是元素的集合,支持顺序和并行的对原Stream进行汇聚操作
    Stream当成高版本的iterator,Iterator用户只能一个一个的遍历严肃并对其操作,而Stream只需要给出需要对其包含元素的操作,这些才做如何对应到每个元素上,由Stream完成

    Map接口

    将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射一个值
    Map:键值对的形式存在
    key唯一,value可以重复
    具体实现类:hashMap、TreeMap、HashTable、LinkedHashMap

    HashMap

    基于哈希表的Map接口,提供可选的映射操作,运行使用null值和null键,不保证映射的顺序,特别不保证该顺序恒久不变。

    package com.ty.collectionPackage;
    
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    public class MapDemo {
        public static void main(String[] args) {
            HashMapDemo();
        }
        private static void HashMapDemo(){
            Map map = new HashMap<>();
            map.put(1,"tt");
            map.put(2,"yy");
            map.put(3,"zz");
            map.put(4,"cc");
            map.put(5,"pp");
            System.out.println(map.size());
            System.out.println("===========");
            //迭代
            Set> entrySet = map.entrySet();
            for (Map.Entry e : entrySet) {
                System.out.print(e.getKey()+"-->"+e.getValue()+" ");
            }
            //迭代
            System.out.println("================");
            Set keySet = map.keySet();
            for (Integer i : keySet) {
                String value = map.get(i);
                System.out.print(i+"-->"+value+" ");
            }
            //遍历值
            System.out.println("=============");
            Collection values = map.values();
            for (String value:values){
                System.out.print(value+" ");
            }
            //foreach
            System.out.println("==========");
            map.forEach((key,value)->{
                System.out.print(key+"-->"+value +" ");
            });
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    1.实现原理:基于哈希表(数组+链表+二叉树(红黑树))
    2.默认加载因子0.75,默认数组是16
    3.把对象存储到哈希表中,把key对象通过hash()方法计算hash值,然后用hash值对数组取余数(默认是16),来决定该key在数组存储的位置,当有多个值时,以链表的形式存储,在jdk8后,当链表大于8时,链表转为红黑树,为了取值更快,存储的数据量越大,性能的表现越明显
    4.扩容原理:当数组的容量大于0.75,扩充算法:当前数组容量 << 1(相当于*2,)扩大1倍,扩充次数过多,会影响性能,重新散列,每次扩充代表哈希表散列(重新计算每个hash值的存储位置),开发中尽量减少扩充次数。
    5.线程不安全,适合单线程

    Hashtable

    实现一个哈希表,映射到相应的值,任何非null对象都可以作为键值对,为了成功在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals方法。
    1.jdk1开始使用
    2.基于哈希表实现(数组+链表)
    3.默认数组大小11,加载因子0.75
    4.扩容方式原数组大小<<1 (*2)+1
    5.线程安全,用在多线程

    **** HasMap和Hashtable区别???

    LinkedHashMap

    哈希表和链接列表实现,可预知的迭代顺序,保证顺序。
    是HashMap的子类,由于HashMap无法保证顺序,此类使用双重列表保证元素顺序。

    jdk8中map的新方法

    在这里插入图片描述

    Conllections类

    大量针对Collection和Map操作,分为四类,都是静态方法
    1.排序操作,针对List接口
    在这里插入图片描述

    队列Queue

    是一种特殊的线性表,先进先出的数据结构,只允许在表的前端front进行删除操作,在表的后端进行删除操作,进行插入操作的叫队尾,删除操作的端叫队头,队列中没有元素时,称为空队列
    在这里插入图片描述
    LinkedList实现了Queue接口
    请求队列,雄安锡队列、任务

    Deque

    一个线性collection,支持在两端插入和移除元素。支持有容量限制的双端对了,支持没有固定限制的双端队列
    接口定义在双端对了两端访问元素的方法,提供插入、移除、查询 Stack 堆栈:先进后出

  • 相关阅读:
    6_1 系统安全分析与设计
    图解Kicad导入元器件封装
    Java之面向对象(8)
    高速电路设计笔记----第二章
    商标变更的流程介绍有哪些
    代码设计:C++ 一个CSV功能类(源码)
    我的python安装在哪儿了?python安装路径怎么查?
    有趣的 scanf()
    java毕业设计电子病历系统mybatis+源码+调试部署+系统+数据库+lw
    2023-2028年中国硫氰酸胍(GTC)市场研究及前景投资预测报告
  • 原文地址:https://blog.csdn.net/weixin_44518089/article/details/136252213