面试 Java 基础八股文十问十答第二十九期
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)类加载过程
类加载是 Java 虚拟机(JVM)在运行 Java 程序时将类的字节码加载到内存中并转换为 Java 类的过程。这个过程分为以下几个步骤:
- 加载(Loading): 加载是指查找并加载类的字节码文件。类加载器会根据类的全限定名(Fully Qualified Name)来定位类的字节码文件,并将其加载到内存中。
- 链接(Linking): 链接阶段又分为三个子阶段:
- 验证(Verification): 验证阶段确保加载的字节码是合法、符合规范的,并且不会危害虚拟机的安全。
- 准备(Preparation): 准备阶段为类的静态变量分配内存,并设置默认初始值。
- 解析(Resolution): 解析阶段将类、方法、字段的符号引用解析为直接引用。
- 初始化(Initialization): 初始化阶段是类加载过程的最后一步,在此阶段,会执行类的初始化代码,包括对静态变量的赋值和静态代码块的执行。
2)双亲委派
双亲委派模型是 Java 类加载器的工作原理之一,其基本思想是当一个类加载器收到类加载请求时,先委托给父类加载器加载,只有在父类加载器无法加载该类时,才由当前类加载器加载。这样做的好处是保证类的唯一性,防止同一个类被多个类加载器加载,导致类型不一致的问题,同时也能保证 Java 核心类库的安全性和稳定性。
3)BigDecimal
BigDecimal 是 Java 中用于表示任意精度的十进制数的类,它可以解决浮点数计算精度丢失的问题。在金融、科学计算等领域,对数字精度要求较高的场景中,常常会使用 BigDecimal 来进行精确计算。与基本数据类型的浮点数相比,BigDecimal 可以表示任意大小的数值,并提供了丰富的算术运算方法,如加减乘除、取整、取余等。由于 BigDecimal 是不可变的,因此它的操作不会改变原始值,而是返回一个新的 BigDecimal 对象。
4)new String("xiaobaitiao")
一共创建了几个对象?
new String("xiaobaitiao")
会创建两个对象:
- 一个对象 :由字符串常量池中的
"xiaobaitiao"
字符串常量创建。 - 一个对象 :由
new String("xiaobaitiao")
创建,存放在堆内存中。
5)final
、finally
、finalize
各自有什么区别?
final
:final
是一个关键字,用于修饰类、方法和变量。对于类,final
表示该类不能被继承;对于方法,final
表示该方法不能被重写;对于变量,final
表示该变量的值只能被赋值一次,即为常量。finally
:finally
是异常处理中的一个关键字,用于定义在 try-catch 语句块结束之后总是会被执行的代码块,无论是否发生异常。finalize
:finalize
是 Object 类中的一个方法,用于在对象被垃圾回收之前执行清理操作。但是,由于它的执行时机不确定性,不建议在实际开发中过多依赖该方法进行资源释放。
6)为什么平时写代码的时候会遇到乱码?
乱码通常是由于字符编码不一致导致的。常见的情况包括:
- 源代码编码和文件编码不一致: 源代码以某种编码(如 UTF-8)编写,但文件的实际编码与之不符(如 ANSI),导致读取时出现乱码。
- 数据传输过程中编码不一致: 在网络传输或文件读写过程中,如果发送端和接收端使用了不同的字符编码,就可能导致乱码。
- 字符编码设置错误: 在程序中使用了错误的字符编码,或者未正确设置字符编码,也会引发乱码问题。
解决乱码问题通常需要注意以下几点:
- 统一使用 UTF-8 编码。
- 在程序中明确指定字符编码。
- 在读取和写入文件时,指定正确的字符编码。
- 在网络通信中,使用统一的字符编码进行数据传输。
7)Java 的集合类简介
Java 的集合类是用于存储和操作对象的数据结构。它们提供了一种更加灵活、高效的方式来管理数据集合,相比传统的数组,集合类具有更多的功能和操作。Java 中常见的集合类包括 List、Set、Map 等,它们都位于 java.util
包中。
- List: 允许存储重复元素,并且有序。常见的实现类有 ArrayList、LinkedList、Vector 等。
- Set: 不允许存储重复元素,通常用于存储不重复的对象集合。常见的实现类有 HashSet、LinkedHashSet、TreeSet 等。
- Map: 存储键值对,键是唯一的,值可以重复。常见的实现类有 HashMap、LinkedHashMap、TreeMap 等。
8)数组和链表的区别
- 数组(Array): 数组是一种线性数据结构,元素在内存中是连续存储的,具有固定的大小。访问数组中的元素是通过索引来进行的,可以快速访问任何位置的元素,但插入和删除操作需要移动大量元素。
- 链表(Linked List): 链表是一种线性数据结构,元素在内存中不一定是连续存储的,每个元素都包含一个指向下一个元素的引用(或指针)。链表可以方便地进行插入和删除操作,但访问元素时需要从头节点开始遍历,效率较低。
9)Java 的链表实现类
Java 中常见的链表实现类有:
- LinkedList: Java 标准库提供的双向链表实现类,实现了 List 和 Deque 接口,可以用作队列、栈等数据结构。
10)ArryaList、LinkedList、Vector 的区别
- ArrayList: 基于数组实现的动态数组,支持随机访问,插入和删除操作的时间复杂度为 O(n),因为需要移动元素。不是线程安全的。
- LinkedList: 基于双向链表实现的列表,插入和删除操作的时间复杂度为 O(1),但访问操作的效率较低,需要遍历链表。不是线程安全的。
- Vector: 与 ArrayList 类似,但是 Vector 是线程安全的,所有的方法都被 synchronized 修饰,因此在多线程环境下使用时比较安全,但性能相对较低。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 1300+ Star,2 W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐