
JavaSE
文章平均质量分 65
Mr_Richard
这个作者很懒,什么都没留下…
展开
-
Java动态代理的实现方式
代理模式是一种设计模式,,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,。代理分为动态代理和静态代理。举例:通过中介进行的商品交易,中介就是代理,代替卖方进行商品销售。静态代理比较麻烦,需要对每个目标对象都设置专用的代理类,实际开发中很少使用。动态代理是的一种技术。**从 JVM 角度来说,动态代理是在运行时动态生成类字节码,并加载到 JVM 中的。原创 2024-07-08 19:58:37 · 1638 阅读 · 0 评论 -
HashMap的常见问题
因为一个HashMap的table数组一般不会特别大,至少在不断扩容之前,那么table.length-1的大部分高位都是0,直接用hashCode和table.length-1进行&运算的话,就会导致总是只有最低的几位是有效的,那么就算你的hashCode()实现的再好也难以避免发生碰撞,这时让高位参与进来的意义就体现出来了。因为如果数组的长度为2的n次幂,那么table.length-1的二进制就是一个高位全是0,低位全是1的数字,这样才能保证每一个下标位置都有机会被用到。所以会出现红黑树和链表共存。原创 2024-04-12 22:01:19 · 865 阅读 · 0 评论 -
Set集合与Map集合的关系
HashSet的内部实现是一个HashMap,TreeSet的内部实现是一个TreeMap,LinkedHashSet的内部实现是一个LinkedHashMap。Set的内部实现其实是一个Map,Set中的元素存储在HashMap的keySet中。由于Map的key不重复,所以Set不能存储重复元素。原创 2024-04-12 21:48:29 · 243 阅读 · 0 评论 -
LinkedHashMap部分底层源码解析
JDK版本为1.8.0_271,LinkedHashMap继承了HashMap,LinkedHashMap在HashMap的基础上维护了一个双向链表,实现了可以根据插入顺序/访问顺序(accessOrder=false/true)访问Map集合。关于HashMap的原理可以参考。原创 2024-04-12 21:40:31 · 316 阅读 · 0 评论 -
HashMap部分底层源码解析
的Entry类型的数组table,数组的每一个索引位置被称为一个桶(bucket),你添加的映射关系(key,value)最终都被封装为一个Map.Entry类型的对象,放到某个table[index]桶中。红黑树出现的时机:当某个索引位置i上的链表的长度达到8,且数组的长度超过64时,此索引位置上的元素要从单向链表改为红黑树。而jdk7中的新的元素指向旧的元素。位置2和位置3:(key1,value1) 与现有的元素以链表的方式存储在table数组索引i的位置,新添加的元素指向旧添加的元素(头插法)。原创 2024-04-12 21:17:44 · 875 阅读 · 0 评论 -
LinkedList部分底层源码分析
【代码】LinkedList部分底层源码分析。原创 2024-04-12 16:11:51 · 583 阅读 · 0 评论 -
Vector部分底层源码解析
Vector底层也是使用object数组,但是使用synchronized 关键字来确保线程安全,但效率比ArrayList低,比较少见。原创 2024-04-12 15:19:06 · 211 阅读 · 0 评论 -
ArrayList部分底层源码分析
新list的容量newCapacity取原list长度*1.5和minCapacity的较大值。在index位置插入元素e前,需要把之前[index,size)的元素整体向右迁移一个单位;grow扩容方法会传入minCapacity,表示新list所需的最小容量;然后插入元素e到index位置,并更新size,时间复杂度o(n)直接在list尾部插入元素e,无需迁移元素,时间复杂度o(1)原创 2024-04-12 15:09:29 · 250 阅读 · 1 评论