Loading

常用集合

Java集合是我认为在Java基础中最最重要的知识点了,Java集合是必须掌握的。

 

 

List集合

 

List集合下最常见的集合类有俩个: ArrayList和LinkedList

 

ArrayList底层是数组,LinkedList底层是链表。数组遍历速度快,LinkedList增删元素快

 

  • 在工作中,遍历的需求比增删多,即便是增加元素往往也只是从尾部插入元素,而ArrayList在尾部插入元素也是O(1)
  • ArrayList增删没有想象中慢,ArrayList的增删底层调用的copyOf()被优化过,加上现代CPU对内存可以块操作,普通大小的ArrayList增删比LinkedList更快。

 

所以,在开发中,想要用到集合来装载元素,第一个想到的就是ArrayList。

 

 

我们一般在刷算法题上,把LinkedList当作一个先进先出的队列,LinkedList本身就实现了Queue接口

image

 

如果考虑线程安全问题,可以使用CopyOnWriteArrayList,实际开发使用不多,其思想在Linux/文件系统中用得到。

 

 

Set集合

 

Set集合下最常用的集合类有三个:HashSet, TreeSet, LinkedHashSet

 

List和Set都是集合, 一般来说:如果我们需要保证集合的元素石唯一的,就应该想到用Set集合

 

 

一般我们在开发中最多用到的也就是HashSet。TreeSet是可以排序的Set,一般我们需要有序,从数据库拉出来的数据就是有序的,可能往往写order by id desc比较多。而在开发中也很少管元素插入有序的问题,所以LinkedHashSet一般也用不上。

如果考虑线程安全的问题,可以考虑CopyOnWriteArraySet,用得就更少了(这是一个线程安全的Set,底层实际上就是CopyOnWriteArrayList)

TreeSet和LinkedHashSet更多的可能用在刷算法的时候。

image

 

Map集合

 

Map集合最常见的子类也有三个:HashMap、LinkedHashMap、TreeMap

 

如果考虑线程安全问题, 应该想到的是ConcurrentHashMap,当然了Hashtable也要有一定的了解,面试经常问到。

 

HashMap在实际开发中用到的也很多,只要是key-value结构的,一般我们就用HashMap。LinkedHashMap和TreeMap用的不多。

 

ConcurrentHashMap在实际开发中也用得挺多,我们很多时候把ConcurrentHashMap用于本地缓存,不想每次都网络请求数据,在本地做本地缓存。监听数据的变化,如果数据有变动了,就把ConcurrentHashMap对应的值给更新了。


image

 

线程安全问题

 

什么时候考虑线程安全的集合类,那当然是线程不安全的时候咯。那什么时候线程不安全?最常见的是:操作的对象是有状态的

虽然说,我们经常会听到线程不安全,但在业务开发中要我们程序员处理线程不安全的地方少之又少。比如说:你在写Servlet的时候,加过syn/lock锁吗?应该没有吧?

因为我们的操作的对象往往是无状态的。没有共享变量被多个线程访问,自然就没有线程安全问题了

 

一句话总结:只要涉及到多个线程操作一个共享变量的时候,就要考虑是不是要用线程安全的集合类

posted @ 2020-09-10 15:49  _bwang  阅读(449)  评论(0)    收藏  举报