个人记录【Java后端面试】Java基础

Java基础

  • 总结
    • 基础概念
    • 多线程/并发
    • 集合框架
    • 网络编程(netty)
  • 场景题
  • 经典面试题

总结

Java基础面试主要分为4个版块,基础概念(面向对象)、多线程/并发、集合框架以及网络编程。

基础概念

这部分没啥需要记录的,就面向对象那些,直接背。 重点在Java8、11、17、21的新特性。

面试题链接:[https://www.mianshiya.com/bank/1787463103423897602]

多线程/并发

线程的生命周期、synchronize锁升级、volatile的用法与缺点、JMM抽象模型、cas无锁机制、线程池核心参数、如何排查死锁、synchronize与reentryLock的区别、ThreadLocal原理以及内存泄漏风险

面试题链接:https://www.mianshiya.com/bank/1789249312885223425

集合框架

ArrayList以及HashMap底层结构、扩容机制与时间复杂度,currentHashMap并发实现与线程安全策略,HashMap在Java1.7与1.8的实现区别,红黑树算法,哈希冲突。

面试题链接:https://www.mianshiya.com/bank/1788408712975282177

网络编程(netty)

BIO|NIO|AIO的区别与应用、NIO三大组件(channel、selector、buffer)、零拷贝与mmap原理、netty为什么用nio、reatctor模式的单/多线程实现、netty粘包拆包问题。

面试题链接:https://www.mianshiya.com/tag/Netty

这里不记录具体的面试题,可以各大网站去刷(ddkk、面试鸭、github)

场景题

基本上就是考察基础知识积累,以及源码阅读。

经典面试题

  1. hashmap1.7和1.8的区别+currenthashmap1.7和1.8区别

版权声明:以下内容为CSDN博主「Insist Every Day」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_51769717/article/details/135738022

JDK1.7 中(hashmap) 1、使用entry数组来存数据,然后通过hash取模的方法将数据分散存到不同的格子里面,这些key会形成一个链表 2、使用头插法 JDK1.8 中(hashmap) 1、hashmap在数组到达64格链表大于8时会将连别变成红黑树提升效率 2、使用尾插法避免在并发编程的时候出现循环列表问题将头插法改成尾插法 currentHashmap 底层加锁机制: 在JDK1.7中segments数组+HashEntry数组+链表。一个ConcurrentHashMap中有一个Segments数组,一个Segments中存储一个HashEntry数组,每个HashEntry是一个链表结构的元素。segment继承自ReentrantLock锁。首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据时,其他段的数据也能被其他线程访问,实现了真正的并发访问。 在JDK1.8中摒弃了Segment,而是采用synchronized+CAS+红黑树来实现,锁的粒度也从段锁缩小为结点锁 put的流程不同 在JDK1.7中要进行两次定位,先对Segment进行定位,再对内部的数组下标进行定位。定位之后会采用自旋锁+锁膨胀的机制进行加锁,也就是自旋获取锁,当自旋次数超过64时,会发生膨胀,直接陷入阻塞状态,等待唤醒。并且再整个put期间都持有锁 在JDK1.8中只需要一次定位,并且采用CAS+synchronized的机制。如果对应下标处没有结点,说明没有发生哈希冲突,此时直接通过CAS进行插入,若成功,直接返回。若失败,则使用synchronized进行加锁插入
  1. Java8、11、17、21新特性

    Java8: 1.元空间替代永久代 2.lambda表达式 3.函数式接口(@FunctionInterface) 4.新的日期时间api(LocalDate、LocalTime) 5.Stream API 6.CompletableFuture :是Java 8引入的异步编程工具,解决了老版Future 的两个痛点:一是get 方法会阻塞线程,二是没法 把多个异步任务串起来。 CompletableFuture 支持链式调用,可以用 thenApply、thenCompose这些方法把多个异步操作像流水线一样串起来,前 一个任务完成自动触发下一个,不用手动阻塞等结果。 基本用法是这样的: 1)用supplyAsync提交一个有返回值的异步任务,或者runAsync提交一个无返回值的任务 2)用thenApply 对结果做转换,thenAccept消费结果,thenRun单纯执行后续动作 3)用 exceptionally 或 handle 处理异常 4)用thenCombine合并两个任务的结果,用allOf等待多个任务全部完成 Java11: 1.标准化HTTP客户端API 2.String类方法增强 3.Files类简化文件读写(writingString()/readString()) 4.Optional新增isEmpty() java17: 1.Sealed密封类 2.增强的伪随机数生成器 3.强封装JDK内部API java21: 1.Virtual Threads虚拟线程:重点,可以详细了解一下,适配AI 2.Switch模式匹配 3.Record模式 4.分代ZGC

未完待续