Floating Cat

HashMap之哈希数组容量计算
构造函数HashMap在初始化时允许我们指定负载因子和哈希数组初始化容量大小,以JDK 1.8为例,其最终调用构造方法如下: 12345 public HashMap(int initialCapacity, float loadFactor) {...... this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity); } 默认情况下负载因子loadFactory为0.75f初始化容量initialCapacity为16. 其中HashMap要求哈希...
Https简易工作原理
最近在看到这么一篇讲解Https原理的文章,语言精炼,通俗易懂,特地将其翻译下,原文在此how does https work 加密算法简介正文开始之前,我先来解释简单的解释下对称加密和非对称加密. 对称加密采用对称密码编码技术,也就是编码和解码采用相同描述字符,即加密和解密使用相同的密钥,实现这种加密技术的算法称对称加密算法。对称加密使用简单,密钥较短,加密和解密过程较快,耗时短,常见的对称加密算法有DES,3DES,lDEA,AES,RC4等。 非对称加密与对称加密不同,其加密算法需要两个密钥:公开密钥(publickey)和私有密钥(private),两者是一对的。如果用公钥...
深入分析AIL语言及init.rc
AIL语法AIL语言非常简单,主要包括两部分:结构语法及注释语法.下面我们就这两点进行说明 结构语法AIL语言包含主要包含五种结构语法: Actions Services Options Commands Imports 需要注意,AIL采用是面向行的代码风格,即用换行符作为一条语句的分隔符,也就是在init.rc中以一条语句通常占据一行.如果一行写不下,可以在行尾添加反斜杠来链接到下一行,换言之,通过行尾添加反斜杠符可以将多行代码链接为一行代码. init.rc有许多Service和Action组成.那么什么是Service和Action呢?Action和Service显式声明了一...
从inotify机制到FileObserver原理
inotify简介那还有其他的方式么?熟悉linux的童鞋应该记得从linux kernel 2.6.13开始引入inotify机制,用于通知用户相关文件变化情况:任何一个文件发生某种变化,都会产生一个相应的文件事件. 我们不仅好奇,文件的哪些事件能够被监控,也就是说inotify支持监控文件的哪些变化呢?继续往下看. 可监控事件类型目前inotify能够监控的以下文件变化事件: 事件类型 说明 IN_ACCESS 文件被访问 IN_MODIFY 文件被修改 IN_ATTRIB 文件属性被修改 IN_CLOSE_WRITE 可写文件被关闭 IN_CLOSE_...
简析Base64原理
Base64起源在网络传输中,有些方式并不支持所有的字节,比如早起邮件系统支持传输可见字符,而对于ASCII中的控制字符就无法传输.在比如在传图图片时,由于图片对应的二进制流中的字节有些事不可见字符,因此也就无法进行传输,那怎么在不修改传输协议的前提下,来支持所有的字节传输呢,换言之就是讲不可见字符表示为可见字符? 而Base64就是该问题的一种解决方案,它是一种基于64个可见字符来表示二进制数据的方法. Base64编码规则Base64首先定义一个可见字符的索引表,按照规定,字符选用了A-Z、a-z、0-9、+、/这64个字符. 接下来首先将待转换的字符串每三个化为一组,由于每个字符...
从VFS谈文件读写
内核态与用户态在CPU的所有指令中,有一些指令是非常危险的,误用将导致系统崩溃.为了安全起见CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令.Intel CPU提供0到3四种级别的运行模式,数字越小特权越高.在Linux机器上,CPU只会在以下两种模式下运行: 受信任的内核模式(0级别),对应于Linux中的内核态 受限制的用户模式(3级别): 对应于LInux中的用户态 处理器总处于以下状态中的一种: 内核态,运行于进程上下文,内核代表进程运行于内核空间; 内核态,运行于中断上下文,内核代表硬件...
StringBuilder & StringBuffer设计与实现
AbstractStringBuilderStringBuilder与StringBuffer是两个常用的操作字符串的类,两者最大的区别在于StringBuilder是线程不安全的,而StringBuffer是线程安全的,此外前者是JDK1.5加入的.后者在JDK1.0就有了. 和String不同,StringBuilder和StringBuffer都是基于数组扩容来实现,其核心代码在其父类AbstractStringBuilder中.可以说StringBuilder和StringBuffer的实现原理是一样的,唯一的不同的是StringBuffer的大多数方法都是用synchroniz...
谈JVM类加载机制
类加载机制 虚拟机将class文件加载到内存,并对数据校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。在java中语言中类的加载、连接和初始化过程都是在程序运行期间完成的,因此在类加载时的效率相对编译型语言较低,除此之外,只有在任何一个类只有在运行期间使用到该类的时候才会将该类加到内存中。总之,java依赖于运行期间动态加载和动态链接来实现类的动态使用。其整个流程如下: 其中加载、检验、准备、初始化和卸载这个五个阶段的顺序是固定的,而解析则未必。为了支持动态绑定,解析这个过程可以发生在初始化阶段之后。另外,这个过程表示的是按顺序开始,不是所谓的第一步、第二步...
谈JVM内存区域
JVM内存区域首先,先大体的了解一下JAVA虚拟机运行时的内存结构: 从线程的角度来看,总体分为私有和共享的两部分。共享的数据区为方法区,堆,本地库接口,以及每个JVM虚拟机中的JVM执行引擎,而线程私有的数据区则为虚拟机栈,本地方法栈,程序计数器。 线程共享数据区堆在Java中我们最熟悉的就是对象,在内存中用来存放内存对象实例的区域称之为堆(Heap),此区域由线程内存共享,在进行垃圾回收时,此区域是垃圾回收器重点关注的地方,因此我们也称之“GC堆”。早起的Java虚拟机严格按照JVM虚拟规范来涉及:任何的对象实例及数组都要在堆上分配,但随着JIT编译器的发展,许多新生的优化技术(比...
谈JVM字节码执行引擎
就目前而言,所有的执行引擎的基本一致: 输入:字节码文件 处理:字节码解析 输出:执行结果。 物理机的执行引擎是由硬件实现的,和物理机的执行过程不同的是虚拟机的执行引擎由于自己实现的。 运行时候的栈结构每一个线程都有一个栈,也就是前文中提到的虚拟机栈,栈中的基本元素我们称之为栈帧。栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。每个栈帧都包括了一下几部分:局部变量表、操作数栈、动态连接、方法的返回地址 和一些额外的附加信息。 栈帧中需要多大的局部变量表和多深的操作数栈在编译代码的过程中已经完全确定,并写入到方法表的Code属性中。在活动的线程中,位于当前栈顶的栈帧才是有效的,称...