集合框架体系
复习目标
一.掌握JAVA集合框架体系结构,需要明白各接口与类中间的关系。掌握List,set,Map之间区别及使用场景。
集合框架的体系结构
集合框架大致分为两类容器,一类是以元素集合存储的Collection,一类是以键值对存储的Map。如第一个图所示,Collection和Map是两个接口,整个集合框架是围绕一组标准接口而设计的,框架还包括接口的实现类,算法则是实现接口的对象的相关有用的计算。
List、set、Map区别和使用场景
1、list存取有序,允许重复元素 set存取无序,不能重复元素 Map 中存储的数据是没有顺序的, 其 key 是不能重复的,它的值是可以有重复的。
2、set无序,删除插入效率更高,只允许一个null值(元素不能重复)
3、使用场景:
- 想要快速访问——ArrayList读快改慢、多次删除修改——linkedList改快读慢
- 想要不出现重复的元素——set的实现类
- 想要键值对保存——Map的实现类
二.掌握ArrayList,LinkedList及Vector间的区别。掌握ArrayList接LinkedList的底层实现及各自优缺点。
ArrayList,LinkedList及Vector间的区别
ArrayList是基于动态数组数据结构,LinkedList是基于链表的结构,所以在依据索引查询时,ArrayList更快、LinkedList在修改删除更快,ArrayList需要移动数据,LinkedList只需要修改节点的地址,Vector的大致实现和ArrayList相同,但是在每个操作都加上了synchronized修饰,保证了线程安全,所以查询效率低
三.掌握迭代器使用,掌握list set 及Map的遍历方式。
ListIterator<Dazyhkh>iterator=lists.listIterator();//创建集合的迭代器
while (iterator.hasNext()) {//判断循环
System.out.println(iterator.next());//获取对象的引用的拷贝
}
遍历方式
详情:https://blog.csdn.net/zgs921364401/article/details/81699508
for循环 | 迭代器 | foreach | |
---|---|---|---|
list | for (){} | Iterator iterator = list.iterator(); | for(E e : list){} |
set | Iterator iterator = set.iterator(); | for(E e : set){} | |
Map | Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); | for(Map.Entry<String, String> entry : map.entrySet()) |
四.掌握HashMap及HashTable间的区别与联系
HashMap和Hashtable的底层实现,都是数组+链表结构。
1、HashTable的底层实现方式多了synchronized,所以线程安全,但是效率较低
2、HashMap可使用null作为key,Hashtable不允许null作为key HashMap以null作为key时,总是存储在table数组的第一个节点上
3、HashMap是对Map接口的实现,Hashtable对Map接口的实现和对Dictionary抽象类的继承
五.掌握HashMap的底层实现,理解一个K-V键值对的存取过程,掌握HashMap JDK1.8新特性。
HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。
JDK1.8增加了红黑树部分而当链表长度太长(默认超过8)时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能.
六.理解TreeSet的原理与使用。(TreeSet底层实现https://blog.csdn.net/zhaojie181711/article/details/80494318)
TreeSet是一个“没有重复元素的、有序的”set集合,是一个不同步的非线程安全的二叉树
TreeSet的底层是这样的一个二叉树(如上图所示),当我们存储的第一个元素的时候,会把第一个元素存在“根”的位置,存储第二个元素的时候,TreeSet 底层会调用 compareTo() 方法:
1)如果 compareTo()的返回结果为 0 则这两个元素是一样的,就不会存储,
2)如果返回负数,则第二个元素比第一个元素小,把第二个元素存储在左孩子的位置。
3)如果返回正数,则第二个元素比第一个元素大,把第二个元素存储在右孩子的位置。
七.理解ConcurrentHashMap使用及实现原理。
介绍
ConcurrentHashMap从JDK1.5开始随java.util.concurrent包一起引入JDK中,主要为了解决HashMap线程不安全和Hashtable效率不高的问题。众所周知,HashMap在多线程编程中是线程不安全的,而Hashtable由于使用了synchronized修饰方法而导致执行效率不高;因此,在concurrent包中,实现了ConcurrentHashMap以使在多线程编程中可以使用一个高性能的线程安全HashMap方案。
而JDK1.7之前的ConcurrentHashMap使用分段锁机制实现,JDK1.8则使用数组+链表+红黑树数据结构和CAS原子操作实现ConcurrentHashMap;
八.了解CopyOnWriteArrayList,CopyOnWriteArraySet,ArrayBlockingQueue,LinkedBlockingQueue,了解其各自特点及使用场景。
CopyOnWriteArrayList | CopyOnWriteArraySet | ArrayBlockingQueue | LinkedBlockingQueue | |
---|---|---|---|---|
原理 | 底层是用volatile transient声明的数组 array; | CopyOnWriteArraySet包含CopyOnWriteArrayList对象,它是通过CopyOnWriteArrayList实现的,所以CopyOnWriteArraySet相当于通过通过动态数组实现的“集合” | 由数组支持的有界阻塞队列 | 由链表结构组成的有界队列 |
特点 | 读写分离,写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array | 和CopyOnWriteArrayList一样,是通过volatile和互斥锁来实现的。 | 按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。 | 队列按照先进先出的顺序进行排序 |
优缺点 | 读不加锁,内存占用多,不能实时读取数据 | 读不加锁,内存占用多,不能实时读取数据; | 有界;用于存储队列元素的存储空间是预先分配的,使用过程中内存开销较小(无须动态申请存储空间) | 可有界可以无界;用于存储队列元素的存储空间是在其使用过程中动态分配的,因此它可能会增加JVM垃圾回收的负担 |
使用 | public E set(int index, E element);public boolean add(E e);public E get(int index) | public boolean add(E e);public boolean remove(Object o); | public boolean add(E e);public boolean offer(E e) | boolean add(E e);E take() :取出当前队列首元素 |
常见知识点
1.Collection和Collections的区别
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
引用
国科学院
菜鸟教程
https://www.runoob.com/java/java-collections.html
HashMap与Hashtable的区别与联系
https://blog.csdn.net/jiahao1186/article/details/83586515
掌握HashMap JDK1.8新特性。
https://blog.csdn.net/qq_36520235/article/details/82417949
TreeSet底层实现
https://blog.csdn.net/zhaojie181711/article/details/80494318
Java中的集合——TreeSet
https://blog.csdn.net/y0q2t57s/article/details/81295219