1.集合
>Java中有哪些常用集合容器
JAVA中集合主要分为Collection和Map两大类,Collection包含List、Set、Queue。
常用的子类有:ArrayList、HashSet、HashMap等
>ArrayList、LinkedList、Vector
List是有序可重复集合。
Vector是List接口下线程安全的集合,很多方法都使用了synchronized来保障线程安全,但是也仅仅在增删等单独动作起作用,但是如果你调用了多个动作,相互之间有联系,还是会有线程安全问题,而且使用synchronized本身也是有一些性能影响。综合考虑下来,vector大多数情况下并不是一个值得优先考虑的集合容器。
ArrayList底层原理是数组,可以动态扩容(底层通过数组拷贝达到扩容效果)。就是由于底层使用了数组,所以自身的特点也是围绕这数组来,查找速度快,插入和删除效率低。
LinkedList底层原理是链表,插入和删除效率高,查找效率差(要进行遍历查找)。
>HashSet
set是无序不可重复的集合,不可重复是它的特性。
HashSet是哈希表结构,底层由HashMap实现。具体添加元素的过程与hashCode和equals有关,先判断hashCode是否相同,如果相同则进行equals判断,如果不同则直接插入。(具体点说其实就相当于调用了HashMap的put)
>ArrayBlockingQueue、ConcurrentLinkedQueue、DelayQueue
队列是一种特殊的数据结构,遵循FIFO,可分为两种,阻塞队列,非阻塞队列。
阻塞队列(eg:ArrayBlockingQueue)是通过锁机制实现的,非阻塞队列(eg:ConcurrentLinkedQueue)是通过循环CAS实现的。
阻塞队列由于阻塞性能上比非阻塞队列会低效一点,但是非阻塞也不是意味着更好,无限制的情况,队列的不断堆积扩张很可能会导致内存不够等等问题,没有绝对的优势,只有是否更加合适,具体要看生成者和消费者的生产和消费相对速度和一些特殊需求。
DelayQueue是比较特殊的一种阻塞队列,放入其中的对象需要实现Delayed接口。DelayQueue最主要的两点是排序(基于PriorityQueue实现)和延时,排序使最早到期的最早被消费,如果没有到时间,则无法获取到对象,poll方法返回的是null。
>HashMap
很经典的key-value数据结构。key必须要是Object对象类型。
2. IO
>有哪些IO流
按处理单位分,主要有字节流(一次性读取8位二进制)和字符流(一次性读取16位二进制)。
IO四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)。它们各自还有很多子类,是为了满足文件,网络,管道等不同场景的 IO 需求。
>BIO、NIO、AIO
BIO是同步阻塞IO,使用简单,但是并发能力弱。
NIO是同步非阻塞IO,线程是同步状态的,但是IO是非阻塞的,通过轮询可以支持多个IO读写。
AIO是NIO升级版,线程也是异步状态的,并发能力更强。
理论上的AIO是性能最优的,但是由于一些情况,AIO一个请求一个线程,而单机线程资源是有限的,再者linux上AIO并不是十分成熟。
3.多线程
>并发和并行
并行指多个事件在同一个时刻发生;并发指多个事件在间隔很短的时间内相继发生。
并行是同时处理多个任务的能力,并发是处理多个任务的能力。
>进程和线程
进程是资源分配的最小单位,线程是CPU调度的最小单位
下面摘抄了biaodianfu 的回答:
做个简单的比喻:进程=火车,线程=车厢
- 线程在进程下行进(单纯的车厢无法运行)
- 一个进程可以包含多个线程(一辆火车可以有多个车厢)
- 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
- 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
- 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
- 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
- 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
- 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-"互斥锁"
- 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”
>同步和阻塞
同步/异步是调用等待结果返回还是立即返回,而阻塞/非阻塞是调用时的状态。
4.锁
>锁的分类
java中的各种锁详细介绍 - JYRoy - 博客园www.cnblogs.com>CAS
chenchenchen:深入理解CAS算法原理zhuanlan.zhihu.com5.反射
反射真的很好玩
一二三冲鸭:Java反射使用总结zhuanlan.zhihu.com