来,话不多说进入正题!我们下面用最简单的代码创建ArrayList并添加11个元素,并 一 一 讲解底层源码:在说之前,给大家先普及一些小知识: >ArrayList底层是用数组来实现的 >数组一旦创建后,大小就是固定的,如果超出了数组大小后,就会创建一个新的数组 >接下来所谓数组的扩容实质上是重新创建一个大小更大的新数组 @Test public void testArrayList() { //创建一个泛型为String的ArrayList(这里泛型是什么不重要) ArrayList…
前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代理真的非常简单,只不过就是实现一个 InvocationHandler 接口重写一下 invoke 方法而已.不错,其实很多看似 high level 的技术都并没有想象中的那么晦涩难懂,只要你肯下定决心去了解它,去认识它,去学习它你就会发现,原来都是可以学得懂的.本篇博文将介绍 DroidPlugin 框架…
前言:在前两篇文章中分别介绍了动态代理.反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章.经过了前面两篇文章的铺垫,终于可以玩点真刀实弹的了,本篇将会通过 Hook 掉 startActivity 方法的一个小例子来介绍如何找出合适的 Hook 切入点. 开始之前我们需要知道的一点就是,其实在 Android 里面启动一个 Activity 可以通过两种方式实现,一种是我们常用的调用 Activity.startActivity 方法,一种是调用 Context.st…
各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--REDIS基础数据结构 今天我朋友突然找到我,说他面试被刷了. 我一脸吃惊,忙问到:怎么了,倒在什么题上了. 朋友说:面试官说,你说你了解Redis的基础数据结构,那我问问你,你知道什么是Skiplist跳跃表吗?讲讲它是一种什么样的数据结…
目录 如果您在浏览过程中发现文章内容有误,请点此链接查看该文章的完整纯净版 下载 Linux Mac OS 安装 运行安装程序 同意使用协议 选择附加任务 准备安装 开始安装 安装完成 如果您在浏览过程中发现文章内容有误,请点此链接查看该文章的完整纯净版 使用和配置 系列文章 如果您在浏览过程中发现文章内容有误,请点此链接查看该文章的完整纯净版 Visual Studio Code,简称 VSCode.它一款免费开源的现代化轻量级代码编辑器,使用方便快捷,功能强大,支持各种的文件格式,跨平台支持…
不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这个公司待遇比较丰厚,而且离小A住的地方也比较近,最让小A中意还是有个肯带他的大佬.小A对这份工作非常满意.时间一天一天过去,某个周末,小A来找我家吃蹭饭.在饭桌上小A给我分享了他上星期的一次事故经历. 上个星期,他们公司出了比较严重的一个事故,一个导出报表的后台服务拖垮了报表数据服务,导致很多查询该…
一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 中 读 写 并 持 久 化 本 地 文 件 root.data , 性 能 较 高 ( 默 认 ).db: 高 可 用 模 式 , 全 局 事 务 会 话 信 息 通 过 d b 共 享 , 相 应 性 能 差 些.redis: Seata-server 1 3 及 以 上 版 本 支 持 , 性…
一.ArrayList的扩容机制 1.扩容的计算方式是向右位移,即:newSize = this.size + (this.size>>1).向右位移,只有在当前值为偶数时,才是除以2:奇数时是抹去最后一位,也就是先减1,然后除以2:附上源码,如下图: 2.扩容的上限:ArrayList的长度并不是没有限制的,它的默认最大长度值是,Integer.MAX_VALUE-8,但是可以突破到 Integer.MAX_VALUE.所以请注意:如果到达ArrayList的默认最大值的时候,扩容不再是1.…
关于ArrayList的扩容机制 ArrayList作为List接口常用的一个实现类,其底层数据接口由数组实现,可以保证O(1) 复杂度的随机查找, 在增删效率上不如LinkedList,但是在查询效率较高,相对同是数组实现的Vector,并不能保证线程安全,所以多适用于单线程环境. 由于底层是有数组实现,因为数组的长度需要初始化定义,并不能自动进行长度增加,所以ArrayList有对应的扩容机制,当增加元素时,会判断是否需要扩容,下面看源码: 首先认识ArrayList的几个重要变量: /*序…
浅谈ArrayList ArrayList类又称动态数组,同时实现了Collection和List接口,其内部数据结构由数组实现,因此可对容器内元素实现快速随机访问.但因为ArrayList中插入或删除一个元素需要移动其他元素,所以不适合在插入和删除操作频繁的场景下使用. ArrayList的容量可以随着元素的增加而自动增加,因此不用担心ArrayList容量不足的问题. ArrayList是非线程安全的. 接下来,我们将解析ArrayList的构造方法,在看构造方法之前,我们先来明确一下Arr…
前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以决心花些时间研究了一下 DroidPlugin 插件框架的原理,以便再出现问题时也能从容应对.打开源码后发现尽是大把大把的 hook.binder.classloader 等等,很难摸清头绪,幸运的是,有很多热心的大神已经对 DroidPlugin 的原理进行了透彻的剖析,文末会有本人对参考文章的致…
前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以决心花些时间研究了一下 DroidPlugin 插件框架的原理,以便再出现问题时也能从容应对.打开源码后发现尽是大把大把的 hook.binder.classloader 等等,很难摸清头绪,幸运的是,有很多热心的大神已经对 DroidPlugin 的原理进行了透彻的剖析,文末会有本人对参考文章的致…
众所周知,TCP在建立连接时需要经过三次握手.许多初学者经常对这个过程感到混乱:SYN是干什么的,怎么一会儿是1一会儿是0?怎么既有大写的ACK又有小写的ack?为什么ACK在第二次握手才开始出现?初始序列号isn有什么讲究?isn和seq有什么关系?ack的值到底是什么? 别慌,别着急,看完这篇文章,我相信上述问题对你来说就会迎刃而解. 我将TCP三次握手所涉及到的具体操作,总结为"设标志位,发序列号".这里先告诉你一下,一般来说标志位的名称全部大写,序列号的缩写名称全部小写. 在开…
动态扩容 1.add(E e)方法中 ①  ensureCapacityInternal(size+1),确保内部容量,size是添加前数组内元素的数量 ②  elementData[size++] = e  添加元素到相应位置,元素数量加1 2. ensureCapacityInternal(size+1)确保内部容量 ① 计算最小需要空间(如果传入的是个空数组则最小容量取默认容量与minCapacity之间的最大值) ② 判断是否需要扩容(如果最小需要空间比elementData的内存空间要…
不同的JDK版本的扩容机制可能有差异 实验环境:JDK1.8 扩容机制: 当向ArrayList中添加元素的时候,ArrayList如果要满足新元素的存储超过ArrayList存储新元素前的存储能力,ArrayList会增强自身的存储能力,已达到存储新元素的要求 ArrayList:本质通过内部维护的数组对象进行数据存储 ①:分析ArrayList的add(E)方法 public boolean add(E e) { ensureCapacityInternal(size + 1); // In…
初始化:有三种方式 1.默认的构造器,将会以默认的大小来初始化内部的数组:public ArrayList(); 2.用一个ICollection对象来构造,并将该集合的元素添加到ArrayList:  public ArrayList(Collection<? extends E> c) 3.用指定的大小来初始化内部的数组: public ArrayList(int initialCapacity)  下面我们来重点关注一下无参数构造器的实现过程: 通过代码可是它的初始容量为0.而在之前JD…
前言 最近在准备面试题刷到了JVM这块,作为一个小白,巩固知识点最好的方式就是亲手写出来并分享:相信我的理解,同样是小白的你,一定有很大的帮助.不信,请你往下看! JVM内存区域简介 如果有人问Java的内存区域或者运行时数据区域,说的就是JVM内存区域 Java程序在运行的时候,Java虚拟机所管理的内存是被划分为若干个数据区域,注意这些数据区域不是固定死的,抽象得可以分成为JDK1.8前后的JVM内存区域,但是总体上差别不大. 一.JDK1.8前的JVM内存区域 JVM内存区域从线程的角度可…
目录 前言 IOC 只是一个 Map 集合 IOC 三大核心接口 IOC 初始化三大步骤 定位 加载 注册 总结 前言 在 Spring 框架中,大家耳熟能详的无非就是 IOC,DI,Spring MVC,AOP,这些是 Spring 中最基础的核心功能,再高级点的功能就还有数据数据访问模块(JDBC,ORM,事务等).Spring 本身的扩展性也做得非常好,源码当中也是运用了大量设计模式来实现,了解 Spring 源码对于一个 Java 开发人员来说是非常有必要的,从源码中我们也可以学习到很多…
自动依赖注入 什么是依赖注入,用大白话将通过类型提示的方式向函数传递参数. 实例 1 首先,定义一个类: /routes/web.php class Bar {} 假如我们在其他地方要使用到 Bar 提供的功能(服务),怎么办,直接传入参数即可: /routes/web.php Route::get('bar', function(Bar $bar) { dd($bar); }); 访问 /bar,显示 $bar 的实例: Bar {#272} 也就是说,我们不需要先对其进行实例!如果学过 PH…
各位看官大大们,周末好! 作为一个Java后端开发,要想获得比较可观的工资,Redis基本上是必会的(不要问我为什么知道,问就是被问过无数次).那么Redis是什么,它到底拥有什么神秘的力量,能获得众多公司的青睐?接下来就由小编我带大家来揭秘Redis的五种基本数据结构. Redis是C语音编写的基于内存的数据结构存储系统.它可以当作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 列表(lists), 字典(dictht),集合(sets), 有序集合(so…
前言 现如今JAVA开发工程师的数量越来越多,但大多数工程师平时做的工作都是简单的CRUD,当你一直处于这种舒适的环境中不追求进步的时候,如果哪一天你突然想要改变环境,换个工作,去与面试官当面聊技术的时候,你会发现自己什么都不会! 可能我们经常会被面试官问到:"你懂事务的ACID吗?" 你回答:"ACID不就是原子性.一致性.隔离性和持久性嘛,这有什么好说的." 当你这么回答的时候,面试官微微一笑,又问到:"说的不错,那你能具体解释一下吗?" 你…
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. dubbo 是一款开源的 RPC 框架,主要有3个角色: 提供者(provider).消费者(consumer) .注册中心(registry) 提供者启动时向注册中心注册服务地址,消费者启动时订阅服务,并通过获取到的提供者地址发起调用,当提供者地址变更时,通过注册中心向消费者推送变更…
目录 前言 依赖注入的入口方法 依赖注入流程分析 AbstractBeanFactory#getBean AbstractBeanFactory#doGetBean AbstractAutowireCapableBeanFactory#createBean AbstractAutowireCapableBeanFactory#doCreateBean 创建 bean 实例(AbstractAutowireCapableBeanFactory#createBeanInstance) 依赖注入(Ab…
核弹级bug Log4j,相信很多人都有所耳闻了,这两天很多读者都在问我关于这个bug的原理等一些问题,今天咱们就专门写一篇文章,一起聊一聊这个核弹级别的bug的产生原理以及怎么防止 产生原因 其实这个主要的原因,和日志有关,日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录. 最简单的日志打印 我们看如下场景: 这个场景大家应该很熟悉了,就是用户登录,咱们今天不用关心登录是怎么实现的,只用关心用户名name字段就可以了,代码如下 pub…
1 事件背景 经过一周时间的Log4j2 RCE事件的发酵,事情也变也越来越复杂和有趣,就连 Log4j 官方紧急发布了 2.15.0 版本之后没有过多久,又发声明说 2.15.0 版本也没有完全解决问题,然后进而继续发布了 2.16.0 版本.大家都以为2.16.0是最终终结版本了,没想到才过多久又爆雷,Log4j 2.17.0横空出世. 相信各位小伙伴都在加班加点熬夜紧急修复和改正Apache Log4j爆出的安全漏洞,各企业都瑟瑟发抖,连网警都通知各位站长,包括我也收到了湖南长沙高新区网警…
promise出现的目的一为处理JavaScript里的异步,再就是避免回调地狱. promise有三种状态:pending/reslove/reject . pending就是未决,resolve可以理解为成功,reject可以理解为拒绝. promise的最终状态会凝固,成功了以后即便再执行reject ('failed')状态也不会改变. Promise是一个构造函数,自己身上有all.reject.resolve这几个的方法,原型上有then.catch等同样的方法.这么说用Promis…
一,什么是事务(本地事务)? 指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 简单的说,事务就是并发控制的单位,是用户定义的一个操作序列.      而一个逻辑工作单元要成为事务,就必须满足ACID属性.     A:原子性(Atomicity)     事务中的操作要么都不做,要么就全做.    C:一致性(Consistency)    事务执行的结果必须是从数据库从一个一致性状态转换到另一个一致性状态.   I:隔离性(Isolation)    一个事务的执行…
目录 前言 Spring MVC 请求流程 Spring MVC 两大阶段 初始化 HttpServletBean#init() FrameworkServlet#initServletBean FrameworkServlet#initWebApplicationContext DispatchServlet#onRefresh Spring MVC 九大组件 MultipartResolver LocaleResolver ThemeResolver HandlerMapping Handl…
Kubernetes 这个单词来自于希腊语,含义是舵手或领航员 .其词根是 governor 和 cybernetic.K8s 是它的缩写,用 8 字替代了"ubernete". 容器 在我们尝试了解 Kubernetes 之前,让我们花一点时间来澄清容器是什么,以及它们为什么如此受欢迎. 毕竟,在不知道容器是什么的情况下谈论容器编排器(Kubernetes)是没有意义的! 容器 "容器"是一个用来存放你放入的所有物品的容器.像应用程序代码,依赖库以及它的依赖关系一…
什么是编解码器? 首先,我们回顾一下netty的组件设计:Netty的主要组件有Channel.EventLoop.ChannelFuture.ChannelHandler.ChannelPipe等. ChannelHandler ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器.例如,实现ChannelInboundHandler接口(或ChannelInboundHandlerAdapter),你就可以接收入站事件和数据,这些数据随后会被你的应用程序的业务逻辑处理.当…