以下面试题都是自己通过大量面试遇到的高频题目,都需要掌握。
ArrayList和LinkList区别
ArrayList数组,LinkList双向链表;前者按顺序存储查询速度快,后者增删改速度快。
HashMap数据结构
JDK1.7及之前:数组+链表
JDK1.8:数组+链表+红黑树
HashMap初始容量是16,默认加载因子为0.75,长度大于等于8链表转红黑树。
为什么两倍扩容
扩容、地址变动,可以用与运算替代取模运算。
为什么大于8转红黑树
红黑树平均查找长度是log(n),长度为8的时候,平均查找长度为3,如果继续使用链表,平均查找长度为8/2=4
为什么默认加载因子0.75(达到0.75比例后扩容)
折衷,空间和时间的折衷。
HashMap线程安全吗?用什么安全
不安全,线程安全用HashTable或者ConcurrentHashMap
如何循环HashMap
- 循环keyset
- 通过 Map.entrySet().iterator()
- 通过Map.entryset(很大Map时候用)
- 通过Valueset
为什么HashMap线程不安全
1.7扩容时,同时Rehash形成闭环或数据丢失
1.8并发put,发生覆盖
HashMap头插还是尾部插入
1.8之后尾部插入,防止环化
String、StringBuffer、StringBuilder区别
String字符序列不可变,只会被重新指向和销毁。
StringBuffer是线程安全,通过synchronized实现
StringBuilder线程不安全
为什么使用红黑树/B树
降低树的深度,增加查询效率
红黑树的算法复杂度
log(n)
voletile的作用
禁止指令重排、缓存一致性协议
字节流字符流区别
字节流--传输过程中,传输数据的最基本单位是字节的流。
字符流--传输过程中,传输数据的最基本单位是字符的流。
字符只是根据编码集对字节流翻译之后的产物。
字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
字节流默认不使用缓冲区;字符流使用缓冲区。
字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。
字节流中输出数据主要是使用OutputStream 完成,输入使的是 InputStream,在字符流中输出主要是使用 Writer 类完成,输入流主要使用 Reader 类完成。这四个都是抽象类。