JDK源码分析系列--HashMap.TreeNode置顶||技术源码|Java这篇可以看作是JDK源码分析系列—HashMap的下篇。java.util.HashMap.TreeNode是HashMap中非常重要的一个类,主要目的在于:当哈希冲突比较严重的时候,提升HashMap的查询效率。尽管实际用到的概率不高,却占了HashMap篇幅的1/4左右。因此在这写一篇单独分析。 ...
阅读更多
个人博客切换服务器(阿里云版)|问题|教程之前的阿里云服务器是在2020年双十一新用户活动购买的,一晃三年已经到期,高昂的续费价格劝退。本来想要切换到腾讯云,但感觉有点繁琐。恰巧阿里云推出了一年99元新老用户同享的活动,且承诺续费不涨价!遂购买并顺利切换。在此记录下整个过程。
背景我是使用 阿里云服务器+域名+hexo 来搭建的个人博客, ...
阅读更多
Linux环境ELK系统搭建|技术|部署-ELK项目中的日志系统使用的是ELK(elasticsearch + logstash + filebeat),其中filebeat负责从每个服务器的日志文件中提取数据并发送给logstash,logstash负责数据过滤并存储到es,es负责数据存储和提供查询。
整个搭建与配置过程比较繁琐,想着在这里记 ...
阅读更多
JDK源码分析系列--AbstractExecutorService|技术源码|多线程上一篇介绍了ThreadPoolExecutor,提供了一个execute方法执行任务,但execute方法没有返回值,不能批量提交任务,不能设置超时时间。AbstractExecutorService是ThreadPoolExecutor的抽象父类,提供了一些额外方法,使得执行任务的功能得到增强。 ...
阅读更多
JDK源码分析系列--ThreadPoolExecutor|技术源码|源码线程池是众多池化思想的一种。在Java中,与多线程相关的是java.util.concurrent包,而其中最核心的便是线程池类java.util.concurrent.ThreadPoolExecutor。该类包含了线程池的维护与任务执行的过程。本文主要围绕ThreadPoolExecutor,既 ...
阅读更多
为什么HashMap链表转红黑树的阈值是8|技术Java|数据结构在JDK1.8中,HashMap引入了红黑树结构。当链表(不包括头结点)长度>=8,且数组长度> = 64时,会触发链表转红黑树的逻辑,以提升查询效率。那么为什么是8?又是怎么计算的?
结论
红黑树是一种特殊的平衡二叉树,其时间复杂度是O(log n),链表的时间复杂度是O(n)。在n ...
阅读更多
JDK源码分析系列--LinkedHashMap|技术源码|源码引言前面已对java.util.HashMap的源码做了详细的分析。HashMap底层采用哈希表,保证了put和get操作的高效。但也导致了遍历操作是无序的。java.util.LinkedHashMap则是在HashMap的基础上,维护了一条双向链表,记录了节点的插入顺序。使遍历操作可以按插入顺序 ...
阅读更多
JDK和CGLIB动态代理|技术|JavaJava中动态代理代理包括JDK动态代理和CGLIB动态代理。前者通过实现目标类的接口,和反射技术实现。后者不需要实现接口,而是通过继承目标类,并通过方法拦截技术实现。Spring的AOP技术则是集成了这两种动态代理。本文对两种代理的使用方法做一个简要介绍。
代理模式首先介绍下设计模式中的代理模式 ...
阅读更多
JDK源码分析系列--HashMap|技术源码|源码java.util.HashMap源码一直是面试必问的项目,包括底层数据结构、扩容机制,以及为什么线程不安全等。本文作为JDK源码分析系列的开端,首先从HashMap开始,对其源码进行剖析。源码基于JDK1.8
关于红黑树的部分,本文由于篇幅有限,不再展开。
数据结构在介绍具体方法前,有必要说明下h ...
阅读更多
Linux环境RabbitMQ部署|技术|部署-MQRabbitMQ的部署有很多坑,有时候项目要求搭建个MQ测试环境,没有经验的话会浪费很长时间。记录下来,以备不时之需。
目前RabbitMQ最新版本已经迭代到3.10.7,部署过程可能已有区别。本文仅供参考。
版本RabbitMQ是Erlang语言编写的,所以在安装RabbitMQ之前,需要先安装E ...
阅读更多