1.集合概况
1.1 接口
顶级接口:Collection和map接口,Collection接口存储的单个对象,map存储的使key-value键值对对象 Collection顶级接口下的子接口:
- 1.list接口:存储的数据有序且重复
- 2.set接口:存储的数据使无序的且不能重复
- 3.Queue接口:多使用优先级处理
1.2 List接口
List接口实现类共有特征: 1.数据有序 2.数据可以重复 3.数据可以为null
1.2.1 ArrayList类
1.基本特点:
- 数据插入有序
- 数据是可以重复的
- 存储的数据可以为null
- 数据结构为数组
- 集合可以自动扩大
2.自定义实现 3.源码剖析(JDK版本基于1.7实现):
- 继承关系
- 属性即默认值
- 构造函数
- 底层数据结构
- 扩容机制
- 常用方法:add()、remove()、get()
4.应用场景 (数据是有序/数据可以重复/数据是可以存储空)在查询较高的场景
1.2.2 LinkedList类
1.基本特点
2.源码剖析:
3.应用场景 (数据是有序/数据可以重复/数据是可以存储空)在修改比较高的场景下
1.2.3 Vector类
线程安全集合类
2.Map接口
2.1 HashMap类
1.特点:
- 底层数据结构是hash表(数组+链表)
- 元素重复问题:(key是不能重复,value可重复)
- 元素有序问题:插入时无序的
- 元素是否可以为空:key和value都可以为空
- 默认大小:16
- 扩容大小:2倍关系扩容
2.重点
- 元素如何插入?add()
- 如何移除元素?remove()
3.应用场景 数据统计场景
2.2 LinkedHashMap类
1.特点:
- 底层数据结构是哈希表
- 继承自HashMap:具有HashMap所有的特点
- 数据有序:插入有序,访问有序
2.重点: 如何做到数据有序?添加两个属性:维护一个双向的链表接口 3.应用场景 数据统计且数据有序(统计数据出现的次数且如果数据次数相等按照插入顺序)
2.3 HashTable类
1.特点:
- 底层数据结构是哈希表
- 数据重复问题:(key不能重复,value可以重复)
- 元素是否可以为null:key和value都不能为null
- 数据有序问题:数据无序
- 线程安全:HashTable是线程安全的
- 默认大小:11
- 扩容大小:2倍+1
2.HashMap和HashTable和ConcurrentHashMap的区别?
- HashMap线程不安全,数组+链表+红黑树
- HashTable线程安全,锁住整个对象,数组+链表
- ConcurrentHashMap线程安全,CAS+同步锁,数组+链表+红黑树
- HashMap的key、value均可为null。而其他的两个类不支持
3.应用场景:数据统计问题(考虑线程安全问题时只能用该集合)
2.4 WeakHashMap类
1.特点:
2.java中四种引用
- 强引用(strong):强引用所作用对象在内存不足抛出OOM的问题时都不会回收作用的对象
- 软引用(soft):当内存不足时,在发生GC操作时,软引用所作用的对象会被回收
- 弱引用(weak):只要发生GC操作,无论内存是否充足,弱引用所作用对象会被回收
- 虚引用(phantom):和对象的生命周期无关,主要是来提醒对象被回收
3.应用场景:在内存紧张情况下,将非关键信息存放在该集合中
2.5 TreeMap类
1.特点:
- 数据会按照属性的特征进行排序
- 底层的数据结构:使用红黑树
2.应用场景 数据排序
3.set接口
3.1 HashSet类
1.特点:
- HashSet实现基于HashMap:具有HashMap 所有特点
- 数据不能重复
- 可以存储null值
- 数据是无序的
2.重点: 如何通过HashMap实现HashSet? HashMap中存储key-value键值对,set接口的实现类都是存储单种类型的元素,set的实现中使用了HashMap中的key来存储元素,Value值给定的是一个Object对象填充。 3.应用场景 数据去重场景
3.2 LinkedHashSet类
1.特点
- LinkedHashSet是基于LinkedHashMap实现的
- 元素是不能重复的
- 可以存储null值
- 数据是有序的(插入和访问有序)
2.应用场景 数据去重且数据有序
3.3 TreeSet类
1.特点:
- TreeSet是基于TreeMap实现的
- 数据元素是按照属性进行排序的
2.应用场景 数据去重且按照属性特征大小排序
4.Queue接口
4.1 PriorityQueue类
1.特点
- 底层数据结构是堆结构,默认是小根堆
- 优先级队列保证取出的数据都是队列最小/最大的
2.重点: 小根堆的插入元素和删除元素的移动过程 3.应用场景 Top k 问题
5.其他
5.1迭代器(Iterator)
5.1.1迭代器介绍
迭代器提供了一种访问集合/容器的访问方式,而不用暴露容器内部实现细节,是一种设计模式
5.1.2 迭代器的使用(3个方法)
1.next():获取当前元素 2.hasNext():判断是否有下一个元素 3.remove():删除当前元素
5.1.3 自定义迭代器
1.集合要具有迭代器功能需要在集合类上实现Iterable接口,该接口就含有iterator()方法 2.自定义类该类实现Iterable接口,该接口是包含迭代器三个方法 3.在iterator()方法中实现实例化第二部自定义类
5.1.4 扩展点
1.Iterable接口在所有集合中都可以使用,ListIterable是List接口下特有的迭代器 2.Map接口中的迭代器使用:以键值对(entrySet方法)、以键形式(keys方法)、以值形式(Value)遍历 3.在通过迭代器遍历时删除抛出ConcurrentModificationException异常问题
5.2比较器
重点: comparable和comparator区别?(treeMap/treeSet/priorityqueue)都使用比较器
5.3 工具类(Collections)
线程安全的方法,二分查找…
今天也要好好学习呀~
|