- 博客(21)
- 收藏
- 关注
原创 Java 负数byte转int
public static void main(String[] args) throws IOException { byte b = -127; int c = b & 0xff; // 0xff是int类型 System.out.println(c); }输出结果为:为什么会是129呢?-127的二进制为:11111111(由于...
2018-04-19 15:51:48 3388
原创 Java高低位和byte转int
最近研究I/O流,发现read()方法返回的是int类型,原来是将一个byte读入到一个int,有效的数据只占据int型变量的最低8位。在正常情况下这个int型的变量永远都不可能是负数。什么是高低位?一个Byte是8位(bit),其中的“8位”指的是8位2进制数。byte范围是-128--127,如果输入超过这个数值,会编译错误。如8位二进制数:11001010;1100就是高4位,后面的1010...
2018-04-19 13:09:12 4169
原创 Condition的await()和signal()分析
Condition使用Node来封装需要控制的线程,Node具有以下状态:static final Node SHARED = new Node(); // 共享模式static final Node EXCLUSIVE = null; // 独占模式static final int CANCELLED = 1; // 线程超时或被中断,需要取消该Nodestatic fina...
2018-04-14 12:08:41 2788
原创 ReentrantLock源码分析
新建Lock时,ReentrantLock默认使用非公平锁进行同步:public ReentrantLock() { sync = new NonfairSync(); // NonfairSync是内部类,实现了Syn内部抽象类 }也可以在构造函数传入boolean参数,控制锁的类型,实现如下: public ReentrantLock(boolean fair) { ...
2018-04-13 17:12:46 178
原创 ReentrantLock的Syn内部类分析
final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); // 获得当前线程 int c = getState(); // 获取锁的状态值 if (c == 0) { // 如...
2018-04-13 12:20:09 270
原创 DispatchServlet流程 - 2
当DispatchServlet接到请求时,会先执行FrameWorkServlet类的service()方法,这个方法判断了请求的类型,例如“GET”,“POST"等等;假设是POST请求,就调用doPost()方法,doPost()调用了processRequest()方法,processRequest()执行了doServer()方法,开始真正的对 request 进行处理,设置相关对象到r...
2018-04-12 17:39:47 599
原创 DispatchServlet流程 - 1
DispatchServlet执行请求之前,需要执行一系列方法,主要用于初始化组件:HttpServletBean的init()核心代码: public final void init() throws ServletException { // Set bean properties from init parameters. // Servlet初始化参...
2018-04-12 17:39:40 686
原创 ContextLoaderListener和DispatchServlet的配置
<!--配置ContextLoaderListener的方法--><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--ContextLoaderListener的...
2018-04-11 16:28:08 727
原创 HashMap的computeIfAbsent分析
computeIfAbsent()方法会在执行时查询table是否存在指定的key,如果存在,返回value值如果不存在,则执行mappingFunction.apply(key)方法,查询value值,添加进map,并返回查询的value值,但是mappingFunction.apply((key)返回的值为null或抛出异常,则不会添加进mappublic V computeIfAbsent(...
2018-03-30 16:01:44 1119
原创 HashMap源码 8
上篇文章分析了keySet内部类,然后发现Values和EntrySet的原理是差不多的,下面就对一下比较不一样的方法进行分析EntrySet的contains()方法:用于判断Map内是否包含某节点,返回boolean类型,必须key和value都和Map中的某个节点K,V相同,才返回truepublic final boolean contains(Object o) { ...
2018-03-30 14:01:15 134
原创 HashMap源码 7 - KeySet分析
KeySet内部类:final class KeySet extends AbstractSet<K> { public final int size() { return size; } public final void clear() { HashMap.this.clear(); } ...
2018-03-29 16:28:37 374
原创 HashMap源码 6
clear()方法:方法用于清空整个哈希表public void clear() { Node<K,V>[] tab; modCount++; if ((tab = table) != null && size > 0) { // 判断哈希表是否为空 size = 0; f...
2018-03-29 14:25:11 147
转载 HashMap的modCount
modCount用于记录HashMap的修改次数,在HashMap的put(),get(),remove(),Interator()等方法中,都使用了该属性由于HashMap不是线程安全的,所以在迭代的时候,会将modCount赋值到迭代器的expectedModCount属性中,然后进行迭代,如果在迭代的过程中HashMap被其他线程修改了,modCount的数值就会发生变化,这个时候expec...
2018-03-29 13:48:00 4272 2
原创 HashMap源码 5
treeifyBin()方法:大致过程为:链表长度超过TREEIFY_THRESHOLD(默认为8)时,会调用本方法,本方法会判断HashMap的长度,如果小于MIN_TREEIFY_CAPACITY(默认为64),则进行扩容,否则将链表转换为TreeNode链,最后调用treeify方法生成红黑树final void treeifyBin(Node<K,V>[] tab, int h...
2018-03-29 10:38:33 130
原创 详解resize()的rehash部分
if ((e.hash & oldCap) == 0)如果返回true,表示(e.hash & (oldCap - 1))和(e.hash & (newCap - 1))的结果是相同的因为Map容量必须是2次幂,并且翻倍扩容,所以oldCap和newCap是2的次幂,并且newCap是oldCap的两倍,就相当于oldCap的唯一一个二进制的1向高位移动了一位 (16 &...
2018-03-28 15:23:42 840
转载 HashMap的默认长度为什么是16?
如果两个元素不相同,但是hash函数的值相同,这两个元素就是一个碰撞因为把任意长度的字符串变成固定长度的字符串,所以存在一个hash对应多个字符串的情况,所以碰撞必然存在为了减少hash值的碰撞,需要实现一个尽量均匀分布的hash函数,在HashMap中通过利用key的hashcode值,来进行位运算公式:index = e.hash & (newCap - 1)举个例子:1.计算"boo...
2018-03-28 14:36:20 6161
原创 HashMap源码 4
resize()扩容方法:属性详解: threshold (临界值):当键值对的数量大于 16 * 0.75(加载因子) = 12 时,就会触发扩容final Node<K,V>[] resize() { Node<K,V>[] oldTab = table; // 获取旧哈希表 int oldCap = (oldTab == nul...
2018-03-28 11:27:26 145
原创 HashMap源码 3
继续上节没分析完的get()方法final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab....
2018-03-27 15:47:16 146
原创 HashMap源码 2
HashMap的构造函数大部分可以略过,挑了个进行分析public HashMap(Map<? extends K, ? extends V> m)该构造函数,把已存在的Map添加至一个新的Map,该函数调用了putMapEntries(Map<? extends K, ? extends V> m, boolean evict)方法final void putMapEnt...
2018-03-27 13:12:54 119
原创 |,^,&(按位或,按位异或,按位与)
| 按位或: 参与运算的两数各对应的二进位相或.只要对应的二个二进位有一个为1时,结果位就为1 例如: 1|2 : 0001 | 0010 = 0011 9|5 : 1001 | 0101 = 1101 所以9|5=13& 按位与: 参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果位才为1,否则为0 ...
2018-03-27 09:54:01 9543
原创 HashMap源码 1
DEFAULT_INITIAL_CAPACITY 1 << 4; 初始化容量为16,必须是2的幂MAXIMUM_CAPACITY 1 << 30; 最大容量为2的30次方DEFAULT_LOAD_FACTOR = 0.75; 默认加载因子0.75,因此初始情况下,当键值对的数量大于 16 * 0.75 = 12 时,就会触发扩容TREEIFY_THRESH...
2018-03-26 15:36:22 111
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人