Java底层原理
文章平均质量分 80
一口一个炒鸡
这个作者很懒,什么都没留下…
展开
-
Java底层原理——HashTable 和 ConcurrentHashMap详解
减小请求同一个锁的频率减少持有锁的时间ConcurrentHashMap的高并发行主要来自于三个方面用分离锁实现多个线程间的更深层次的共享访问用HashEntry对象的不变性来降低执行读操作的线程在遍历链表期间对加锁的需求通过对同一个volatile变量的写/读访问,协调不同线程间读/写的内存可见性。原创 2023-03-16 10:39:58 · 732 阅读 · 0 评论 -
Java底层原理——HashMap面试问题
如果超过了负载因子,则会resize一个长度两倍的HashMap,并且在Java7中进行链表元素迁移的时候会进行rehash。而在java8中进行了一些优化,不需要进行rehash,什么优化呢?由于HashMap的长度为2的次幂所以扩容的时候需要迁移的链表元素有两种情况,要么桶下标不变,要么变为桶下标大小加上原来的HashMap的长度大小,决定一个链表元素是那种情况只在于新加入的1bit是0还是1。原创 2023-03-16 10:35:13 · 227 阅读 · 0 评论 -
Java底层原理——HashMap底层原理(JDK1.8)
从1.7中可知HashMap是数组+链表的结构,HashMap在JDK1.8中加入了的实现,当链表长度大于8时,转换为红黑树的结构。java8中没有indexFor函数,而是直接使用table[index=(n-1)&hash]在JDK1.8中也使用了取代Entry的Node来实现Map.Entry接口Node是一个内部类,实现了Map.Entry接口,本质就是一个键值对。HashMap类中有一个非常重要的字段,就是Node[] table,即哈希桶数组,很明显它是一个Node的数组。原创 2023-03-16 10:31:51 · 536 阅读 · 0 评论 -
Java底层原理——为什么重写equals方法需同时重写hashCode方法
由于hashcode1不等于hashcode2,导致没有定位到同一个数组位置而返回逻辑上错误的值null(也有可能碰巧定位到同一个数组位置,但是也会判断其entry的hash值是否相等)尽管我们再进行get和put操作的时候,使用的key从逻辑上讲是等值的(通过equals比较是相等的),但由于没有重写hashCode方法,所以put操作时,举一个重写了equals而不重写hashCode会发生什么样的问题。所以再重写equals的方法的时候,必须重写hashCode方法。原创 2023-03-16 10:29:08 · 71 阅读 · 0 评论 -
Java底层原理——深入理解HashMap(JDK1.7)
数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构,在数组中根据下表查找某个元素,一次定位就可以达到,哈希表利用了这种特性,哈希表的主干是数组。比如我们要新增和查找某个元素,我们通过把当前元素的关键字通过某个函数映射到某个位置上,通过数组下标一次定位就可以完成操作。存储位置= f(关键字)其中这个函数f一般称为哈希函数,这个函数的好坏会直接影响到哈希表的优劣。比如我们要在哈希表中执行插入操作查找操作同理,先通过哈希函数计算出实际存储地址,然后从数组中对应地址取出即可。原创 2023-03-16 10:26:03 · 499 阅读 · 0 评论