关于集合
1、Vector、ArrayList、LinkedList的区别
要点如下:
- 是否线程安全
- 底层数据存储是通过何种数据结构实现的
![fbc312df0f3eff6c9cf7ca057f5e2252.png](https://i-blog.csdnimg.cn/blog_migrate/1258c1d45d02ea4a47b59cf10d57939b.jpeg)
集合框架
2、Hashtable、HashMap、TreeMap、LinkedHashMap
核心要点:
- 是否是线程安全,如果不是线程安全,能否举出异常case
- 数据存储结构及存取复杂度分析
- 是否支持null作为key或value
- 是否支持顺序访问
![0c407c08c648d37d1eb4899c623b0e11.png](https://i-blog.csdnimg.cn/blog_migrate/5067a3d8cbddefaf18c63af2850afa88.jpeg)
map继承关系
3、如何保证集合的线程安全?ConcurrentHashMap的线程安全是如何实现的?
如何保证集合的线程安全?
- 使用JDK提供的线程安全的集合,如:Vector,Stack等
- 通过Collections类提供的集合包装方法,将集合包装成为线程安全的集合
- current包下面提供的线程安全容器,比如:ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue等
ConcurrentHashMap在不同JDK版本中实现也有所不同:
jdk8之前采用分段锁实现,同时也利用volatile保证可见性;
![54fec8774899ab44dde7fed43183e659.png](https://i-blog.csdnimg.cn/blog_migrate/60da7dc2a17b0c9af0ede15fe5f7d0f8.jpeg)
java7实现
在JDK8中,虽然仍然保留了Segment结构,但并没有再使用分段锁,保留的目的仅仅是为了再序列化上保持前向兼容性;
使用CAS进行无锁并发操作、volatile保证可见性;
IO层面
4、java提供了哪些IO操作,NIO是如何实现多路复用的
![69216c094414ded21a282786394b862e.png](https://i-blog.csdnimg.cn/blog_migrate/f5dd57d28ac9ca18a09e194af42247fa.jpeg)
IO继承关系图
IO的分类方式有很多种,其中常见的一种是BIO、NIO、AIO(NIO2)即:阻塞IO、非阻塞IO、异步IO,NIO全称是None blocked IO;
NIO通过一个selector向多个channel注册监听事件,阻塞等待事件就绪,然后处理就绪事件。多路复用指的是多个channel复用一个线程。
![a81fdcfd213eecd911f6160f3eb37706.png](https://i-blog.csdnimg.cn/blog_migrate/4206bd877c4a1d30b6fd74dea6d462f6.jpeg)
NIO 多路复用模式
5、java的文件拷贝有哪几种实现
- 通过inputStream读取、outputStream写入实现;
![52c5a07a1db5e5fa82cecb97aeddf966.png](https://i-blog.csdnimg.cn/blog_migrate/e3f747ed7ec4d6193f661305524b515e.jpeg)
- 利用java.nio 类库提供的 transferTo 或 transferFrom 方法实现
![1678f687e9676c6c72b0e2edaec79fa2.png](https://i-blog.csdnimg.cn/blog_migrate/881387ff507eb6ee92c574096d6d4d36.jpeg)