一、泛型
(一)泛型接口
1.带泛型的接口
2.定义格式
interface 接口名<泛型1, 泛型2, 泛型3...> {}
3.说明
(1)在接口的声明上,定义好泛型,整个接口中都可以将接口的泛型拿来使用
(2)泛型接口被其他实现
①类实现接口时,泛型确定为了具体的类型
class 类名 implements 接口名<具体类型> { 实现接口的方法,方法使用泛型,也都成了具体的泛
型; }
②类实现接口时,泛型依然不确定,类也有自己的泛型
class 类名<泛型1, 泛型2, 泛型3...> implements 接口名 <泛型1, 泛型2, 泛型3...>{ 实现接口的方
法,方法使用泛型依然不确定; }
(二)泛型的通配符
1.符号:?
2.使用泛型时,没有使用具体的泛型声明T,而是使用了和T有关的类型,如果表示和T有关的类型
就需要使用通配符
3.第一种:使用?来表示任意类型
就是表示可以接收任意类型泛型的集合,参数集合的泛型可以和调用者集合的泛型没有任何关系
4.第二种:?extends E
确定泛型的上边界:参数泛型是调用者泛型的本类或子类,不能是父类,也不能是无关类
5.第三种:?super E
确定下边界:表示泛型是E的父类或E本身,不能是E的子类,也不能是无关类
二、Set
(一)概述
1.是Collection的子接口
2.特点:不可重复,原因就是没有索引
3.实现类
(1)HashSet,底层哈希表
(2)LinkedHashSet,底层是哈希表+链表
(二)Set集合的遍历
1.没有自己特有的方法使用Collection中的方法来遍历集合
2.第一种:toArray();转数组,遍历数组
3.第二种:Iterator();迭代器,迭代器遍历
4.第三种:toArray(T[] a);转数组,准备好跟集合相同数据类型的数组,如果数组长度小于集
合,新建数组进行存储;如果数组长度大于或等于集合,直接存储多余的位置使用默认值填充
5.第四种:增强for循环(底层也是迭代器)
for(元素的数据类型 元素名称 : 要遍历的集合或者数组) { 使用元素名称操作元素; }
三、HashSet
(一)概述
1.是Set集合的实现类
2.特点
(1)不可重复
(2)无序
(二)HashSet去重原理
1.重写hashCode方法:让不同的对象具有相同的哈希码值,不同的对象尽量要有不同的哈希码值
2.重写equals方法:通过属性值来区分不同的对象
(三)原理总结
1.某个对象obj,即将要存储在HashSet集合中的时候,首先要计算对象的哈希码值
2.在集合中所有元素的哈希码值,都和obj类型不同,就直接将obj对象进行存储
3.如果集合中存在元素和obj对象的哈希码值相同,并不能说明obj对象就在集合中存在
4.会进而调用equals方法判断obj对象的属性值是否相同
5.如果不相同,直接存储,如果相同,直接覆盖
四、LinkedHashSet
1.是HashSet的子类
2.特点
(1)有序:存储顺序和读取顺序保持一致
(2)不可重复
五、Map
(一)概述
1.体系位置:双列集合的顶层接口
2.类比理解:单词含义:地图,在地图上的每一个点,都表示生活中的一个具体的位置,地图的点
和生活中的位置有着一一对应的关系,这种关系是通过罗列的形式展现出来的
3.数据结构:描述的是一个数据(key)到另一个数据(Value)的映射关系
(1)Key(键):有规律的,不可重复的,容易记忆的
(2)Value(值):没有规律的,不容易记忆的,可以允许重复
(3)操作:通过Key来寻找Value,一个Key只能对应一个Value
4.HashSet就是HashMap中键的那一列
(二)常用方法
1、put(K key, V value):添加功能(当集合中不存在指定键时),将键值对添加到指定集合中;修
改功能(当集合中已经存在指定键),根据键修改值
2、remove(Object key):根据键,删除键值对;如果键不存在,则不操作;如果键存在,删除键
值对并返回键对应的值
3、clear():清空集合
4、size():返回集合中键值对个数
5、get(Object key):根据键获取对应值,如果键不存在,则返回null
6、containsKey(Object key):判断集合中是否存在指定键
7、containsValue(Object value):判断集合中是否存在指定值
(三)第一种遍历
1.获取Map集合中所有的键,存储到一个Set集合中,之后遍历Set集合,根据键获取值
2.获取Map中键的方法:keySet()
3.遍历Set集合
(1)迭代器遍历
(2)增强for循环遍历
4.根据键获取值的方法:get(Object key)
(四)第二种遍历
1.获取Map集合中所有的键值对对象(Entry),存储在一个Set集合中,遍历Set集合,拿到每一个
键值对对象,根据键值对对象提供的方法进一步去获取键、获取值
2.遍历Set集合,获取每一个键值对对象:迭代器、增强for循环的方式遍历
3.获取键值对对象的方法:entrySet();返回值类型:Set<Map.Entry<K,V>>
4.得到键值对对象之后获取键值
(1)获取键:getKey()
(2)获取值:getValue()
(五)HashMap和Hashtable的区别
1.相同点:都是Map接口的实现类,都是双列集合,底层都是哈希表
2.不同点:
(1)HashMap不安全,Hashtable安全
(2)HashMap效率高,Hashtable效率低
(3)HashMap允许存储null值null键,Hashtable不允许
(4)HashMap初始容量为16,Hashtable初始容量为11
(5)HashMap扩容时扩容为原来的2倍,Hashtable扩容为原来的2倍+1
(6)HashMap会重写计算hash码值,Hashtable会直接使用hashCode
(7)HashMap出现在JDK1.2,Hashtable出现在JDK1.0
六、Collections工具类
1、sort(List list):对集合中的元素进行升序排序
2、binarySearch(Collection list, T key):在指定的集合中搜索指定元素,如果查找到就返回元素索
引,否则返回-1,注意在使用该方法之前必须对集合进行排序
3、frequency(Collection c, Object o):返回一个指定元素o在指定集合中出现的次数
4、replaceAll(List list, T oldVal, T newVal):使用一个值,在指定集合中替换另一个值
5、reverse(List list):反转List集合元素顺序
6、max、min:获取集合中的最大值或者最小值
7、shuffle(List list):随机打乱集合中的元素顺序
8、swap(List list, int i, int j):交换指定集合中指定两元素的位置
9、unmodifiableList(List list):返回一个集合的副本,但是副本不能进行修改【List、 Set、Map】
10、synchronizedList(List list):返回一个参数集合的线程安全的集合【List、Set、Map】