没有合适的资源?快使用搜索试试~ 我知道了~
内容概要:本文档涵盖了阿里面试过程中常见的技术问答,详细讲解了包括数据结构(如红黑树)、哈希表对比、并发控制机制(ConcurrentHashMap与HashTable性能对比)、Java类加载机制、数据库事务特性和隔离级别、常用中间件原理、垃圾回收算法及收集器、TCP协议深度剖析、HTTPS安全性解析、CAP原则详解及一致性哈希等多个方面的知识点。通过理论解释及案例分析的形式给予详细的解读和实用的最佳答题技巧指导。 适用人群:面向参加阿里面试或其他类似职位面试准备的技术人员及软件开发者。 使用场景及目标:适用于技术求职者作为面试准备资料,帮助考生深入理解和复习相关技术知识点,提高面对实际工作中问题的分析解决能力。 其他说明:该指南不仅限于为面试备考服务,对于加深技术人员对Java编程和分布式系统等相关领域的理解和掌握亦有所帮助。
资源推荐
资源详情
资源评论
阿里面试集锦及最优解答
Java 源码探究及中间件..............................................................................................1
一、红黑树的特性....................................................................................................2
二、HashMap 和 HashTable 的不同点....................................................................2
三、ConcurrentHashMap 为什么比 HashTable 性能好..........................................3
四、ClassLoader 的分类及加载顺序.......................................................................5
五、数据库事物特性及隔离级别............................................................................7
⑴原子性(Atomicity) .......................................................................................8
⑵一致性(Consistency) ....................................................................................8
⑶隔离性(Isolation)..........................................................................................8
⑷持久性(Durability) .......................................................................................8
1,脏读..................................................................................................................8
2,不可重复读 .....................................................................................................9
3,虚读(幻读) .......................................................................................................9
六、常用的中间件:Redis 、zookeeper、MQ、dubbo 等.................................10
七、GC 算法、垃圾收集器 ...................................................................................10
对象存活判断......................................................................................................10
垃圾收集算法......................................................................................................11
垃圾收集器..........................................................................................................15
常用的收集器组合..............................................................................................25
八、TCP ..................................................................................................................26
三次握手..............................................................................................................26
四次挥手..............................................................................................................27
滑动窗口..............................................................................................................31
九、HTTPS .............................................................................................................36
十、CAP 原则.........................................................................................................37
介绍......................................................................................................................37
理论......................................................................................................................37
与可用的决择......................................................................................................37
与 NoSQL 的关系 ...............................................................................................38
与 BASE 的关系 .................................................................................................38
十一、一致性哈希..................................................................................................38
一、红黑树的特性
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL 或 NULL)
的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
注意:
(01) 特性(3)中的叶子节点,是只为空(NIL 或 null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平
衡的二叉树。
红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是 O(lgn),效率
非常之高。
例如,Java 集合中的 TreeSet 和 TreeMap,C++ STL 中的 set、map,以及 Linux 虚
拟内存的管理,都是通过红黑树去实现的。
********************************************************************
二、HashMap 和 HashTable 的不同点
1 继承和实现方式不同
HashMap 继承于 AbstractMap,实现了 Map、Cloneable、
java.io.Serializable 接口。
Hashtable 继承于 Dictionary,实现了 Map、Cloneable、java.io.Serializable
接口。
2 线程安全不同
Hashtable 它是线程安全的,支持多线程。
而 HashMap 它不是线程安全的。
3 对 null 值的处理不同
HashMap 的 key、value 都可以为 null。
Hashtable 的 key、value 都不可以为 null。
4 支持的遍历种类不同
HashMap 只支持 Iterator(迭代器)遍历。
而 Hashtable 支持 Iterator(迭代器)和 Enumeration(枚举器)两种方式遍
历。
5 通过 Iterator 迭代器遍历时,遍历的顺序不同
HashMap 是“从前向后”的遍历数组;再对数组具体某一项对应的链表,从表头
开始进行遍历。
Hashtable 是“从后往前”的遍历数组;再对数组具体某一项对应的链表,从表
头开始进行遍历。
6 容量的初始值和增加方式都不一样
HashMap 默认的容量大小是 16;增加容量时,每次将容量变为“原始容量
x2”。
Hashtable 默认的容量大小是 11;增加容量时,每次将容量变为“原始容量 x2
+ 1”。
7 添加 key-value 时的 hash 值算法不同
HashMap 添加元素时,是使用自定义的哈希算法。
Hashtable 没有自定义哈希算法,而直接采用的 key 的 hashCode()。
8 部分 API 不同
Hashtable 支持 contains(Object value)方法,而且重写了 toString()
方法;
而 HashMap 不支持 contains(Object value)方法,没有重写 toString()
方法。
********************************************************************
三、ConcurrentHashMap 为什么比 HashTable 性能好
ConcurrentHashMap 分段锁 Segment+HashEntry
HashTable 竞争同一个锁 Synchronized
Segment 类继承于 ReentrantLock,主要是为了使用 ReentrantLock 的锁,ReentrantLock
的实现比 synchronized 在多个线程争用下的总体开销小
既然 ConcurrentHashMap 使用分段锁 Segment 来保护不同段的数据,那么在插入和获
取元素的时候,必须先通过哈希算法定位到 Segment。可以看到 ConcurrentHashMap 会首
先使用 Wang/Jenkins hash 的变种算法对元素的 hashCode 进行一次再哈希。
再哈希,其目的是为了减少哈希冲突,使元素能够均匀的分布在不同的 Segment 上,从而提高
容器的存取效率。
整个操作是先定位到段,然后委托给段的 remove 操作。当多个删除操作并发进行时,只要它
们所在的段不相同,它们就可以同时进行。
由于 put 方法里需要对共享变量进行写入操作,所以为了线程安全,在操作共享变量时必须
得加锁。Put 方法首先定位到 Segment,然后在 Segment 里进行插入操作。插入操作需要经
历两个步骤,第一步判断是否需要对 Segment 里的 HashEntry 数组进行扩容,第二步定位添
加元素的位置然后放在 HashEntry 数组里。
� 是否需要扩容。在插入元素前会先判断 Segment 里的 HashEntry 数组是否超过容量
(threshold),如果超过阀值,数组进行扩容。值得一提的是,Segment 的扩容判断比
HashMap 更恰当,因为 HashMap 是在插入元素后判断元素是否已经到达容量的,如果
到达了就进行扩容,但是很有可能扩容之后没有新元素插入,这时 HashMap 就进行了一
次无效的扩容。
� 如何扩容。扩容的时候首先会创建一个两倍于原容量的数组,然后将原数组里的元素进行
再 hash 后插入到新的数组里。为了高效 ConcurrentHashMap 不会对整个容器进行扩容,
而只对某个 segment 进行扩容。
get 操作不需要锁。
除非读到的值是空的才会加锁重读,我们知道 HashTable 容器的 get 方法是需要加锁的,
那么 ConcurrentHashMap 的 get 操作是如何做到不加锁的呢?原因是它的 get 方法里将要使
用的共享变量都定义成 volatile。
size()操作
如果我们要统计整个 ConcurrentHashMap 里元素的大小,就必须统计所有 Segment 里
元素的大小后求和。Segment 里的全局变量 count 是一个 volatile 变量,那么在多线程场景
下,我们是不是直接把所有 Segment 的 count 相加就可以得到整个 ConcurrentHashMap 大
小了呢?不是的,虽然相加时可以获取每个 Segment 的 count 的最新值,但是拿到之后可能
累加前使用的 count 发生了变化,那么统计结果就不准了。所以最安全的做法,是在统计 size
的时候把所有 Segment 的 put,remove 和 clean 方法全部锁住,但是这种做法显然非常低
效。
因为在累加 count 操作过程中,之前累加过的 count 发生变化的几率非常小,所以
ConcurrentHashMap 的做法是先尝试 2 次通过不锁住 Segment 的方式来统计各个
Segment 大小,如果统计的过程中,容器的 count 发生了变化,则再采用加锁的方式来统计
所有 Segment 的大小。
那么 ConcurrentHashMap 是如何判断在统计的时候容器是否发生了变化呢?使用
modCount 变量,在 put , remove 和 clean 方法里操作元素前都会将变量 modCount 进行
加 1,那么在统计 size 前后比较 modCount 是否发生变化,从而得知容器的大小是否发生变化。
**************************************************************************************
四、ClassLoader 的分类及加载顺序
主要分4类,见下图橙色部分
JVM类加载器:这个模式会加载JAVA_HOME/lib下的jar包
扩展类加载器:会加载JAVA_HOME/lib/ext下的jar包
系统类加载器:这个会去加载指定了classpath参数指定的jar
文件
用户自定义类加载器:sun提供的ClassLoader是可以被继承的,
允许用户自己实现类加载器
类加载器的加载顺序如图所示:
剩余37页未读,继续阅读
资源评论
小小哭包
- 粉丝: 2080
- 资源: 4254
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功