自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 3303

原创 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 4105

原创 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 2739

原创 ReentrantLock源码分析

新建Lock时,ReentrantLock默认使用非公平锁进行同步:public ReentrantLock() {        sync = new NonfairSync();    // NonfairSync是内部类,实现了Syn内部抽象类    }也可以在构造函数传入boolean参数,控制锁的类型,实现如下: public ReentrantLock(boolean fair) { ...

2018-04-13 17:12:46 161

原创 ReentrantLock的Syn内部类分析

    final boolean nonfairTryAcquire(int acquires) {            final Thread current = Thread.currentThread();    // 获得当前线程            int c = getState();    // 获取锁的状态值            if (c == 0) {    // 如...

2018-04-13 12:20:09 258

原创 DispatchServlet流程 - 2

当DispatchServlet接到请求时,会先执行FrameWorkServlet类的service()方法,这个方法判断了请求的类型,例如“GET”,“POST"等等;假设是POST请求,就调用doPost()方法,doPost()调用了processRequest()方法,processRequest()执行了doServer()方法,开始真正的对 request 进行处理,设置相关对象到r...

2018-04-12 17:39:47 557

原创 DispatchServlet流程 - 1

DispatchServlet执行请求之前,需要执行一系列方法,主要用于初始化组件:HttpServletBean的init()核心代码:    public final void init() throws ServletException {  // Set bean properties from init parameters.                // Servlet初始化参...

2018-04-12 17:39:40 669

原创 ContextLoaderListener和DispatchServlet的配置

<!--配置ContextLoaderListener的方法--><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--ContextLoaderListener的...

2018-04-11 16:28:08 710

原创 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 1101

原创 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 124

原创 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 364

原创 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 133

转载 HashMap的modCount

modCount用于记录HashMap的修改次数,在HashMap的put(),get(),remove(),Interator()等方法中,都使用了该属性由于HashMap不是线程安全的,所以在迭代的时候,会将modCount赋值到迭代器的expectedModCount属性中,然后进行迭代,如果在迭代的过程中HashMap被其他线程修改了,modCount的数值就会发生变化,这个时候expec...

2018-03-29 13:48:00 4156 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 112

原创 详解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 800

转载 HashMap的默认长度为什么是16?

如果两个元素不相同,但是hash函数的值相同,这两个元素就是一个碰撞因为把任意长度的字符串变成固定长度的字符串,所以存在一个hash对应多个字符串的情况,所以碰撞必然存在为了减少hash值的碰撞,需要实现一个尽量均匀分布的hash函数,在HashMap中通过利用key的hashcode值,来进行位运算公式:index = e.hash & (newCap - 1)举个例子:1.计算"boo...

2018-03-28 14:36:20 6093

原创 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 131

原创 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 131

原创 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 107

原创 |,^,&(按位或,按位异或,按位与)

| 按位或:    参与运算的两数各对应的二进位相或.只要对应的二个二进位有一个为1时,结果位就为1        例如: 1|2 : 0001 | 0010 = 0011                 9|5 : 1001 | 0101 = 1101    所以9|5=13& 按位与:    参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果位才为1,否则为0    ...

2018-03-27 09:54:01 9464

原创 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 102

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除