集合进阶的理解

目录

集合进阶:

        集合类的特点:

        集合类体系结构:

        Collection(接口):

                概述:

                常用方法:​

                Collection集合的遍历:

        List(接口):

                概述:

                特点:

                特有方法:​

                 并发修改异常(ConcurrentModificationException):

                 增强for循环:

                数据结构:

                ArrayList(实现类):

                LinkedList(实现类):

        Set(接口):

                        概念和特点:

                        哈希值:

                       哈希表:

                        HashSet(实现类):

                        LinkedHashSet(实现类):

                        TreeSet(实现类):

                        自然排序Comparable和比较器排序Comparator的使用:

        Map(接口):

                概述:

                基本功能:​

                获取功能:​

                遍历:

                HashMap(实现类):

                LinkedMap(实现类):

                TreeMap(实现类):

        Colletions:

                概述:

                常用方法:

泛型:

        概念: 

        格式:

        好处:

        泛型类:

        泛型方法:

        泛型接口:

        类型通配符:

                概述:

                格式:

                上限与下限:

        可变参数:

                概述:

                格式:

                注意实现:


集合进阶:

        集合类的特点:

                提供一种存储空间可变的存储模型,存储的数据容量可以发生改变

        集合类体系结构:

                

                可以根据集合内容单列和双列把集合分为Collection和Map两大类,创建Collection,Map集合的对象是通过多态的方式,Collection,Map,List,Set只是接口,具体实现类为ArrayList等

        Collection(接口):

                概述

                                (1)是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素

                                (2)JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现。

                创建Collection集合的对象是通过多态的方式,Map只是接口,具体实现类为ArrayList等

                常用方法:

                Collection集合的遍历:

                        Iterator:

                                迭代器,集合的专用遍历方式。通过集合调用iterator()方法使用。正是因为迭代器是通过集合的iterator()方法得到的,所以我们说它是依赖于集合而存在的。

                        Iterator中的常用方法:

                                (1)E next():返回迭代中的下一个元素。
                                (2)boolean hasNext():如果迭代具有更多元素,则返回true。

        List(接口):

                概述:

                                (1)有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素。
                                (2)与Set集合不同,列表通常允许重复的元素。

                特点:

                                (1)有序:存储和取出的元素顺序一致
                                (2)可重复:存储的元素可以重复

                特有方法:

                 并发修改异常(ConcurrentModificationException):

                        原因:迭代器遍历的过程中,通过集合对象修改了集合中的元素,造成了迭代器获取元素中判断预期修改值和实际修改值不一致。

                        解决方案:用for循环遍历,然后用集合对象做对应的操作即可

                ListIterator(列表迭代器):

                        概念:

                                (1)通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器。
                                (2)用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置。

                        常用方法:

                                (1)E next(): 返回迭代中的下一个元素。
                                (2)boolean hasNext(): 如果迭代具有更多元素,则返回true。
                                (3)E previous(): 返回列表中的上一个元素。
                                (4)boolean hasPrevious(): 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true。
                                (5)void add(E e): 将指定的元素插入列表。

                 增强for循环:

                        概念:

                                (1)简化数组和Collection集合的遍历。
                                (2)实现Iterable接口的类允许其对象称为增强型for语句的目标。
                                (3)它是JDK5之后出现的,其内部原理是一个Iterator迭代器。

                        格式:for(元素数据类型 变量名:数组或者Collection集合){
                                            //在此处使用变量集合,该变量就是元素
                                        }

                        范例:int[] arr = {1,2,3,4,5};
                                   for(int i: arr){
                                      System.out.println(i);
                                   }

                数据结构:

                        栈:

                        队列:

                        数组:

                        链表:

                ArrayList(实现类):

                        特点:ArrayList是List接口实现类的三者之一,它的底层是Object数组,ArrayList查询数据可以通过索引,十分快速,便利。然而ArrayList进行增删操作时,每次操作完剩余的数据就会向前或向后移动,效率很低。总结就是,ArrayList查询效率高,增删效率低。

                LinkedList(实现类):

                        特点:LinkedList是List接口实现类的三者之一,它的底层是链表,LinkedList进行增删操作时十分方便,只需要将新的数据加入链表中进行连接,或者删除数据,剩下的数据连接即可。而进行查询操作时十分麻烦,由于没有索引,所以每次查询都必须从头开始遍历。总结就是,LinkedList增删效率高,查询效率低。

                        特有功能

        Set(接口):

                        概念和特点:

                                (1)不包含重复元素的集合
                                (2)没有带索引的方法,所以不能使用普通for循环遍历。

                        哈希值:

                                概念:

                                        是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值,可以通过方法hashCode()返回对象的哈希码值。

                                特点:

                                        ·同一个对象多次调用hashCode()方法返回的哈希值是相同的。
·默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同。

                       哈希表:

                                在JDK1.8之前,哈希表由数组和链表组成,在JDK1.8之后,哈希表由数组,链表和红黑树组成。简单来讲,加入一个哈希表存储空间为16,当一个数据存入哈希表中时,由特定的算法通过哈希值存入到0-15中的一个,当新的数据存入时,如果哈希值相同,就通过equals方法判断这个位置存在的数据和新数据是不是相同,如果不是,就通过链表的形式连接起来,如果相同,就不存储。

                        HashSet(实现类):

                                HashSet是Set的实现类的其中一个。

                                特点:

                                        (1)底层数据结构是哈希表
                                        (2)对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
                                        (3)没有带索引的方法,所以不能使用普通for循环遍历
                                        (4)由于是Set集合,所以是不包含重复元素的集合

                                HashSet集合保证元素唯一性源码分析:

                        LinkedHashSet(实现类):

                                LinkedHashSet是Set接口实现类中的一个,能实现有序。

                                特点:

                                        (1)哈希表和链表实现的Set接口,具有可预测的迭代次序
                                        (2)由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
                                        (3)由哈希表保证元素唯一,也就是说没有重复的元素

                        TreeSet(实现类):

                                TreeSet是Set接口实现类中的一个,能实现排序。

                                特点:

                                        (1)元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方法取决于构造方法。(TreeSet()方法,根据其元素的自然排序进行排序,TreeSet(Comparator comparator)方法,根据指定的比较器进行排序)
                                        (2)没有带索引的方法,所以不能使用普通for循环遍历
                                        (3)由于是set集合,所以不包含重复元素的集合

                        自然排序Comparable和比较器排序Comparator的使用:

                                Comparable:

                                        (1)用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
                                        (2)自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法
                                        (3)重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

                                Comparator:

                                        (1)用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序
                                        (2)比较器排序,就是让集合构造方法接受Comparator的实现类对象,重写compare(T o1, T o2)方法
                                        (3)重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

        Map(接口):

                概述:

                        (1)Interface Map <K,V>    K:键的类型; V:值的类型
                        (2)将键映射到值的对象;不能包含重复的键;每个键可以映射到最多一个值

                创建Map集合的对象是通过多态的方式,Map只是接口,具体实现类为HashMap等

                基本功能:

                获取功能:

                遍历:

                        方式1:
                                (1)获取所有键的集合。用keySet()方法实现
                                (2)遍历键的集合,获取到每一个键。用增强for实现
                                (3)根据键去找值。用get(Object key)方法实现

                        方式2:

                                (1)获取所有键值对对象的集合,Set<Map.Entry<K,V>>entrySet():获取所有键值对对象的集合
                                (2)遍历键值对对象的集合,得到每一个键值对对象,用增强for实现,得到每一个Map.Entry
                                (3)根据键值对对象获取键和值,用getKey()得到键,用getValue()得到值

                HashMap(实现类):

                        底层是哈希表,所以它的底层本质也和哈希表一样,JDK1.8之前由数组,链表组成,1.8之后由数组,链表和红黑树组成。它的哈希表是用来存储Map中的Key,这也就是Key为什么能保持不重复的原因。

                LinkedMap(实现类):

                        和LinkedMap类似,底层的数据结构是链表和哈希表 元素有序 并且唯一
元素的有序性由链表数据结构保证 唯一性由 哈希表数据结构保证。Map集合的数据结构只和键有关。

                TreeMap(实现类):

                        和TreeSet类似,键的数据结构是红黑树,可保证键的排序和唯一性
排序分为自然排序和比较器排序,线程是不安全的效率比较高。同样可以使用自然排序或是Comparable和Comparator的定制排序。

        Colletions:

                概述:

                        是针对集合操作的工具类

                常用方法:

                        (1)public static <T extends Comparable<? super T>> void sort(List<T> list):将指定的列表按升序排序。
                        (2)public static void reverse(List<?>list):反转指定列表中元素的顺序。
                        (3)public static void shuffle(List <?> list):使用默认的随机源随机排列指定的列表。

泛型:

        概念: 

                它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。可以理解为利用泛型来给集合定义一个类型,来规定集合里数据的类型,避免后面调用集合数据的不方便。

        格式:

                (1)<类型>:指定一种类型的格式。这里的类型可以看成是形参
                (2)<类型1,类型2...>:指定多种类型的格式,多种类型之间用逗号给开。这里的类型可以看成是形参
                (3)将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型

        好处:

                (1)把运行时期的问题提前到了编译期间
                (2)避免了强制类型转换

        泛型类:

                (1)格式:修饰符 class 类名<类型>{ }
                (2)范例:public class Generic<T>{ }
此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于标识泛型

        泛型方法:

                (1)格式:修饰符<类型>返回值类型方法名(类型 变量名){ }
                (2)范例:public<T>void show(T t){ }

        泛型接口:

                (1)格式:修饰符 interface 接口名<类型>{ }
                (2)范例: public interface Generic<T>{ }

        类型通配符:

                概述:

                        为了表示各种泛型List的父亲,可以使用类型通配符

                格式:

                        (1)List<?>:表示元素类型位置的List,它的元素可以匹配任何的类型
                        (2)这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中

                上限与下限:

                        概述:

                                如果说我们不希望List<?>是任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配符的上限

                        上限:

                                (1)类型通配符上限:<?extends 类型>
                                (2)List<? extends Number>:它表示的类型是Number或者其子类型

                        下限:

                                (1)类型通配符下限:<?super类型>
                                (2)List<? super Number>:它表示的类型是Number或者其父类型

        可变参数:

                概述:

                        可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了

                格式:

                        (1)格式:修饰符返回值类型 方法名(数据类型...变量名){ }
                        (2)范例:public static int sum(int...a){ }

                注意实现:

                        (1)这里的变量其实是一个数组
                        (2)如果一个方法有多个参数,包含可变参数,可变参数要放在最后

        


                

                        

                                                

                                

                

                

                        

                        

        

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值