List有序可重复
ArrayList:查询快,底层是数组
LinkedList:添加删除块,底层是双向链表
Set无序不可重复
HashSet:底层是散列表
TreeSet:底层是红黑树,元素必须有序
Map 无序,key不能重复,value能重复,保存映射关系
HashMap:底层散列表
TreeMap:底层是红黑树,元素必须有序
1. 散列表
1.1. 概述
1.2. HashSet
当我们使用HashSet的时候,其实就等于是在使用HashMap
添加数据的时候,虽然调用的是HashSet的add方法,但是本质还是调用map的put方法
PS:在map中,put是添加操作
而map中,需要保存的是k和v映射关系,所以在set中有一个变量保存了value的值,所以我们在进行set添加的时候只操作了map中的key,value值我们不再关心
2. Map
只要是保存键值对的用map
2.1. 概述
散列表:用于存储键值对映射关系(K--V),存储方式为数组中保存链表,用于解决哈希冲突问题
Java中散列表对应的就是HashSet
但是从1.8开始,为了提高查询效率,引进了红黑树
想要把数据添加在散列表中,需要根据key生成hash值(Java中指的hashCode方法),然后根据算法得到数组下标
如果下标中没有对应的数据,则添加到数组中即可
如果下标中有对应的数据,则需要调用要添加的key和对应的数据进行比较(equals),如果 发生重复,则value值替换
如果不重复,说明是hash冲突,则把k--v插入到对应的链表中(节点对象中,包含 4个属性:hash值、key、value、next)
相同对象生成多次hash,一定是相同的值,但是不同对象也有可能生成相同的hash值,叫哈希冲突
2.2. 继承体系
2.3. 常用方法
2.4. HashMap
遍历:
2.5. TreeMap
默认自带一个Comparator,如果排序顺序不满足或者其他原因,则可以覆写Comparator或着Comparable
会按照key排序,所以使用treeMap时,key必须有两个比较器中任意一种
注意,因为TreeMap会排序,需要比较,所以类型必须一致
意味着treeMap中必须保存同类型的数据
3. 泛型
3.1. 概述
泛型:类型检查
没有使用泛型之前,集合中可以存储任意类型的数据,均会转型为Object类型
优点:什么 都能放
缺点:由于什么都能放,导致获取数据时,得到的是Object,想要使用对象特有属性时,需要强制类型转换(向下转型)
使用泛型之后,集合中只能保存单一类型的数据
优点:由于保存数据的类型一致,所以使用的时候,不需要向下转型
缺点:只能保存单一数据类型
泛型:只能写引用类型,不能写基本类型,如果要保存数字,应该写Integer类型(对应的包装类)