“Java面试必看:从基础到进阶的全方位准备指南“(2)

9. **String和StringBuffer, StringBuilder的区别有哪些?所有类名包含Buffer的类的内部实现原理是什么?有什么优势?**

- **`String`**:`String`是不可变类,每次对字符串进行修改(如拼接、替换等)都会创建一个新的`String`对象。由于其不可变性,`String`对象在多线程环境下是线程安全的,但性能较差,因为每次修改都需要分配新的内存。

- **`StringBuffer`**:`StringBuffer`是可变类,它能够对字符串进行修改而不重新创建对象。它是线程安全的,通过对每个方法的同步来保证线程安全,但同步机制会影响性能。`StringBuffer`通常用于多线程环境下,避免多个线程修改字符串时出现数据不一致。

- **`StringBuilder`**:`StringBuilder`与`StringBuffer`相似,也是可变类,可以在不创建新对象的情况下修改字符串,但它不保证线程安全。`StringBuilder`的性能优于`StringBuffer`,因此它更适合在单线程环境中使用。

**类名包含Buffer的类的内部实现原理**:
- `StringBuffer`和`StringBuilder`都使用一个**字符数组**来存储字符串。当字符串长度发生变化时,内部的字符数组会动态扩展,通常扩展倍数为1.5倍。
- 这两者的区别在于:`StringBuffer`的操作是**同步的**,而`StringBuilder`是**非同步的**。

**优势**:
- **性能**:`StringBuffer`和`StringBuilder`在频繁修改字符串的场景下,远比`String`高效,因为它们避免了每次修改都重新创建对象。
- **内存使用**:`StringBuffer`和`StringBuilder`使用一个可变的字符数组,避免了`String`的内存重复分配问题。
- **线程安全**:`StringBuffer`的线程安全特性适用于多线程环境,而`StringBuilder`适合单线程环境,提供了更好的性能。

---

 10. **String字符串的不可变是指哪里不可变?**

`String`字符串的不可变性指的是**字符串内容不可改变**。一旦创建了一个`String`对象,它的字符数据就无法修改。如果对字符串进行操作(如拼接、替换、删除字符等),会创建一个新的`String`对象,而原始的`String`对象不受影响。

这种不可变性有以下好处:
- **线程安全**:由于`String`对象不可变,它可以安全地在多个线程之间共享,不需要进行同步操作。
- **哈希值缓存**:`String`对象的不可变性使得它可以被用作哈希表(如`HashMap`的键),而不必担心它的值在存储后发生改变。
- **性能优化**:Java会缓存`String`常量,在常量池中存储相同内容的字符串,避免重复创建`String`对象,从而提高性能。

---

11. **字符串常量池是什么?不同的JDK版本都分别位于哪个区域?**

**字符串常量池**是一个特殊的内存区域,用于存储**字符串字面量**(如`"hello"`)的唯一副本。通过使用常量池,Java能够避免创建重复的`String`对象,从而节省内存。

**JDK 7及之前**:
- 字符串常量池位于**方法区**。在JVM中,方法区是存放类信息、常量、静态变量等数据的区域,字符串常量池就是其中的一部分。

**JDK 8及之后**:
- 在JDK 8中,字符串常量池被迁移到了**堆内存**,与对象的存储区域相同。这样做的目的是改善性能,尤其是在大量字符串字面量的情况下,堆内存更易于扩展。

**如何操作字符串常量池**:
- 通过`String.intern()`方法,开发者可以显式地将一个字符串添加到常量池中。例如,`"hello".intern()`可以将字符串`"hello"`放入常量池,如果常量池中已经存在该字符串,它将直接返回常量池中的引用。

---

12. **Java异常类有哪些?分别管理什么异常?**

Java的异常机制分为两大类:

1. **`Throwable`**:是所有异常和错误类的父类,分为两种子类:
   - **`Error`**:表示系统级别的问题,通常由JVM触发,程序无法处理。例如:
     - `OutOfMemoryError`:内存溢出错误
     - `StackOverflowError`:栈溢出错误
     - `VirtualMachineError`:虚拟机错误
   - **`Exception`**:表示程序中出现的异常,可以通过捕获来处理。`Exception`类又分为:
     - **`RuntimeException`**:运行时异常,通常由程序的逻辑错误引起,属于**非受检异常**(unchecked exception),不需要显式声明或捕获。常见的有:
       - `NullPointerException`:空指针异常
       - `IndexOutOfBoundsException`:索引越界异常
       - `ArithmeticException`:算术异常(如除以零)
     - **`Checked Exception`**:检查异常,程序必须显式捕获或声明抛出。常见的有:
       - `IOException`:输入输出异常
       - `SQLException`:数据库操作异常
       - `ClassNotFoundException`:类找不到异常

---

13. **Java反射获取类信息的方式有哪几种?分别是什么?**

Java反射是Java提供的一种机制,允许程序在运行时获取类的结构(如字段、方法等)和实例化对象。获取类信息的方式包括:

1. **`Class.forName(String className)`**:通过类的全限定名(类的路径)动态加载类,返回该类的`Class`对象。这是反射中最常用的方式。
   - 示例:`Class clazz = Class.forName("java.lang.String");`
   
2. **`getClass()`**:通过对象调用`getClass()`方法,返回该对象所属类的`Class`对象。
   - 示例:`String str = "Hello"; Class clazz = str.getClass();`
   
3. **`getSuperclass()`**:获取类的父类。
   - 示例:`Class superClass = clazz.getSuperclass();`
   
4. **`getInterfaces()`**:获取类实现的所有接口。
   - 示例:`Class[] interfaces = clazz.getInterfaces();`

反射的强大之处在于可以在运行时动态操作类,获取类的信息、方法、字段等,甚至修改类的私有属性。

---

14. **Java代理的主要方法有哪几种?列举代理的使用场景2个。**

Java代理分为两类:

1. **JDK动态代理**:JDK动态代理需要目标类实现一个或多个接口。代理类会在运行时动态生成,并通过反射调用目标方法。使用`Proxy`类来创建代理实例。
   - **特点**:需要目标类实现接口,代理类不需要手动编写,生成时由JVM动态生成。

2. **CGLIB代理**:CGLIB代理通过字节码生成技术,动态生成目标类的子类来实现代理。与JDK动态代理不同,CGLIB不要求目标类实现接口。
   - **特点**:适用于没有实现接口的类,可以代理没有接口的类。

**代理的使用场景**:
1. **AOP(面向切面编程)**:通过代理实现方法的增强,如记录日志、事务管理、权限控制等。
   - 示例:在Spring框架中,使用AOP代理来实现事务管理和日志记录。
   
2. **动态代理**:用于在运行时决定代理的行为,常见于ORM框架(如Hibernate)中,用于代理数据访问操作。

---

15. **equals()方法的作用是什么?重写equals需要注意哪些事项?为什么?**

`equals()`方法用于比较两个对象的内容是否相等,而不是比较它们的内存地址(即引用是否相同)。默认的`equals()`方法比较的是对象的内存地址(即引用),但对于大多数类,我们需要重写`equals()`方法来比较对象的内容。

**重写`equals()`时需要注意**:

1. **自反性**:`a.equals(a)`应始终返回`true`。
2. **对称性**:`a.equals(b)`和`b.equals(a)`应该返回相同的结果。
3. **传递性**:如果`a.equals(b)`和`b.equals(c)`都为`true`,则`a.equals(c)`也应该返回`true`。
4. **一致性**:如果`a.equals(b)`始终返回相同的结果,除非对象的内容发生变化。
5

. **与`null`的比较**:任何对象与`null`的比较应返回`false`。
6. **`hashCode()`**:如果重写`equals()`,必须重写`hashCode()`方法,保证相等的对象具有相同的哈希码。

**原因**:为了保证对象比较的逻辑符合直觉,并且与集合框架(如`HashMap`、`HashSet`等)的一致性,正确实现`equals()`和`hashCode()`方法是非常重要的。

---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/59260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《EasyQuotation 与MongoDB在股市信息的奇妙融合》

《EasyQuotation 与MongoDB在股市信息的奇妙融合》 一、EasyQuotation 的强大功能二、数据存入 MongoDB(一)配置与连接(二)存储方法 三、K 线图监视股市信息(一)自定义性能趋势图表(二&#xff…

Kafka新节点加入集群操作指南

一、环境准备 1. Java环境安装 # 安装JDK apt-get update apt-get install openjdk-8-jdk -y2. 下载并解压 wget https://archive.apache.org/dist/kafka/2.8.1/kafka_2.13-2.8.1.tgz tar xf kafka_2.13-2.8.1.tgz mv kafka_2.13-2.8.1 kafka二、配置环境变量 1. 创建kafka…

git配置用户信息

在 Git 中配置用户信息,主要是设置你的用户名和电子邮件地址,这些信息会被 Git 用来记录提交的作者信息。以下是配置用户信息的步骤: 打开命令行工具。 设置你的用户名: git config --global user.name "你的名字"例如…

vue3项目初始化完整流程,vue3+TypeScript+vue-router+pinia+element-plus+axios+unocss+mock

2.1项目初始化 今天来带大家从0开始搭建一个vue3版本的后台管理系统。一个项目要有统一的规范,需要使用eslintstylelintprettier来对我们的代码质量做检测和修复,需要使用husky来做commit拦截,需要使用commitlint来统一提交规范,…

[Import REC] Import REC下载及使用Import REC重建引入表Import table详细过程(附有下载文件)

前言 下载 使用夸克网盘打开链接,给出的是绿化版免安装 Import REC 链接:https://pan.quark.cn/s/552e4c1ea7d6 提取码:qEMM 下载之后解压得到 里面有使用更新说明 使用修复import table 演示 现在有一个程序,放入PEiD进行查壳…

MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中

MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中 基础篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的…

AI制作表情包,每月躺赚1W+,完整流程制作多重变现教学

项目介绍 AI制作表情包项目是一个利用ai,快速生成表情包的副业项目。 在社交平台如微信、QQ等,表情包已成为日常沟通不可或缺的一部分。通过AI技术,我们可以轻松制作出大量表情包,并通过多种渠道实现变现,非常适合追…

入侵排查之Linux

目录 1.黑客入侵后的利用思路 2.入侵排查思路 2.1.账号安全 2.1.1.用户信息文件/etc/passwd 2.1.2.影子文件/etc/shadow 2.1.3.入侵排查 2.1.3.1.排查当前系统登录信息 2.1.4.2.查询可以远程登录的账号信息 2.2.历史命令 2.2.1.基本使用 2.2.1.1.root历史命令 2.2.…

【OceanBase 诊断调优】—— 止血良方「SQL 限流」

1. 知识点 1. 对于Oceanbase,限流的意思是限制其在单台主机上处理的并发度,因此假设对某SQL限流的并发度为1,该集群有N台机器可以执行该SQL,则实际并发度是N。 2. OceanBase 是通过在 SQL 上绑定 Outline 的方式来实现的&#x…

excel使用

上中下旬的逾期金额 步骤: 1、先判断上中下旬的时间范围 2、根据城市和时间求和,算出对应的逾期金额 问题:当从左插入列时,列的格式与原本一致,当我们想看数值时,发现为日期 解决:在开始-数据格…

MySQL远程连接错误解决:Host is not allowed to connect to this MySQL server

1. 异常错误 通过远程客户端访问MySQL服务器时会遇到“Host is not allowed to connect to this MySQL server”的错误提示。 2. 原因 MySQL服务器当前配置不允许来自特定主机的连接尝试。 3. 解决方法 允许远程主机访问MySQL服务器,按照以下步骤操作&#xff…

MySQL算数运算符基础:详解与入门

目录 背景: 过程: 1.加法与减法运算符 1.2扩展: 1.3运算结果得出结论 : 2.乘法和除法运算 ​2.1练习: 2.2运算结果得出结论 : 3.求模取余运算符 3.1练习: 总结: 背景&a…

7天用Go从零实现分布式缓存GeeCache(学习)

参考资料 前置知识 在 Go 的 HTTP 服务器开发中,ServeHTTP 方法的参数 w http.ResponseWriter 和 r *http.Request 用于处理 HTTP 请求和构建响应。以下是它们的详细解释: 1. w http.ResponseWriter w 是一个 http.ResponseWriter 类型,用…

[HarmonyOS]简单说一下鸿蒙架构

鸿蒙操作系统(HarmonyOS)是由华为公司开发的一款面向全场景的操作分布式系统。它旨在提供一个统一的操作系统平台,支持多种设备,包括智能手机、平板电脑、智能电视、可穿戴设备、智能家居等。鸿蒙架构的设计目标是实现设备之间的无…

centos7.9安装mysql5.7完整版

centos7.9安装mysql5.7完整版 1. 更新yum源 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# ls -lh #备份镜像源 [rootlocalhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.backup #下载阿里云centos7镜像 [rootlocalhost yum.repos.d]# …

2024年AI办公工具API:高效办公的智能选择

在2024年,AI技术已经深入到我们工作生活的方方面面,极大地提高了办公效率和质量。这些工具通过集成先进的算法和模型,使得日常任务自动化、数据分析智能化、内容创作高效化。以下是2024年最受欢迎的AI办公工具API,它们正在重新定义…

[UnLua]动态创建SceneCapture2d相机,并且添加渲染目标纹理

在 Unlua 开发中,相机相关的操作是构建场景视觉效果的重要部分。以下我们来详细分析一段涉及相机实例化和为相机赋予纹理目标的 Unlua 代码。 -- 实例化相机local World self:GetWorld()maskCamera World:SpawnActor(UE.ASceneCapture2D)-- 给相机赋值纹理目标lo…

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …

基于Spring Boot的电子商务系统设计

5 系统实现 系统实现部分就是将系统分析&#xff0c;系统设计部分的内容通过编码进行功能实现&#xff0c;以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析&#xff0c;系统设计最主要还是进行功能&#xff0c;系统操作逻辑的设计&#xff0c;也包括…

数据驱动的投资分析:民锋科技的量化模型探索

在全球金融市场中&#xff0c;数据驱动的投资分析正在变革传统投资方式。民锋科技通过精密的量化模型和智能算法&#xff0c;为投资者提供更加科学的市场预测和投资分析工具&#xff0c;以帮助他们更好地理解市场波动、优化投资组合&#xff0c;实现风险管理。 #### 一、数据驱…