Java基础进阶_day09_(Collection集合和Map集合总结)
1. Collection集合总结
* |--List集合:元素有序(指存储顺序),元素可重复,有索引值
List集合中的有些方法(contains和remove)底层是是使用equals方法进行判断两个元素是否相等,
则自定义对象需要重写equals方法,在equals方法中定义两个自定义对象是否相同的规则.
|--ArrayList集合:
底层数据结构是数组,查询快,增删慢,线程不安全,效率高
|--Vector集合:
底层数据结构是数组,查询快,增删慢,线程安全,效率低
|--LinkedList集合:
底层数据结构是链表,查询慢,增删快,线程不安全,效率高
|--Set集合:元素无序,元素唯一,无索引值
|--HastSet集合:本质是HashMap集合
底层数据结构是哈希表(哈希表是元素为链表的数组),查询快,增删快
保证元素的唯一性:
依赖hashCode和equals方法,元素对象所属类必须实现这两个方法.
|--LinkedHashSet集合:
底层数据结构是链表和哈希表
链表保证元素的有序(存取顺序一致)
哈希表保证元素的唯一性(元素所属的类必须实现hashCode和equals方法)
|--TreeSet集合:本质是实现了NavigableSet(接口)的TreeMap类
底层数据结构是红黑树(自平衡的二叉树)
保证元素排序:
自然排序:使用TreeSet集合的无参构造方法
元素对象所属的类必须实现Comparable接口,实现compareTo方法,在该方法中定义排序的规则.
比较器排序:使用TreeSet集合的有参构造方法,参数是实现Comparator接口的子类
元素对象不需实现Comparable接口,将实现Comparator接口compare方法中的匿名子类对象作为创建集合时的参数
在Comparator接口匿名对象compare方法中定义排序规则.
保证元素的唯一性:
集合对象添加元素时结合元素排序的方式,判断集合中是否包含该元素,如果包含就不添加进集合.
2.Map集合总结
Map集合:是双列集合的顶层接口,键唯一,值可重复(底层数据结构只针对键有效,对值无效)
|--HashMap集合:无序(存取顺序),键唯一,值可重复
底层数据结构是哈希表,保证键的唯一性
当键是自定义数据类型时,该自定义对象的类的需要重写hashCode和equals方法以保证键的唯一性
|--LinkedHashMap集合:有序(存取顺序),键唯一,值可重复
底层数据机构是链表和哈希表结构
链表保证元素存取有序
哈希表保证键唯一(当键是自定义对象时,自定义对象所属的类需重写hashCode和equals方法)
|--TreeMap集合:键有序键值对有序),键唯一,值可重复
键的底层数据结构是红黑树(自平衡二叉树),保证键的唯一和有序
键的排序:
自然排序:
当键是自定义对象时,该对象所属的类需实现Comparable接口,重写compareTo方法,在该方法中定义排序规则
比较器排序:
当键是自定义对象时,该对象所属类不需实现Comparable接口,
只需要在创建集合对象时将实现Comparator接口的匿名子类对象(匿名子类对象重写compare方法,定义排序规则)作为参数;
当自定义对象实现了Comparable接口,且在创建集合对象时也传入Comparator接口的比较器,则优先使用比较器定义的排序规则.
3.Collection集合和Map集合的区别
Map集合:双列集合的顶层接口,存储的元素时键值对,键是唯一的,键映射的值可以重复;
Collection集合:单列集合顶层接口,存储的是单值元素,其子接口Set元素唯一,子接口List的元素可重复.
4.Collection集合Map集合的底层数据结构特点
|--Collection集合:单列集合(底层数据结构针对存储的元素有效)
|--数组结构:ArrayList,Vector
数据查询快,增删慢
|--链表结构:LinkedList
数据查询慢,增删快
|--哈希表:HashSet
保证数据唯一性,依赖于hashCode和equals方法
|--二叉树:TreeSet
自然排序:依赖Comparable接口
比较器排序:依赖Comparator接口
|--哈希表和链表:LinkedHashSet
哈希表保证数据的唯一性
链表保证数据有序(存取顺序相同)
|--Map集合:双列集合(底层数据是针对键,对值无效)
|--哈希表:HashMap
保证键的唯一性,哈希表依赖键的元素的hashCode和equals方法
|--哈希表和链表:LinkedHashMap
哈希表保证键的唯一性(依赖键的元素的hashCode和equals方法)
链表保证键值对有序(存取顺序)
|--二叉树:TreeMap
自然排序:依赖Comparable接口
比较器排序:依赖Comparator接口
5.Collection集合和Map集合的元素遍历方式
|--Collection集合元素遍历:
|--List集合:ArrayList,Vector,LinkedList
1.普通for循环遍历(有索引)
2.增强for循环遍历:需要注意集合元素的并发修改异常
3.迭代器遍历
Iterator遍历:需要注意集合元素的并发修改异常
ListIterator遍历:遍历数据的同时可以使用迭代器对象修改集合中的元素
4.将集合元素转换为对象数组,再使用for循环遍历
|--Set集合:HsahSet,TreeSet
1.增强for循环遍历
2.迭代器遍历(只有Iterator方式):需要注意集合元素的并发修改异常
3.将集合元素转换为对象数组,再使用for循环遍历
|--Map集合元素遍历:
1.通过集合的keySet()方法获取键的集合,然后遍历键的集合再获取每个键对应的值
2.通过集合的entrySet()方法获取键值对的集合,遍历集合,获取每个键和值
6.Collection集合和Map集合选用原则
* 键值对需求:
|--是:Map集合,是双列集合的顶层接口,键唯一,值可重复(底层数据结构只针对键有效,对值无效)
|--键排序需求:
|--是:TreeMap集合,键有序,值可重复
排序方式:
自然排序:使用TreeMap集合的无参构造创建集合对象
自定义对象所属的类需实现Comparable接口中的compareTo方法,在该方法中定义排序规则;
比较器排序:使用TreeMap集合的有参构造方法(参数是实现Comparator接口的匿名子类对象)
自定义对象所属类可以不实现Comparable接口和定义排序规则,创建集合对象时的参数是实现Comparator接口的匿名子类对象,
该匿名对象需重写compare方法,在该方法中定义排序规则
|--否:HashMap集合,元素无序(存取顺序),键唯一,值可重复
当键是自定义对象时,该对象所属的类需要重写hashCode和equals方法,在equals方法中定义对象相同的规则.
|--否:Collection集合选用:根据需求选择集合类,一般使用ArrayList集合
|--元素唯一性需求:
|--是:Set集合,一般使用HashSet集合
|--排序需求:
|--是:TreeSet集合
|--否:HashSet集合
|--否:List集合,一般使用ArrayList集合
|--安全需求:
|--是:Vector集合
|--否:ArrayList或LinkedList集合
|--查询操作多:
ArrayList集合
|--增删操作多:
LinkedList集合