JAVA 高级开发技术点

2021/6/4 14:51:01

本文主要是介绍JAVA 高级开发技术点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

ConcurrentHashMap 内部实现原理

看起来只问了一个问题,但是其中包含了大量知识点,我们将知识点罗列如下

1. HashMap

HashMap在1.8版本有一些比较重要的变化,所以需要分开来看

JDK1.7数据结构

JDK1.7的存储结构是数组+链表的形式,首先有一个Hash桶存储Entry结构的元素;Entry组成一个链表结构,Entry的next字段指向下个元素的位置形成一个链表结构;
jdk1.7数据结构

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

  1. 为什么要用HashTable
  2. HashTable和ConcurrentHashMap对比

3. ConcurrentHashMap 原理

  1. 底层结构怎么保证并发安全
  2. ConcurrentHashMap底层存储结构和算法
  3. ConcurrentHashMap和HashTable有哪些优势和劣势
  4. ConcurrentHashMap扩容

线程池的原理

大致整理如下图:
在这里插入图片描述
其中又几个点需要注意:

  1. corePoolSize: 核心线程数量
  2. maxPoolSize: 最大线程数量
  3. queueCapacity: 队列容量
  4. rejectedExecutionHandler: 异常策略
  5. keepAliveSeconds: 线程空闲最大存活时间

Redis的设计思想

为什么Redis单线程的情况下速度还是很快

  1. 除了磁盘和内存的IO等级不一样外,最主要的是想考察 NIO 和 BIO的内容,因为Redis设计中大量使用了异步非阻塞IO思想;

BIO NIO AIO

JDK1.4之前使用的是BIO
JDK1.4引入了NIO
JDK1.7引入了AIO

  • BIO同步阻塞IO模型
  • NIO同步非阻塞IO模型
  • AIO异步非阻塞IO模型

同步和异步

同步和异步是来描述消息通讯机制的;

  1. 同步:消息发出后一直等待返回消息,直到消息返回或报错;
  2. 异步:消息发出后就不管了,所以没有返回消息;

阻塞和非阻塞

阻塞和非阻塞是来描述消息通讯状态的;

  1. 阻塞: 消息发出后一直等待返回消息,在等待的这个状态线程是阻塞的;
  2. 非阻塞: 消息发出后不等待,去执行其它的任务,这个线程的状态是非阻塞的;

MySQL数据库索引失效的场景

  1. 当查询条件中使用OR查询是即便创建了索引,索引也是不生效的; 只有当OR条件中的所有列都创建索引时才会走索引;
  2. 数据类型隐士转换,此时不走索引,如果此时num字段是字符串类型则不走索引产生全表扫描 select * from user where num = 123
  3. 使用like查询并使用后匹配是不走索引,这种现象是由于mysql底层索引存储结构是B+Tree,后匹配查询无法确定顺序
    select * from user where name like 's%' 这种情况走索引
    select * from user where name like '%s' 这种情况不走索引
  4. 复合索引没有按照最左匹配原则,则不走索引;这也和MySQL索引底层存储结构有关,原理和模糊查询索引失效原理一样;

MySQL事物底层实现原理

这个问题问之前一般会问事物的隔离级别与传播行为,这里的内容我在2-3年java面试博客中有专门写,这里就不展开了;

同时如果问MVCC思想其实就是要考察MySQL事物底层实现原理;

MVCC(Multi-Version Concurrency Control) 多版本并发控制

是一种多版本并发控制方法,MySQL就是使用MVCC控制查询访问的,在MySQL中当事物的隔离级别为:READ_COMMIT(读已提交),REPEA_TABLE(可重复度),使用select查询从版本列表中获取数据的过程;

未完待续,持续更新…



这篇关于JAVA 高级开发技术点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程