京东java一面

该面经来源于link
在这里插入图片描述
在这里插入图片描述我会去除掉项目和已经做过问题研究的回答:(答案序号是问题的序号)
2.HashMap的底层实现是数组,每一个key-value键值对组成Entity类以链表的形式存放在数组中,java8后,当链表长度达到一定后,整个链表会转化成红黑树;为了提高整个HashMap的读取效率,当HashMap中存储的元素大小或是即将假如的元素数量大于等于桶数组大小乘以负载因子时,整个HashMap就会调用resize()方法进行扩容,减少哈希碰撞;jdk1.7中,当我们调用resize()方法时,如果原有table长度已经达到了上限,就不再扩容了,如果还未达到上限,则创建一个新的table,并调用transfer方法,transfer方法的作用是把原table的Node放到新的table中,使用的是头插法,jdk1.8中,计算节点在table中的下标的方法是:hash&(oldTable.length-1),扩容之后,table长度翻倍,计算table下标的方法是hash&(newTable.length-1),也就是hash&(oldTable.length*2-1),于是我们有了这样的结论:这新旧两次计算下标的结果,要不然就相同,要不然就是新下标等于旧下标加上旧数组的长度
,旨在桶中的元素在扩容时,能够一半留在原先的桶中,一半放入新的桶中,具体规则为:如果即将扩容的那个位上的key.hash()的二进制为0,则地址不变,要么就新地址为原散列坐标的基础上加上原table长度;(这一点也是数组为2的幂指数的好处之一);集合是2的幂指数,这样可以通过(table.length - 1)& key.hsh()这样的位运算快速寻址;抖动方法应该就是hash方法计算散列值哈希值,当我们调用put方法加入一个新的值时,我们首先会调用hash()计算该值的哈希值。。。;HashMap源码作者通过泊松分布算出,当桶中结点个数为8时,出现的几率是亿分之6的,因此常见的情况是桶中个数小于8的情况,此时链表的查询性能和红黑树相差不多,因为转化为树还需要时间和空间,所以此时没有转化成树的必要;
参考:link
link
link
3.Vector、HashTable、Collections包装方法、ConcurrentHashMap;ConcurrentHashMap和hashmap得区别在于线程安全,实现线程安全主要通过加锁,所以,put和 get 方法需要两次Hash到达指定的HashEntry,第一次hash到达Segment,第二次到达Segment里面的Entry,然后在遍历entry链表;jdk1.7和1.8中改变了结构:ReentrantLock+Segment+HashEntry到synchronized+CAS+HashEntry+红黑树;具体来说link
加个锁粒度的介绍:link
4.JMM(Java Memory Model)中规定所有的变量都存储在主内存(Main Memory)中,每条线程都有自己的工作内存(Work Memory),线程的工作内存中保存了该线程所使用的变量的从主内存中拷贝的副本,若是volatile变量执行写操作后,JMM会把工作内存中的最新变量值强制刷新到主内存;
link
link
5.修饰类:该类不能被继承;修饰方法:不可以被子类继承重写的;(注:不可以修饰构造方法)修饰属性:final成员变量表示常量,一但被赋值,值不可以再被改变;当final修饰一个引用类型时,在初始化之后不能再让其指向其他对象,但是对象的内容是可以改变的
可用final和static进行类比(虽然没什么关系)link
6.link
9.link
link
10.TLAB的意思:link
从内存角度分析对象的生命周期:加载、连接(验证、准备、解析)、初始化、使用、销毁
link
17.link
22.link
23.link
24.link
25link
26.link
27.脑裂:link
hash一致性算法link
哨兵之间订阅link
28.AOP和IOC原理link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值