JAVA 高级开发技术点
2021/6/4 14:51:01
本文主要是介绍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 高级开发技术点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-07转型传统行业避坑指南!
- 2025-01-07百万架构师第九课:源码分析:Spring 源码分析:Spring5源码分析-预习资料|JavaGuide
- 2025-01-07为你的程序精选的4个优质支付API
- 2025-01-06责任分配矩阵在项目管理中的作用:结合工具提升团队生产力
- 2025-01-06板栗看板:优化项目管理的实用策略,助你轻松完成任务
- 2025-01-06电商小白怎么选取合适的工具?一站式工具指南来啦
- 2025-01-06企业如何避免春节期间的项目断层?四大方法教给你!
- 2025-01-06初创团队如何在动态环境下利用看板工具快速迭代
- 2025-01-06企业内部管理如何实现高效?四大策略教会你
- 2025-01-06给 Postgres 写一个向量插件 - 向量类型