Alibaba Interview Questions (transferred)
# 阿里面试考点梳理
# 第一部分:计算机基础
互联网大厂都相当重视程序员的基本功,也就是计算机基础知识。一个程序员能走多远、爬多高,很大程度上取决于基本功是否扎实。对于应届生而言,大都比较缺乏实战项目经验,虽然会有一定的项目经验,但这些课程设计、实验室项目的质量与公司实际的项目有着巨大的差距。因此,基础知识便成为面试考量的一大重点,而且基础扎实的程序员可塑性比较高,做什么都能比较容易快速上手。
计算机基础包含如下几门课程,相信计算机专业的同学肯定都已经学过。但互联网公司面试的考点可能和你们期末考试的考点有一些不同,我都做了整理。
# 1. 计算机网络
大学课程中的计算机网络一般都按照 OSI 七层参考模型介绍,然而由于互联网公司的特性,他们更加关注日常开发所涉及到的传输层和应用层,所以需要重点掌握传输层和应用层中所涉及到的所有知识点。
【考点】
- 传输层的作用
- 传输层复用和分用的含义
- 传输层和网络层的区别
- UDP 协议的特点
- UDP 协议的报文结构
- TCP 协议的特点
- TCP 协议的报文结构
- TCP 三次握手过程
- TCP 四次挥手过程
- TCP 可靠传输是如何实现的
- 停止等待协议
- 滑动窗口协议
- TCP 的流量控制
- TCP 拥塞控制
- HTTP 协议
- HTTP 工作流程
- HTTP 请求格式
- HTTP 1.1 中的 8 种请求方式
- HTTP 响应格式
- HTTP 中重要的请求头和响应头字段
- HTTP 常用状态码及其含义
- HTTPS 协议
- HTTPS 协议与 HTTP 协议的区别
- HTTPS 协议的工作流程
【资料整理】
- 计算机网络传输层知识点全覆盖 - 大闲人柴毛毛的博客
- HTTP 详解 (1)- 工作原理
- HTTP 详解 (2)- 请求、响应、缓存
- HTTP 详解 (3)-http1.0 和 http1.1 区别
- 图解 HTTPS 通信过程
# 2. 数据结构
熟练掌握数据结构是程序员最最最基本的素养,在实际开发中选择合适的数据结构将极大影响程序的效率。面试官一般并不会直接问数据结构的问题,而是通过出一些包含数据结构的算法题来考察你对数据结构的理解程度以及在实际项目中是否能够灵活应用。你可以通过刷算法题来提升这部分能力,推荐《剑指 offer》和《程序员面试金典》(注意是金典!)。很多公司的算法题库都选自这两本书。
当然,刷这两本书的目的并不是让你死记硬背题目,题目千变万化,面试官可以随意改变。刷算法题最重要的是培养解决问题的思路和解决实际问题的能力。在刷题的过程中要多多总结,再次强调,切忌死记硬背!
# 3. 算法
和数据结构一样,算法一般也通过具体的算法题来考察,你也可以通过刷《剑指 offer》和《程序员面试金典》中的算法题来提高这方面的技能。但在刷这些算法题之前,你需要掌握几类基础的算法,并理解他们解决问题的思路(这才是最为关键的)。这些算法我已经在下面整理。
# 4. 操作系统
【考点】
- 操作系统的四个特性。
- 操作系统的主要功能。
- 进程的有哪几种状态,状态转换图,及导致转换的事件。
- 进程与线程的区别。
- 进程通信的几种方式。
- 进程同步的几种方式
- 用户态和核心态的区别。
- 死锁的概念,导致死锁的原因。
- 导致死锁的四个必要条件。
- 处理死锁的四个方式。
- 预防死锁的方法、避免死锁的方法。
- 进程调度算法。
- 内存连续分配方式采用的几种算法及各自优劣。
- 基本分页储存管理方式。
- 基本分段储存管理方式。
- 分段分页方式的比较各自优缺点。
- 几种页面置换算法,会算所需换页数
- 虚拟内存的定义及实现方式。
【资料整理】
# 5. 数据库
【考点】
- 什么是索引?
- 索引的分类
- 索引的优缺点分析
- 何时需要使用索引?何时无需使用索引?
- 什么是事务?
- 事务的四大特性
- 数据库三大范式
- 数据库有哪些表连接?
【资料整理】
# 第二部分:Java
作为一名合格的 Java 程序员,仅了解如何使用 Java 是远远不够的。你能够熟练使用 Java 只能说明你已经成为一名合格的码农,能够利用 Java 实现某些功能。而公司作为盈利机构,需要用最少的资源实现效益最大化,这就需要程序员具备高质量代码的能力,而能否写出高质量代码取决于你对技术背后原理的理解程度。只有在理解 Java 背后的原理,你才能根据 Java 的特性,写出更加高效的代码。这在实际业务中是非常有价值的事情。互联网大厂服务海量用户,更加注重系统的性能,也更加注重程序员对原理的理解。
关于 Java 的基础知识和如何使用,这里我就不提了,随便一本 Java 书籍都有详细的介绍。这里我整理了 Java 原理性的知识点,这些知识点将会成为你面试的加分项。
# 1. Java 虚拟机
【考点】
- Java 虚拟机内存模型特点和作用
- 程序计数器
- Java 虚拟机栈
- 本地方法区
- 堆
- 方法区
- 对象创建过程
- 对象访问过程
- 对象的内存结构
- 垃圾收集算法
- 如何判定哪些对象需要回收?
- 对象内存分配策略
- 分配担保机制
- 垃圾收集器的比较
- Class 文件结构
- 类加载的时机
- 类加载过程
- 双亲委派模型
【知识点资源整理】
- 深入理解 JVM (一)——JVM 内存模型
- 深入理解 JVM (二)—— 揭开 HotSpot 对象创建的奥秘
- 深入理解 JVM (三)—— 垃圾收集策略详解
- 深入理解 JVM (四)—— 对象内存的分配策略
- 深入理解 JVM (五)——HotSpot 垃圾收集器详解
- 深入理解 JVM (六)——JVM 性能调优实战
- 深入理解 JVM (七)——Class 文件结构
- 深入理解 JVM (八)—— 类加载的时机
- 深入理解 JVM (九)—— 类加载的过程
- 深入理解 JVM (十)—— 类加载器
# 2. Java 并发编程
【考点】
- 什么是死锁?如何避免死锁?
- 什么是重排序?
- volatile 有哪些特性?
- 什么是内存可见性?
- volatile 为什么能够保证内存可见性?
- 中断机制
- 线程通信有哪些方式?
- 线程池的作用?
- ThreadPoolExecutor 如何使用?
- 如何设置线程池的大小?
- 如何保证线程安全?
- JDK 1.6 哪些对锁做了哪些优化?
【知识点资源整理】
- Java 并发编程的艺术 (一)—— 并发编程需要注意的问题
- Java 并发编程的艺术 (二)—— 重排序
- Java 并发编程的艺术 (三)——volatile
- Java 并发编程的艺术 (四)—— 线程的状态
- Java 并发编程的艺术 (五)—— 中断
- Java 并发编程的艺术 (六)—— 线程间的通信
- Java 并发编程的艺术 (七)——Executors
- Java 并发编程的艺术 (八)—— 闭锁、同步屏障、信号量详解
- Java 并发编程的艺术 (九)—— 批量获取多条线程的执行结果
- Java 并发编程的艺术 (十)—— 线程池 (1)
- Java 并发编程的艺术 (十一)—— 线程池 (2)
- Java 并发编程的艺术 (十二)—— 线程安全
- Java 并发编程的艺术 (十三)—— 锁优化
- Java 并发容器大合集
# 3. Java 容器考点及资料整理
- Java 集合系列 01 之 总体框架
- Java 集合系列 02 之 Collection 架构
- Java 集合系列 03 之 ArrayList 详细介绍 (源码解析) 和使用示例
- Java 集合系列 04 之 fail-fast 总结 (通过 ArrayList 来说明 fail-fast 的原理、解决办法)
- Java 集合系列 05 之 LinkedList 详细介绍 (源码解析) 和使用示例
- Java 集合系列 06 之 Vector 详细介绍 (源码解析) 和使用示例
- Java 集合系列 07 之 Stack 详细介绍 (源码解析) 和使用示例
- Java 集合系列 08 之 List 总结 (LinkedList, ArrayList 等使用场景和性能分析)
- Java 集合系列 09 之 Map 架构
- Java 集合系列 10 之 HashMap 详细介绍 (源码解析) 和使用示例
- Java 集合系列 11 之 Hashtable 详细介绍 (源码解析) 和使用示例
- Java 集合系列 12 之 TreeMap 详细介绍 (源码解析) 和使用示例
- Java 集合系列 13 之 WeakHashMap 详细介绍 (源码解析) 和使用示例
- Java 集合系列 14 之 Map 总结 (HashMap, Hashtable, TreeMap, WeakHashMap 等使用场景)
- Java 集合系列 15 之 Set 架构
- Java 集合系列 16 之 HashSet 详细介绍 (源码解析) 和使用示例
- Java 集合系列 17 之 TreeSet 详细介绍 (源码解析) 和使用示例
- Java 集合系列 18 之 Iterator 和 Enumeration 比较
# 4. Java IO 考点及资料整理
- java io 系列 02 之 ByteArrayInputStream 的简介,源码分析和示例 (包括 InputStream)
- java io 系列 03 之 ByteArrayOutputStream 的简介,源码分析和示例 (包括 OutputStream)
- java io 系列 04 之 管道 (PipedOutputStream 和 PipedInputStream) 的简介,源码分析和示例
- java io 系列 05 之 ObjectInputStream 和 ObjectOutputStream
- java io 系列 06 之 序列化总结 (Serializable 和 Externalizable)
- java io 系列 07 之 FileInputStream 和 FileOutputStream
- java io 系列 08 之 File 总结
- java io 系列 09 之 FileDescriptor 总结
- java io 系列 10 之 FilterInputStream
- java io 系列 11 之 FilterOutputStream
- java io 系列 12 之 BufferedInputStream (缓冲输入流) 的认知、源码和示例
- java io 系列 13 之 BufferedOutputStream (缓冲输出流) 的认知、源码和示例
- java io 系列 14 之 DataInputStream (数据输入流) 的认知、源码和示例
- java io 系列 15 之 DataOutputStream (数据输出流) 的认知、源码和示例
- java io 系列 16 之 PrintStream (打印输出流) 详解
- java io 系列 17 之 System.out.println (“hello world”) 原理
- java io 系列 18 之 CharArrayReader (字符数组输入流)
- java io 系列 19 之 CharArrayWriter (字符数组输出流)
- java io 系列 20 之 PipedReader 和 PipedWriter
- java io 系列 21 之 InputStreamReader 和 OutputStreamWriter
- java io 系列 22 之 FileReader 和 FileWriter
- java io 系列 23 之 BufferedReader (字符缓冲输入流)
- java io 系列 24 之 BufferedWriter (字符缓冲输出流)
- java io 系列 25 之 PrintWriter (字符打印输出流)
- java io 系列 26 之 RandomAccessFile
- 深入分析 Java I/O 的工作机制