当前位置: 首页 > article >正文

面试 Java 基础八股文十问十答第二十九期

面试 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)finalfinallyfinalize 各自有什么区别?

  • 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+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐


http://www.kler.cn/a/372126.html

相关文章:

  • Python——day09
  • Springboot + vue3 实现大文件上传方案:秒传、断点续传、分片上传、前端异步上传
  • Issac ROS navigation测试
  • Docker 设置代理的三种方法(2024年12月19日亲自测试)
  • golang , chan学习
  • ROS1入门教程6:复杂行为处理
  • Javaee:阻塞队列和生产者消费者模型
  • Brainpy的jit编译环境基础
  • 【LeetCode】跳跃游戏ⅠⅡ 解题报告
  • 如何在Linux系统中使用Netcat进行网络调试
  • Transformer中的Encoder
  • 基于STM32G0的USB PD协议学习(3)
  • 基于微信小程序的图书馆座位预约系统+LW示例参考
  • 数据结构算法学习方法经验总结
  • 经典面试题——抽象类和接口的区别
  • 【Linux】Kafka部署
  • SpringBoot实现的扶贫成效监测平台
  • 保研考研机试攻略:python笔记(2)
  • 【Windows】Redis 部署
  • Unity构建WebGL知识点
  • redis windows 7.0 下载
  • 【BF+4D雷达成像】四维成像汽车MIMO雷达的波束赋形【附MATLAB代码】
  • Python基础10
  • 别玩了!软考初级网络管理员无非就这23页纸!背完稳!
  • 论文学习 | 《锂离子电池健康状态估计及剩余寿命预测研究》
  • riscv uboot 启动流程分析 - SPL启动流程