写点什么

Java 面试经验

  • 2022 年 4 月 14 日
  • 本文字数:1122 字

    阅读完需:约 4 分钟

  1. 根据 key 通过哈希算法 与 (数组长度减 1) 进行与运算 得出数组下标。

  2. 如果数组下标的位置元素为空,则将 key 和 value 封装为 Entry 对象(JDK1.7 是 Entry 对象,1.8 是 Node 对象)并且存放到该位置上。【HashMap 在 1.7 是数组+链表实现的;1.8 是数组+链表+红黑树】吧

  3. 如果不为空,就需要分情况了:

  4. 如果是 JDK1.7 则先判断是否需要扩容,如果不需要扩容,就生成 Entry 对象,使用头插法 添加到当前链表中。

  5. 如果是 JDK1.8,则先判断当前位置上的 Node 类型,是红黑树 Node,还是链表的 Node。

  6. 如果是红黑树 Node,则将 key 和 value 封装成为红黑树的 Node,如果 key 存在,则更新 value 值。(因为要插入树结构中,就需要遍历)

  7. 如果是链表的 Node,则封装为链表 Node,尾插法,插入到链表的最后位置去,(因为尾插法,需要遍历链表,同时统计节点数,在遍历链表的过程中会判断是否存在当前 key,如果参在更新 value,当遍历完毕之后,就插到尾部,插入之后如果当前节点个数大于等于 8,则会把这个链表转化成为红黑树)

  8. 将 key 和 value 封装位 Node 插入红黑树和链表之后,在判断时候需要扩容,如果需要就扩容,不需要就介绍 PUT 方法。

  9. 1.7 是先判断是否需要扩容,再插入

  10. 1.8 是先插入,在判断。



参考源码:效果最好!

[](()2.说一下 ThreadLocal

  1. ThreadLocal 是 java 中提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻,任意方法中获取缓存的数据。

  2. ThreadLocal 底层是通过 ThreadLocalMap 来实现的,每个 Thread 对象(注意不是 ThreadLocal 对象)中都存在一个 ThreadLocalMap,Map 的 key 为 ThreadLocal 对象,Map 的 value 为需要缓存的值。

  3. 如果在线程池中使用 ThreadLocal 会造成内存泄露,(因为 ThreadLocal 使用之后需要回收 Entry 对象,但是线程池不会回收,而线程对象是通过强引用指向的 ThreadLocalMap,ThreadLocalMap 也是通过强引用指向的 Entry 对象。所以相关对象无法回收,从而造成内存泄漏),解决方法是:使用了 ThreadLocal 对象之后,手动调用 ThreadLocal 的 remove 方法,手动回收;

  4. ThreadLocal 经典的应用场景就是链接管理.(一个线程一个链接,该链接对象可以在不同的方法之前共享,但是在不同线程之见不共享)。



补充解释:


2.每一个线程有一个 map


3.缺点: 就是在连接池中:线程不会被回收,所以当完成了任务 1,要去执行任务 2 的时候,任务 1 预留下来的缓存全部都无法被回收!内存被占用的越来越多。



Java 开源项目【ali1024.coding.net/public/P7/Java/git】

最后

本人也收藏了一份 Java 面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们


目录:



Java 面试核心知识点


一共有 30 个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!



Java 面试核心知识点


已经有读者朋友靠着这一份 Java 面试知识点指导拿到不错的 offer 了



用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Java面试经验_Java_爱好编程进阶_InfoQ写作平台