# 面试题目分类及举例 ## 自我介绍 - 自我介绍,名字,学校,研究方向,做的哪些项目,目前在做哪些项目 ## 数据结构 - 排序算法及时空复杂度 - 红黑树,红黑树用在哪。 - TreeMap,1.8的HashMap - B+ 树(数据库索引) - 参考资料 - 《算法》 - 《数据结构与算法分析》 ## Java 基础 - voliate 关键字 - JDK1.8 的改进 - 对 Java 的集合框架有什么样的了解, 用过哪些集合类, 各自的效率以及适用场景 - HashMap 具体的实现(原理) - ArrayList 怎么转换成 list - ArrayList 与 LinkedList 的区别。 - 紧接着问我 ArrayList 可以根据下表查找,LinkedList 可以吗? - ArrayList 初始容量,如果满了会怎么办? 怎么扩容?是新建一个2倍空间的数组然后把值复制进去么? - JVM 的同步锁 - 继承和多态的内存模型 - 参考资料 - 源码 - oracle 官方文档 - 姜志明老师课件 - [jenkov](http://tutorials.jenkov.com/) ## Java 进阶 - Java 类加载机制 - JVM 如何确立每个类在 JVM 的唯一性 - 对 JVM 的垃圾回收的认识 - 新生代老年代的概念与晋升,以及新生代与老年代的垃圾回收,CMS垃圾收集器 - JVM 调优 - JVM 内存模型 - 参考资料 - 《深入理解 Java 虚拟机》 ## 数据库 - SQL 语句编写 - group by 、order by 和聚集函数 的用法 - SQL查询优化 - 数据库索引的实现,B+ 树的特点与优势,叶子结点链表,缓存命中率提高 - 参考资料 - w3school - 《数据库系统概念》 ## 操作系统 - 说一下 linux 下命令,如果替换文本中某个字符串用什么命令 - 进程与线程的区别 - 进程间通信的方式 - 线程实现同步的方式 - IPC 进程间的通信 - 参考资料 - 《现代操作系统》 - 《操作系统概念》 - 《Linux/Unix 系统编程手册》 ## 计算机网络 - OSI七层模型有哪些,每一层的作用 - TCP建立连接过程(三次握手) - TCP连接断开过程(四次挥手) - TCP洪水攻击 - 参考资料 - 《计算机网络 自顶向下方法》 ## 其他 - 举出一个例子说明你的自学能力 - 有做过什么开源项目或者对开源项目有什么贡献吗 - 有什么想问的?在哪个部门?目前做的业务?以及目前所用到的一些技术? - 以后想从事哪个方向啊? - 你想去哪个部门? - 对服务器端开发的理解? - 影响单台服务器的并发量的因素有哪些?如何优化? - 操作系统角度 - 计算机网络角度 - 数据库角度 - 上下文切换:CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。上下文切换会影响多线程的执行速度,因此并发线程数并不是越多越好,需要合理控制并发线程数。减少上下文切换的方法有: - 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,比如参考ConcurrentHashMap的实现思想,将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。 - CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需加锁。 - 使用最少线程。避免创建不需要的线程。 - 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。 - 资源限制方面。硬件因素有服务器的带宽,磁盘读写速度和CPU的处理速度。软件资源限制有数据库的链接数和socket链接数等。 ## 题目来源 - [牛客网](https://www.nowcoder.com/)