ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JAVA 高级开发技术点

2021-06-04 14:33:37  阅读:145  来源: 互联网

标签:JAVA 高级 阻塞 链表 索引 开发技术 线程 MySQL hash


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,高级,阻塞,链表,索引,开发技术,线程,MySQL,hash
来源: https://blog.csdn.net/shencange/article/details/117436883

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有