每天进步一点点,坚持下去,你总是会不一样的。 加油!
最近在整理Java常用的一些基础、ZooKeeper、Spring全家桶、源码、Dubbo、Elasticsearch、Redis、MySql、RabbitMQ、Kafka、Linux 、微服务等技术栈。
持续更新中,欢迎关注我!
我们知道,在集合Collection中使用最多的就是List和Set和Queue。
今天就来把这块的知识给好好梳理一下,也希望能给你一点点帮助。
一、List剖析
List 有序、可重复
1、ArrayList所继承的类和实现的接口
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
数据有序排序,每个数据都有下标,直接可以根据下标快速查定位到数据。
2、LinkedList所继承的类和实现的接口
public class LinkedList extends AbstractSequentialList
implements List, Deque, Cloneable, java.io.Serializable
数据结构是双向链表,每个数据的头记录了上一个数据的尾,每个数据的尾记录了下个数据的头。
总结
1、有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引;
2、数据类型决定了他们各自的特性,查找和增删各有优劣;
3、数组直接可以根据下标查询,大批量数据下优于链表,链表需要便遍历头到尾;
4、大批量增删数组就稍微逊于链表了,会有数据的移动,而链表只需要移动指针即可。
二、Set剖析
Set值唯一
1、HashSet底层基于HashMap
public class HashSet extends AbstractSet
implements Set, Cloneable, java.io.Serializable
public HashSet() { map = new HashMap<>();}
2、TreeSet底层基于TreeMap
public class TreeSet extends AbstractSet
implements NavigableSet, Cloneable, java.io.Serializable
public TreeSet() { this(new TreeMap<>());}
总结
1、HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素;
2、LinkedHashSet:LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别;
3、TreeSet(有序,唯一):红黑树(自平衡的排序二叉树)。
三、Queue剖析
比较常用的是:阻塞队列和双向队列
1、BlockingQueue
当队列容器已满,生产者线程会被阻塞,直到队列未满;当队列容器为空时,消费者线程会被阻塞,直至队列非空时为止。
2、Deque双端队列
支持在两端插入和移除元素。deque 是“double ended queue(双端队列)”的缩写。大多数实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
四、小结
1、List 和 Set 的区别?
List , Set 都是继承自Collection 接
List 特点:
一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可 以插入多个null元素,元素都有索引。
常用的实现类有 ArrayList、LinkedList 和Vector。
Set 特点:
一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允 许存入一个null元素,必须保证元素唯一性。
Set 接口常用实现类是 HashSet、 LinkedHashSet 以及 TreeSet。
List 支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代, 因为他无序,无法用下标来取得想要的值。
Set和List对比
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
2、使用集合框架的好处?
容量自增长;
提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量;
允许不同 API 之间的互操作,API之间可以来回传递集合;
可以方便地扩展或改写集合,提高代码复用性和可操作性;
通过使用JDK自带的集合类,可以降低代码维护和学习新API成本。
3、Java集合的快速失败机制 “fail-fast”?
是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能 会产生 fail-fast 机制。
迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。
每当迭代器使用 hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为 expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
解决办法:
在遍历过程中,所有涉及到改变modCount值的地方全部加上synchronized;
使用CopyOnWriteArrayList来替换ArrayList。
4、迭代器 Iterator 是什么?
Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。
迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调 用者在迭代过程中移除元素。
5、Iterator 和 ListIterator 有什么区别?
Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List;
Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历);
ListIterator 实现 Iterator 接口,然后添加了一些额外的功能,比如添加一个元素、替换一 个元素、获取前面或后面元素的索引位置。
6、ArrayList 的优缺点?
ArrayList的优点如下:
ArrayList 底层以数组实现,是一种随机访问模式。
ArrayList 实现了 RandomAccess 接 口,因此查找的时候非常快。
ArrayList 在顺序添加一个元素的时候非常方便。
ArrayList 的缺点如下:
删除元素的时候,需要做一次元素复制操作。如果要复制的元素很多,那么就会比较耗费性 能。
插入元素的时候,也需要做一次元素复制操作,缺点同上。
ArrayList 比较适合顺序添加、随机访问的场景。
7、在 Queue 中 poll()和 remove()有什么区别?
相同点:都是返回第一个元素,并在队列中删除返回的对象。
不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。
- END -
好了,以上就是今天的内容。
有错误的地方欢迎指正。快分享给你的朋友,一起学习吧!
坚持原创,做最有价值的分享!