Java 基础面试题 真正的 offer 偏方 Java 基础 Java 高级

Java 基础面试题 真正的 offer 偏方 Java 基础 Java 高级

一、参考资料

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=46\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

二、笔记总结

01、fail-safe 机制与 fail-fast 机制

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=46\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

02、HashMap 是怎么解决 Hash 冲突的

  • Hash 算法就是把任意长度的输入通过散列算法变成固定长度的输出,这个输出叫做散列值。
  • Hash 表又叫散列表,它是通过 key 直接访问到内存存储位置的数据结构。
  • 在具体实现上,通过 Hash 函数把 key 映射到表中的某个位置,获取这个位置的数据,从而加快数据的查找。
  • Hash 冲突是由于 Hash 算法计算的数据是无限的,而计算结果的范围是有限的,所有可能存在不同的数据计算结果相同。
  • HashMap 使用链式寻址法解决 Hash 冲突,简单理解就是把存在冲突的 key 以单向链表的方式进行存储。

03、受检异常和非受检异常的理解

  • 受检异常表示在编译时要强制检查的异常,这种异常需要显式的 try catch 捕获或 throws 抛出去,否则程序无法通过编译。
  • 非受检异常表示编译器不需要强制检查的异常,这种异常不需要显式处理。
  • Java 中所有的异常都要继承 Throwable 类
    • Throwable 有两个直接的子类,Error 和 Exception。
    • Error 表示程序底层的错误,这种错误和代码本身没有什么关系,比如 OOM 内存溢出异常。
    • Exception 表示代码本身的异常,比如空指针异常。
    • Exception 派生了两种类型,RuntimeException 和 其它,RuntimeException 运行时异常属于非受检异常。
    • 除了 Error 和 RuntimeException 及其派生异常,其它异常都属与受检异常。

04、JDK 动态代理为什么只能代理有接口的类

  • Java 中类是单一继承,接口是多继承。
  • 跟JDK 动态代理的底层实现有关,JDK 动态代理会在程序运行期间动态生成一个代理类,这个动态生成的代理类会继承 Proxy 类,同时还要去实现被代理类的接口。
  • Java 类是不支持多继承的,每个动态代理类都继承了 Proxy 类,所以代理 JDK 动态代理只能代理接口。
    【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=49\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

05、说一下对象的创建过程

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=50\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

06、new String(abc) 到底创建了几个对象

  • 如果 abc 这个字符串常量不存在,则创建两个对象,分别是 abc 这个字符串常量以及 new String 这个实例对象。
  • 如果 abc 这个字符串常量存在,则只创建一个对象。

07、HashMap 是如何解决 Hash 冲突的

08、String、StringBuffer、StringBuilder 区别

  • 可变性方面
    • String 内部的 Value 值是 final 修饰的,所以 String 是不可变的,每次修改值都会产生新的对象。
    • StringBuffer 和 StringBuilder 是可变类,字符串的变更不会产生新的对象。
  • 线程安全性方面
    • String 是不可变类,所以是线程安全的。
    • StringBuffer 也是线程安全的,因为 StringBuffer 中的方法加了 Synchronized 关键字。
    • StringBuilder 不是线程安全的,所在在多线程环境下操作字符串应该使用 StringBuffer。
  • 性能方面
    • String 性能最低,因为不可变,做字符串拼接或修改时需要重新创建新的对象以及分配内存。
    • StringBuffer 比 String 性能高,因为是可变的,字符串可以直接被修改。
    • StringBuilder 的性能最高,因为 StringBuffer 加了同步锁影响性能。
  • 存储方面
    • String 存储在字符串常量池内
    • StringBuffer、StringBuilder 存储在堆内存空间。

09、为什么两个 Integer 对象不能使用 == 比较

  • Integer 是 int 的包装类
  • Integer 使用了享元模式的设计,对 -128 到 127 做了缓存,如果不超过这个范围就返回缓存中的对象,否则就创建新的对象。
  • 这样设计的好处是减少频繁创建 Integer 对象,减少内存消耗从而提升性能。

10、讲一下 ArrayList 的自动扩容机制

  • ArrayList 是一个数组结构的存储容器,默认情况下数组的长度是 10,也可以在构建 ArrayList 对象时指定初始长度。
  • ArrayList 的扩容流程
    • 首先创建一个新的数组,长度是原来的 1.5 倍。
    • 然后使用 ArrayList.copyof 方法把老数组里面的数据拷贝到新数组里面。
    • 扩容完成以后,再把当前需要添加的元素添加到新的数组里面。

11、什么是深拷贝和浅拷贝

  • 深拷贝和浅拷贝描述的是引用数据类型的复制场景
  • 浅拷贝只复制某一个对象的指针,而不复制这个对象本身,意味着两个指针指向同一块内存地址。
  • 深拷贝是完全创建一个一模一样的新对象,新对象和老对象不共享任何内存,对新对象的修改不影响老对象。

12、HashMap 中的 Hash 方法为什么要右移动 16 位异或

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=58\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

13、HashMap 啥时候扩容,为什么扩容

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=59\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

14、强引用、软引用、弱引用、虚引用区别

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=60\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

15、Java 有几种文件拷贝方式,哪一种效率最高

  • 使用 java.io 包下的 FileInputStream 和 FileOutputStream
  • 使用 java.nio 包下的 transferTo 和 transfFrom
  • 使用 Files.copy
  • 文件拷贝的效率和操作系统和配置的情况有关系,传统的文件 io 都是调用操作系统底层的标准函数。
  • transferTo 和 transfFrom 性能上表现比较好

16、聊聊你知道的设计模式

  • 设计模式分为创建型模式、结构型模式、行为型模式。
  • 创建型模式
    • 工厂模式、单例模式、构建器模式、原型模式
  • 结构型模式
    • 桥接模式、适配器模式、装饰器模式、代理模式、组合模式、外观模式、享元模式
  • 行为型模式
    • 策略模式、解释器模式、命令模式、观察者模式、迭代器模式、模板方法模式、访问模式

17、finally 块一定会执行吗

  • finally 语句块两种情况在不会执行
    • 程序还没有进入 try 语句块就因为异常导致程序终止
    • 在 try 或 catch 语句块中执行 System.exit(0) 导致 JVM 退出

18、在 Java 中实现单例模式有哪些方法

  • 三种方式实现单例
    • 双重检查锁的方式,线程安全并且延迟实例化的方式,但是因为加锁会有性能上的影响。
    • 使用静态内部类的方式实现,也是延迟实例化,由于是静态内部了所以只会在使用时加载一次,不存在线程安全问题。
    • 使用枚举类的方式实现,即使线程安全的,又能防止反序列化导致破坏单例的问题。

19、Java SPI 是什么?有什么用

  • Java SPI 是 Java 提供的接口扩展机制
    • 把标准定义和接口实现分离
    • 实现功能的扩展,更好的满足定制化需求。

20、Integer 和 int 区别,Java 为什么设计封装类

  • Integer 和 int 区别
    • Integer 的初始值是 null,int 的初始值是 0。
    • Integer 存储在堆内存,int 类型存储在栈空间。
    • Integer 是对象类型,封装了很多属性和方法,使用时更加灵活。
  • Java 本身是面向对象的语言,一切操作都是以对象作为基础的,比如集合中存的元素,也只支持 Object 类型。

21、Integer a1 = 100 Integer a2 = 100 a1 == a2 的结果及原因

  • a1 == a2 的执行结果是 true
  • 原因是 Integer 内部用到了享元模式的设计,也就是针对 -128 到 127 之间的数字做了一个缓存。
  • 使用 Integer a1 = 100 赋值时,Java 默认会进行装箱操作,从而触发了缓存操作,使得 a1 和 a2 指向同一个内存地址。

22、HashMap 与 HashTable 的区别

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=68\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

23、Java 反射的优缺点

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=69\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

24、为什么重写 equals 方法就一定要重写 hashCode 方法

  • 如果只重写 equals 方法不重写 hashCode 方法,可能会导致 a.equals(b) 这样一个表达式成立,hashCode 却不同。
  • 在使用散列集合存储这个对象的时候就会出现问题,因为散列集合是使用 hashCode 计算 key 的存储位置,如果存储两个相同的对象,hashCode 却不同,就会导致这两个对象存储在 hash 表不同位置,破坏大家约定俗成的规则,使得程序出现不可预料的错误。

25、介绍一下策略模式和观察者模式

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=71\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

26、谈谈什么是零拷贝

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=72\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

27、SortedSet 和 List 异同点

  • 相同点
    • 都可以存储一组有序的元素
    • 都支持随机访问和按照索引位置插入元素
    • 都是派生自 Collection 接口
  • 不同点
    • SortedSet 是一个有序集合,不允许元素重复。List 是有序列表,允许元素重复。
    • SortedSet 可以自定义排序规则,List 只能按添加顺序排序。
    • 元素添加删除的时间复杂度不同,因为 List 需要移动其它元素的位置。
    • SortedSet 可以方便的查询某个区间范围的元素,List 只能通过遍历实现。

28、为什么阿里 Java 手册禁止使用存储过程

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=74\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

29、为什么阿里巴巴强制使用包装类型定义属性

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=75\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

相关推荐
蚰蜒螟1 小时前
深入剖析 OpenJDK 17 解释器中的安全点(Safepoint)进入与退出机制
java·开发语言·安全
山岚的运维笔记1 小时前
Bash 专业人员笔记 -- 第 11 章:`true`、`false` 和 `:` 命令
linux·运维·服务器·开发语言·笔记·学习·bash
代钦塔拉1 小时前
第一篇:字符编码全解:从ASCII/GBK/Unicode到UTF-8
开发语言·qt
Generalzy1 小时前
为什么 Go 的注释,能控制编译器?
java·python·golang
syagain_zsx1 小时前
Qt初识,快速上手
开发语言·qt
Wy_编程1 小时前
go语言面向对象和异常处理
开发语言·后端·golang
进击的荆棘1 小时前
C++起始之路——C++11(下)
开发语言·c++·c++11·lambda
Galsk1 小时前
Linux零拷贝
java·linux·服务器·面试
许长安1 小时前
C++ 原子变量与内存序:从std::atomic到release/acquire
开发语言·数据结构·c++·经验分享·笔记