代码改变世界

Java面试题总结论(一)-数据结构

2021-04-14 14:53  查士丁尼  阅读(434)  评论(0编辑  收藏  举报

以下面试题都是自己通过大量面试遇到的高频题目,都需要掌握。

 

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 类完成。这四个都是抽象类。