本文主要是介绍JAVA 高级开发技术点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
ConcurrentHashMap 内部实现原理
看起来只问了一个问题,但是其中包含了大量知识点,我们将知识点罗列如下
1. HashMap
HashMap在1.8版本有一些比较重要的变化,所以需要分开来看
JDK1.7数据结构
JDK1.7的存储结构是数组+链表的形式,首先有一个Hash桶存储Entry结构的元素;Entry组成一个链表结构,Entry的next字段指向下个元素的位置形成一个链表结构;
JDK1.8数据结构
JDK1.8将之前数据+链表的结构升级为数据+链表+红黑树的结构
JDK1.8之后如果链表长度超过8将会将链表转换为红黑树,长度小于6时将红黑树转换为链表
hash算法与hash碰撞
hash算法: 为了key值能够比较平均的分部在hash桶中的一个算法 hash碰撞: key值经过hash算法后落在同一个hash桶位置时就叫做hash碰撞;
扩容机制以及阈值
HashMap初始容量 DEFAULT_INITIAL_CAPACITY = 16 负载因子 DEFAULT_LOAD_FACTOR = 0.75
扩容机制
当容量超过当前容量 * 负载因子时进行扩容,扩容后的容量是当前容量的两倍;
头插和尾插
1.7之前使用头插法,头插法在多线程扩容时会出现成环状链表的问题; 1.8开始使用尾插法,不会存在环状链表的问题;
2. HashTable
为什么要用HashTable HashTable和ConcurrentHashMap对比
3. ConcurrentHashMap 原理
底层结构怎么保证并发安全 ConcurrentHashMap底层存储结构和算法 ConcurrentHashMap和HashTable有哪些优势和劣势 ConcurrentHashMap扩容
线程池的原理
大致整理如下图: 其中又几个点需要注意:
corePoolSize: 核心线程数量 maxPoolSize: 最大线程数量 queueCapacity: 队列容量 rejectedExecutionHandler: 异常策略 keepAliveSeconds: 线程空闲最大存活时间
Redis的设计思想
为什么Redis单线程的情况下速度还是很快
除了磁盘和内存的IO等级不一样外,最主要的是想考察 NIO 和 BIO的内容,因为Redis设计中大量使用了异步非阻塞IO思想;
BIO NIO AIO
JDK1.4之前使用的是BIO JDK1.4引入了NIO JDK1.7引入了AIO
BIO同步阻塞IO模型 NIO同步非阻塞IO模型 AIO异步非阻塞IO模型
同步和异步
同步和异步是来描述消息通讯机制的;
同步:消息发出后一直等待返回消息,直到消息返回或报错; 异步:消息发出后就不管了,所以没有返回消息;
阻塞和非阻塞
阻塞和非阻塞是来描述消息通讯状态的;
阻塞: 消息发出后一直等待返回消息,在等待的这个状态线程是阻塞的; 非阻塞: 消息发出后不等待,去执行其它的任务,这个线程的状态是非阻塞的;
MySQL数据库索引失效的场景
当查询条件中使用OR查询是即便创建了索引,索引也是不生效的; 只有当OR条件中的所有列都创建索引时才会走索引; 数据类型隐士转换,此时不走索引,如果此时num字段是字符串类型则不走索引产生全表扫描 select * from user where num = 123
使用like查询并使用后匹配是不走索引,这种现象是由于mysql底层索引存储结构是B+Tree,后匹配查询无法确定顺序 select * from user where name like 's%'
这种情况走索引 select * from user where name like '%s'
这种情况不走索引 复合索引没有按照最左匹配原则,则不走索引;这也和MySQL索引底层存储结构有关,原理和模糊查询索引失效原理一样;
MySQL事物底层实现原理
这个问题问之前一般会问事物的隔离级别与传播行为,这里的内容我在2-3年java面试博客中有专门写,这里就不展开了;
同时如果问MVCC思想其实就是要考察MySQL事物底层实现原理;
MVCC(Multi-Version Concurrency Control) 多版本并发控制
是一种多版本并发控制方法,MySQL就是使用MVCC控制查询访问的,在MySQL中当事物的隔离级别为:READ_COMMIT(读已提交),REPEA_TABLE(可重复度),使用select查询从版本列表中获取数据的过程;
未完待续,持续更新…
这篇关于JAVA 高级开发技术点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!