常用集合
Java集合是我认为在Java基础中最最重要的知识点了,Java集合是必须掌握的。
List集合
List集合下最常见的集合类有俩个: ArrayList和LinkedList
ArrayList底层是数组,LinkedList底层是链表。数组遍历速度快,LinkedList增删元素快
- 在工作中,遍历的需求比增删多,即便是增加元素往往也只是从尾部插入元素,而ArrayList在尾部插入元素也是O(1)
- ArrayList增删没有想象中慢,ArrayList的增删底层调用的
copyOf()被优化过,加上现代CPU对内存可以块操作,普通大小的ArrayList增删比LinkedList更快。
所以,在开发中,想要用到集合来装载元素,第一个想到的就是ArrayList。
我们一般在刷算法题上,把LinkedList当作一个先进先出的队列,LinkedList本身就实现了Queue接口

如果考虑线程安全问题,可以使用CopyOnWriteArrayList,实际开发使用不多,其思想在Linux/文件系统中用得到。
Set集合
Set集合下最常用的集合类有三个:HashSet, TreeSet, LinkedHashSet
List和Set都是集合, 一般来说:如果我们需要保证集合的元素石唯一的,就应该想到用Set集合
一般我们在开发中最多用到的也就是HashSet。TreeSet是可以排序的Set,一般我们需要有序,从数据库拉出来的数据就是有序的,可能往往写order by id desc比较多。而在开发中也很少管元素插入有序的问题,所以LinkedHashSet一般也用不上。
如果考虑线程安全的问题,可以考虑CopyOnWriteArraySet,用得就更少了(这是一个线程安全的Set,底层实际上就是CopyOnWriteArrayList)
TreeSet和LinkedHashSet更多的可能用在刷算法的时候。

Map集合
Map集合最常见的子类也有三个:HashMap、LinkedHashMap、TreeMap
如果考虑线程安全问题, 应该想到的是ConcurrentHashMap,当然了Hashtable也要有一定的了解,面试经常问到。
HashMap在实际开发中用到的也很多,只要是key-value结构的,一般我们就用HashMap。LinkedHashMap和TreeMap用的不多。
ConcurrentHashMap在实际开发中也用得挺多,我们很多时候把ConcurrentHashMap用于本地缓存,不想每次都网络请求数据,在本地做本地缓存。监听数据的变化,如果数据有变动了,就把ConcurrentHashMap对应的值给更新了。

线程安全问题
什么时候考虑线程安全的集合类,那当然是线程不安全的时候咯。那什么时候线程不安全?最常见的是:操作的对象是有状态的
虽然说,我们经常会听到线程不安全,但在业务开发中要我们程序员处理线程不安全的地方少之又少。比如说:你在写Servlet的时候,加过syn/lock锁吗?应该没有吧?
因为我们的操作的对象往往是无状态的。没有共享变量被多个线程访问,自然就没有线程安全问题了。
一句话总结:只要涉及到多个线程操作一个共享变量的时候,就要考虑是不是要用线程安全的集合类。

浙公网安备 33010602011771号