目录
- Java基础
- 1、java中的IO流分为几种?
- 2、BIO、NIO、AIO 有什么区别?
- 3、文件(Files)的常用方法都有哪些?
- 4、HashMap源码,实现原理,JDK8以后对HashMap做了怎样的优化.
- 5、HashMap,HashTable,ConcurrentHashMap的区别
- 6、极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。
- 7、HashMap在高并发下如果没有处理线程安全会有怎样的隐患,具体表现是什么。
- 8、ThreadLocal的了解,实现原理。[参考《深入解析ThreadLocal底层实现原理》](https://blog.csdn.net/qpzkobe/article/details/79997391?)
- 9、Collection 和 Collections 有什么区别?
- 10、List、Set、Map 之间的区别是什么?
Java基础
1、java中的IO流分为几种?
- 按功能划分:输入流(input)、输出流(output)。
- 按类型划分:字节流、字符流
- 字节流与字符流之间的区别:字节流按8位传输以字节为单位输入输出数据,字符流按16位传输,以字符为单位输入输出数据。
2、BIO、NIO、AIO 有什么区别?
- BIO: Block IO 同步阻塞式IO,就是我们平常使用的传统IO,其特点是模式简单、使用方便,但是并发处理能力低。
- NIO: New IO 同步非阻塞式IO,是传统IO的升级,客户端和服务器端通过Channel(通道)通讯,实现了多路复用。
- AIO: Asynchronous IO 是 NIO的升级,也叫NIO2,实现了异步非阻塞IO,异步IO的操作基于事件和回调集之。
3、文件(Files)的常用方法都有哪些?
-
Files.exists()
:检测文件路径是否存在。 -
Files.createFile()
:创建文件。 -
Files.createDiretory()
:创建文件夹。 -
Files.delete()
:删除一个文件或目录。 -
Files.copy()
:复制文件。 -
Files.move()
:移动文件。 -
Files.size()
:查看文件个数。 -
Files.read()
:读取文件。 -
Files.write()
:写入文件。
4、HashMap源码,实现原理,JDK8以后对HashMap做了怎样的优化.
- HashMap是基于哈希表的Map接口的非同步实现,提供所有可选的映射操作,并允许使用null值和null键,不保证映射的顺序;
- HashMap是一个“链表散列”的数据结构,即数组和链表的结合体;
- 它的底层就是一个数组结构,数组中的每一项又是一个链表,每当新建一个HashMap时,就会初始化一个数组;
- 而在JDK8中引入了红黑树的部分,当存入到数组中的链表长度大于(默认)8时,即转为红黑树;
- 利用红黑树快速增删改查的特点提高HashMap的性能,其中会用到红黑树的插入、删除、查找等算法。
面试重点(红黑树),红黑树参考资料
5、HashMap,HashTable,ConcurrentHashMap的区别
- HashMap是非线程安全的,HashTable是线程安全的
- HashMap的键值对都允许有null存在,而HashTable不可以
- 因为HashTable要保证线程安全,所以在效率方面,HashMap更高
- HashMap根据键的HashCode值存储数据,大多数情况能直接定位到它的值,因为具有很快的访问速度,所以访问顺序是不正确的。
- Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,但是Hashtable继承于Dictionary类,并且是线程安全的,任一时间只能一个线程能写Hashtable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段索。
6、极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。
ConcurrentHashMap,因为ConcurrentHashMap中引入了分段索,而HashTable使用的是方法级别的索;因此在新版本中不建议使用HashTable,不需要线程安全场合可以使用HashMap,而需要线程安全的场合使用ConcurrentHashMap。
7、HashMap在高并发下如果没有处理线程安全会有怎样的隐患,具体表现是什么。
可能会造成死循环,具体表现链表的循环指向。
8、ThreadLocal的了解,实现原理。参考《深入解析ThreadLocal底层实现原理》
ThreadLocal,线程本地变量。定义了一个ThreadLocal,每个线程往这个ThreadLocal中读写都是线程隔离的,互相之间不会影响,他提供了一种将可变数据通过每个线程有自己的独立副本从而实现线程封闭的机制;实现的思路,Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals,也就是说每个线程都有一个自己的ThreadLocalMap。ThreadLocalMap有自己的独立实现,可以简单的将它的key视作ThreadLocal,value为代码中放入的值(实际上key并不是ThreadLocal本省,而是它的一个弱引用)。每个线程在往ThreadLocal里set值的时候,都会往自己的ThreadLocalMap里存,读也是已某个ThreadLocal作为引用,在自己的map里找对应的key,从而实现了线程的隔离
9、Collection 和 Collections 有什么区别?
- Collection:
- java.util.Collection是一个集合接口(集合类的一个*接口)。它提供了对集合对象进行基本操作的通用接口方法。
- Collection接口在Java类库中很多具体的实现。
- Collection接口的意义是为各种具体的集合提供最大化的统一操作方式,其直接继承接口有List与Set。
- Collections
- Collections则是集合类的一个工具类,其中提供了一些静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
10、List、Set、Map 之间的区别是什么?
比较 | List | Set | Map |
---|---|---|---|
继承接口 | Collection | Collection | |
常见实现类 | AbstractList(其常用子类有ArrayList、LinkedList、Vector) | AbstractSet(其常用子类有HashSet、LinkedHashSet、TreeSet) | HashMap、HashTable |
常见方法 | add()、remove()、clear()、get()、contains()、size() | add()、remove()、clear()、contains()、size() | put()、get()、remove()、clear()、containsKey()、containsValue()、keySet()、values()、size() |
元素 | 可重复 | 不可重复(用equals()判断) | 不可重复 |
顺序 | 有序 | 无序(实际上由HashCode决定 | |
线程安全 | Vector线程安全 | HashTable安全 |