目录
并发修改异常(ConcurrentModificationException):
自然排序Comparable和比较器排序Comparator的使用:
集合进阶:
集合类的特点:
提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
集合类体系结构:
可以根据集合内容单列和双列把集合分为Collection和Map两大类,创建Collection,Map集合的对象是通过多态的方式,Collection,Map,List,Set只是接口,具体实现类为ArrayList等
Collection(接口):
概述:
(1)是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
(2)JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现。
创建Collection集合的对象是通过多态的方式,Map只是接口,具体实现类为ArrayList等
常用方法:![](https://img-blog.csdnimg.cn/20210812151331240.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5ndGlhbmJhMjIy,size_16,color_FFFFFF,t_70)
Collection集合的遍历:
Iterator:
迭代器,集合的专用遍历方式。通过集合调用iterator()方法使用。正是因为迭代器是通过集合的iterator()方法得到的,所以我们说它是依赖于集合而存在的。
Iterator中的常用方法:
(1)E next():返回迭代中的下一个元素。
(2)boolean hasNext():如果迭代具有更多元素,则返回true。
List(接口):
概述:
(1)有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素。
(2)与Set集合不同,列表通常允许重复的元素。
特点:
(1)有序:存储和取出的元素顺序一致
(2)可重复:存储的元素可以重复
特有方法:![](https://img-blog.csdnimg.cn/20210812163555971.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5ndGlhbmJhMjIy,size_16,color_FFFFFF,t_70)
并发修改异常(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等
基本功能:![](https://img-blog.csdnimg.cn/20210812175521732.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5ndGlhbmJhMjIy,size_16,color_FFFFFF,t_70)
获取功能:![](https://img-blog.csdnimg.cn/20210812175547162.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5ndGlhbmJhMjIy,size_16,color_FFFFFF,t_70)
遍历:
方式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)如果一个方法有多个参数,包含可变参数,可变参数要放在最后