秋招面经总结(Java后端开发)

Java核心技术面试宝典
本文汇总了Java核心技术面试中常见的高频问题及解答,包括Java基础、集合框架、多线程与锁机制、MySQL、Redis、框架相关知识、设计模式、网络基础知识、JVM内部原理以及操作系统相关知识点。

以下总结的面经都是我在秋招的过程中被问到的一些高频问题,后面附上的一些答案是查阅了相关文章总结而出,也是个人观点,如有错误,欢迎指出!

一 Java基础
  1. Java和C语言有什么区别?Java好在哪里?
  2. 怎么理解Java的跨平台性,一次编译到处运行?
  3. 面向对象和面向过程的区别?
  4. 如何理解面向对象三大特性:封装、继承、多态?
  5. 类继承会有什么问题吗,一般什么情况下才会去用继承?
  6. 为什么重写equals方法还要重写hashcode方法?
  7. 深克隆和浅克隆
  8. 反射相关
  9. 注解的实现原理
  10. Lambda表达式的优缺点?
  11. Stream流式编程的好处?终止方法和延迟方法的区别是?终止方法存在的意义是什么?
二 Java集合
  1. HashMap底层实现(JDK1.7使用数组+链表;JDK1.8使用数组+链表+红黑树)
  2. HashMap为什么要引进红黑树?为什么不用其他的平衡二叉树之类的?红黑树的优势在哪里?(AVL树的旋转比红黑树的旋转更加难以平衡和调试,需要更高的旋转次数)
  3. 链表会转化为红黑树的两个条件是?(①链表的长度达到8;②HashMap底层使用的table数组长度length达到64;如果不满足后者,将会触发扩容方法)
  4. 链表长度大于8转化为红黑树,小于6红黑树转化为链表;为什么不直接设置成大于8转化成红黑树,小于8转化成链表;(中间有个差值7进行过渡是为了避免链表和树频繁转换,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低)
  5. 把链表转化为红黑树的阈值是8,为什么不设置成其他值?(遵循泊松分布,链表长度超过8的概率非常小)
  6. HashMap扩容机制,即resize方法?(JDK 1.7 会重新计算每个元素的哈希值,JDK1.8是通过高位运算(e.hash & oldCap)来确定元素是否需要移动,如果运算结果值为0,那么元素扩容后位置不变,结果值为1表示元素在扩容时位置发生了变化,新的下标位置等于原下标位置 + 原数组长度)
  7. HashMap添加元素的步骤(put方法)、计算集合元素个数(size方法)
  8. HashMap为什么是线程不安全的?(同时新增元素、同时扩容导致数据丢失,jdk1.7头部倒序插入出现死循环导致CPU占用100%)
  9. HashMap默认的加载因子是0.75,为什么不设置成1或者0.5(从容量和性能考虑)
  10. HashMap发生哈希冲突,新节点是插入到链表头部还是链表的尾部,头部倒序插入死循环是怎么产生的?(jdk1.7采用头部倒序插入,会导致死循环;jdk1.8使用尾部正序插入)
  11. Hashtable怎么控制key value 不能为null?(当调用put方法时,首先会判断value是否为null,为null的话直接抛出空指针异常;对于key,由于Hashtable计算hash值是int hash = key.hashCode();直接取对象的hashcode,key为null就会报空指针异常;而HashMap计算hash值是return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16),key为null则hash值为0)
  12. ConcurrentHashMap底层采用的结构(分jdk1.7和jdk1.8),jdk1.7和jdk1.8分别采用什么方式实现线程安全?(jdk1.7采用分段锁,也就是为每一个segment加上ReentrantLock锁;jdk1.8使用的是CAS机制加上synchronized锁)
  13. ConcurrentMap中的size方法是如何实现的?多线程操作下,如果一个线程在查size方法,一个线程在执行put方法,底层是如何控制每次计算出来的值是正确的?(https://blog.youkuaiyun.com/chenyiminnanjing/article/details/82716180
  14. HashSet的底层实现?(基于HashMap来实现的,new 一个 HashSet对象底层实际就是new了一个HashMap,并且使用默认的初始容量16和默认的加载因子0.75;当我们往HashSet里面添加一个元素其实就是往HashMap里面put了一个元素,并且是以key存在的,
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值