Java面试题—2023年8月24日—YDZH

2023-08-24 10:54:28

北京

yī dào zhì hé


 答案仅供参考,博主仅记录发表,没有实际查询,不保证正确性。


面试题:

1、请你谈谈关于 Synchronized 和 lock ?
2、请简单描述一下类的加载过程?类加载器有几个种,分别作用是什么?
3、JVM有哪些内存区域? (JVM 的内存布局是什么?)
4、请你解释一下类加载机制和双亲委派机制,好处是什么?
5、请问,在java 中会存在内存泄漏吗? 请简单描述一下。
6、请讲讲 LRU算法的实现原理?
7、请简要说明一下IOC 和AOP 是什么?
8、Mysql 事务隔离级别和实现原理?
9、Mysql索引如何实现,为什么用B+树而不是B树实现?
10、Redis 基本数据结构,都分别用于什么场景?举例说明
11、Redis 有序集合 zset 的底层实现是什么?
12、谈一谈,分布式集群中如何保证线程安全?
13、你了解哪些二叉树的种类和他们的具体使用场景?
14、编程:给定一个字符串 s,请计算输出含有连续两个s作为子串的最短字符串。
测试用例 1.输入abc,输出 abcabc;2.输入abcdab,输出abcdabcd;3.输入aaa,输出 aaaa


答案:

1. Synchronized 和 Lock 都是用于控制多线程并发访问同步块的机制,以防止数据不一致。Synchronized 是 Java 的关键字,需要在方法或代码块级别使用。Lock 是一个接口,提供了比 synchronized 更多的功能,例如尝试获取锁定并能中断一个正在等待锁的线程。
2. 类加载过程主要包括加载、验证、准备、解析和初始化五个阶段。类加载器有三种:引导类加载器、扩展类加载器和应用类加载器。引导类加载器负责加载 Java 的核心类库,扩展类加载器负责加载 Java 的扩展库,应用类加载器负责加载用户类路径上的类库。
3. JVM 的内存区域主要包括:方法区、堆区、虚拟机栈、本地方法栈、程序计数器。
4. 类加载机制是 JVM 用来加载类文件的方式,双亲委派机制是一种类加载的策略,它能保证 Java 核心库的类型安全。
5. 在 Java 中,由于垃圾回收机制的存在,内存泄漏的情况相对较少。但是如果对象持有的资源没有被正确释放,例如数据库连接或者文件输入/输出流,就可能会导致内存泄漏。
6. LRU(Least Recently Used)算法是一种常用的页面替换算法,其核心思想是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。
7. IOC(Inversion of Control)是一种设计原则,用于减少代码的耦合度。AOP(Aspect Oriented Programming)是一种编程范式,它提供了一种机制,可以在不修改源代码的情况下,增加额外的功能。
8. MySQL 的事务隔离级别有 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。事务隔离级别的实现原理主要是通过锁和版本控制来实现。
9. MySQL 的索引是通过 B+ 树实现的,因为 B+ 树的查询效率更稳定,所有查询都要查到叶子节点,查询速度相对稳定。而 B 树在数据量大的情况下,查询速度会有较大波动。
10. Redis 的基本数据结构有 String、List、Set、Sorted Set 和 Hash。这些数据结构分别用于不同的场景,例如 String 可以用于存储用户信息,List 可以用于实现队列,Set 可以用于存储无序的唯一元素等。
11. Redis 的有序集合 zset 的底层实现是跳跃列表和哈希表。
12. 在分布式集群中,可以通过分布式锁、乐观锁、悲观锁等方式来保证线程安全。
13. 二叉树的种类有很多,例如二叉搜索树、AVL 树、红黑树等。它们的使用场景也各不相同,例如二叉搜索树可以用于实现查找表,AVL 树和红黑树可以用于实现高效的动态数据查找。
14. 编程题:

写法一:

public String shortestString(String s) {
    int len = s.length();
    for (int i = len / 2; i > 0; i--) {
        if (s.substring(0, i).equals(s.substring(i, i * 2))) {
            return s + s.substring(i);
        }
    }
    return s + s;
}

这个函数会找到字符串 s 中的重复子串,然后将其添加到 s 的末尾,从而形成一个包含两个 s 的最短字符串。

写法二:

public class ShortestString {
    public static String findShortestString(String s) {
        int len = s.length();
        for (int i = 1; i <= len / 2; i++) {
            String sub = s.substring(0, i);
            if (sub.equals(s.substring(i, 2 * i))) {
                return s;
            }
        }
        return s + s;
    }

    public static void main(String[] args) {
        String s1 = "abc";
        System.out.println(findShortestString(s1)); // 输出 abcabc

        String s2 = "abcdab";
        System.out.println(findShortestString(s2)); // 输出 abcdabcd

        String s3 = "aaa";
        System.out.println(findShortestString(s3)); // 输出 aaaa
    }
}

上述代码`findShortestString` 方法用于计算含有连续两个 `s` 作为子串的最短字符串。它首先遍历字符串 `s` 的前半部分(长度为 `len/2`),以 `i` 作为子串的长度进行切割,并将第一个子串与第二个子串进行比较。如果相等,则说明找到了含有连续两个 `s` 作为子串的最短字符串,直接返回 `s`;否则,返回 `s` 加上自身,即重复一次。

在 `main` 方法中使用三组测试用例来验证 `findShortestString` 方法的正确性,输出结果符合预期。


1、关于 Synchronized 和 Lock:

- Synchronized 是 Java 中的关键字,用于实现线程的同步,保证共享资源的互斥访问。它可以修饰方法和代码块,并使用内置的锁机制来实现线程的互斥。
- Lock 是 Java 提供的显式锁机制,通过 Lock 接口及其实现类(如 ReentrantLock)来实现线程的同步。相较于 Synchronized,Lock 提供了更灵活的锁定方式,例如可重入锁、公平锁等。

2、类的加载过程和类加载器:

- 类加载过程包括加载、验证、准备、解析和初始化五个阶段。其中加载是将类的字节码文件加载到内存中;验证是确保字节码文件的正确性和安全性;准备是为类的静态变量分配内存并设置默认初始值;解析是将符号引用转换为直接引用;初始化是执行类的初始化代码,包括静态变量赋值和静态代码块等。
- Java 中有三种类加载器:启动类加载器(Bootstrap Class Loader)、扩展类加载器(Extension Class Loader)和应用程序类加载器(Application Class Loader)。启动类加载器负责加载核心库,扩展类加载器负责加载扩展库,应用程序类加载器负责加载应用程序类。类加载器按照双亲委派机制进行工作。

3、JVM 的内存区域:

- JVM 的内存布局包括以下几个区域:程序计数器、虚拟机栈、本地方法栈、堆、方法区(也称为永久代或元空间)。
- 程序计数器用于指示当前线程执行的字节码行号。
- 虚拟机栈用于存储方法调用的栈帧,每个方法调用对应一个栈帧。
- 本地方法栈与虚拟机栈类似,但是用于本地方法(即使用其他语言实现的方法)。
- 堆是 Java 程序运行时动态分配的内存区域,用于存储对象实例。
- 方法区用于存储类的信息、静态变量、常量池等数据。

4、类加载机制和双亲委派机制:

- 类加载机制指的是将类的字节码文件加载到内存中并生成对应的 Class 对象的过程。Java 使用双亲委派机制来完成类加载,即当一个类加载器收到类加载请求时,它首先将加载任务委托给父加载器,只有在父加载器无法加载时才自己去加载。
- 双亲委派机制的好处是保证类的唯一性和安全性。通过层层委托,可以确保核心类库的安全性,避免恶意代码替换核心类。同时,也可以避免重复加载相同的类,提高了加载效率。

5、在 Java 中可能存在内存泄漏。内存泄漏指的是程序中已经不再使用的对象仍然被占用着内存,导致内存无法回收和释放。常见的内存泄漏情况包括:

- 长生命周期的对象持有短生命周期对象的引用,导致短生命周期对象无法被垃圾回收。
- 集合类中没有正确地使用或释放元素,导致集合对象无法被垃圾回收。
- 资源未正确关闭,例如文件流、数据库连接等。

为避免内存泄漏,应注意及时释放不再使用的对象和资源,避免产生无用的引用关系。

6、LRU 算法的实现原理:

LRU(Least Recently Used)算法是一种常用的缓存淘汰算法,其核心思想是根据数据的访问时间来决定是否淘汰。当缓存空间满时,将最近最少使用的数据从缓存中淘汰出去。

LRU 算法的实现可以使用哈希表和双向链表结合的数据结构。哈希表用于快速查找数据,双向链表用于维护数据的访问顺序。具体实现过程如下:

- 当有新的数据被访问时,先在哈希表中查找该数据是否存在。
- 如果存在,则将该数据从链表中删除,并移到链表头部表示最近使用。
- 如果不存在,则判断缓存空间是否已满,若已满,则淘汰链表尾部的数据。
- 将新的数据插入到链表头部表示最近使用。

通过上述操作,可以保证链表头部的数据是最近访问的数据,而链表尾部的数据是最久未访问的数据。

7、IOC 和 AOP 的简要说明:

- IOC(Inversion of Control)控制反转是一种设计思想,它将对象的创建和依赖关系的管理交给容器来完成,而不是由程序员显式地进行管理。IOC 可以降低组件之间的耦合度,提高代码的可维护性和可测试性。
- AOP(Aspect-Oriented Programming)面向切面编程是一种编程范式,它通过将横切关注点(如日志记录、事务管理等)从业务逻辑中剥离出来,以模块化的方式进行处理。AOP 通过动态代理机制在程序运行期间将这些横切关注点织入到目标对象中。

8、MySQL 事务隔离级别和实现原理:

- MySQL 的事务隔离级别包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
- 实现原理主要涉及锁机制和多版本并发控制(MVCC)。锁机制用于保证并发事务的正确执行顺序,包括共享锁和排他锁;MVCC 则通过为每个数据行保存多个版本来实现事务的隔离性,读操作不会阻塞写操作,提高并发性能。

9、MySQL 索引的实现使用了 B+ 树而不是 B 树。B+ 树相较于 B 树具有以下优势:

- B+ 树的非叶子节点只存储键值信息,而不存储具体数据,使得一个节点可以容纳更多的键值,减少树的层数,提高查询效率。
- B+ 树的叶子节点形成一个有序链表,便于范围查询和遍历操作。
- B+ 树的叶子节点通过指针连接,方便范围查询和按照索引顺序遍历。

10、Redis 的基本数据结构及其应用场景:

- 字符串(String):用于存储单个值,常用于缓存、计数器等场景。
- 列表(List):用于存储有序的字符串集合,可以进行插入、删除、修剪等操作,常用于消息队列、任务队列等场景。
- 哈希(Hash):用于存储键值对集合,可以进行快。

11、Redis 有序集合(zset)的底层实现是跳跃表(skip list)和哈希表(hash table)的结合。

- 在 Redis 中,有序集合是由一个跳跃表和一个哈希表组成的。跳跃表用于实现有序性,而哈希表则用于存储成员与分值之间的映射关系。

- 跳跃表是一种有序的数据结构,它通过多级索引来加快元素查找的速度。在跳跃表中,每个节点包含一个成员和对应的分值,同时还包含多个指向其他节点的指针,这些指针可以使得查找操作不必按顺序一个个地遍历节点,从而提高了查找效率。

- 哈希表则用于存储成员与分值之间的映射关系,它能够在常数时间内根据给定的成员找到对应的分值,并且支持插入、删除和更新操作。

- 通过将跳跃表和哈希表结合起来使用,Redis 的有序集合既能够保持有序性,又能够在常数时间内进行成员的查找、插入、删除和更新等操作。

12、在分布式集群中,要保证线程安全,可以采用以下几种方法:

- 使用互斥锁:在共享资源访问的关键代码段中使用互斥锁,确保同一时间只有一个线程可以访问该资源,避免并发冲突。

- 使用分布式锁:使用分布式锁来保证在分布式环境下的线程安全。常见的分布式锁实现方式包括基于数据库的悲观锁、基于缓存的乐观锁(如 Redis 的 SETNX 命令)、基于 ZooKeeper 的分布式锁等。

- 避免共享状态:尽量避免多个线程之间共享状态,通过将状态封装到每个线程的上下文中,减少线程之间的竞争和冲突。

- 使用线程安全的数据结构:选择线程安全的数据结构,例如 ConcurrentHashMap、CopyOnWriteArrayList 等,避免手动加锁。

- 合理设计系统架构:通过合理的系统架构设计,将需要保证线程安全的模块隔离开,降低线程之间的耦合度,减少线程安全问题的出现。

13、二叉树是一种常见的树状数据结构,它的每个节点最多有两个子节点,分别称为左子节点和右子节点。常见的二叉树有以下几种类型及其使用场景:

- 二叉搜索树(Binary Search Tree,BST):二叉搜索树是一种有序的二叉树,它的左子节点的值小于根节点的值,右子节点的值大于根节点的值。由于其有序性质,二叉搜索树常用于实现动态集合的数据结构,支持快速的插入、删除和查找操作。

- 完全二叉树(Complete Binary Tree):完全二叉树是指除了最后一层外,其他层的节点都是满的,并且最后一层的节点从左到右连续地排列。完全二叉树常用于堆的实现,可以高效地支持堆排序、优先级队列等操作。

- 平衡二叉树(Balanced Binary Tree):平衡二叉树是指任意节点的左右子树的高度差不超过一个固定的常数。平衡二叉树常用于实现高效的查找和插入操作,例如 AVL 树、红黑树等。

- 二叉堆(Binary Heap):二叉堆是一种特殊的完全二叉树,它满足堆的性质,即父节点的值总是大于或小于它的子节点的值。二叉堆常用于实现优先级队列,支持高效的插入、删除和获取最值的操作。

- 线索二叉树(Threaded Binary Tree):线索二叉树是对二叉树进行了优化的数据结构,通过添加线索(即前驱和后继指针)来加速遍历操作。线索二叉树常用于高效地实现中序遍历。


 请注意,以上答案仅供参考,博主仅记录发表,不保证正确性。


原题:


 

下课。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DC电源模块不同的尺寸可以适应实际应用场景

BOSHIDA DC电源模块不同的尺寸可以适应实际应用场景 DC电源模块是现代电子设备的必备部件之一&#xff0c;其可提供稳定的直流电源&#xff0c;保证电子设备正常运行。DC电源模块尺寸的选择直接影响到其适应的应用场景及其性能表现。本文将从尺寸方面分析DC电源模块的适应性&a…

自动化测试工具Selenium的语法续.

OK&#xff0c;那么上篇博客我们介绍了如何搭建基于Javaselenium的环境&#xff0c;并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例&#xff0c;那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法&#xff0c;感谢关注&#xff0c;期待三连~ 目…

港联证券:游资爆炒中电环保,还有谁在蹭核污染防治概念?

8月28日&#xff0c;核污染防治概念股持续大涨&#xff0c;建工修复&#xff08;300958.SZ&#xff09;、捷强配备&#xff08;300875.SZ&#xff09;、东方园林&#xff08;002310.SZ&#xff09;、华盛昌&#xff08;002980.SZ&#xff09;等涨停。 中小市值的概念股成为游资…

SCI论文创新思路

SCI论文创新思路 一、 创新的分类1、算法创新2、架构创新3、迁移创新4、思想创新5、方法创新6、组合创新 二、组合创新的必要性三、组合创新的流程四、组合创新举例1、组合创新公式2、生活中的例子3、关于CV的例子4、魔改的方法 一、 创新的分类 1、算法创新 比如提出CNN、LS…

PDF如何转ppt?PDF转ppt的方法

PDF是一种广泛应用于文档传输和存储的格式&#xff0c;然而&#xff0c;在某些情况下&#xff0c;我们可能需要将PDF文件转换为PPT&#xff0c;以便更加灵活地编辑和展示内容。那么&#xff0c;PDF如何转ppt呢?在本文中&#xff0c;我们将介绍几种常用的方法和工具&#xff0c…

Java“牵手”1688商品跨境属性数据,1688API接口申请指南

1688平台商品详情跨境属性数据接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片&#xff0c;重量&#xff0c;详情描述等详细信息 。 获取商品详情接口API是一种用于…

Linux 终端命令行 产品介绍

Linux命令手册内置570多个Linux 命令&#xff0c;内容包含 Linux 命令手册。 【软件功能】&#xff1a; 文件传输 bye、ftp、ftpcount、ftpshut、ftpwho、ncftp、tftp、uucico、uucp、uupick、uuto、scp备份压缩 ar、bunzip2、bzip2、bzip2recover、compress、cpio、dump、gun…

ant-vue1.78版a-auto-complete表单自动搜索返回列表中的关键字标红

a-auto-complete表单自动搜索返回列表中的关键字标红 通常在做关键字标红的场景&#xff0c;都是后端返回html结构&#xff0c;前端直接渲染实现&#xff0c;但是如果需要前端处理的话&#xff0c;实现也是很简单的&#xff0c;接下来我直接上应用场景吧 应用场景就是通过关键…

EXCEL数据处理

1. 自定义数字格式 选中数字--右键--设置单元格格式--自定义--shang ↑ 2.条件格式 如果。。。。就。。。。 选中某列--开始--条件格式--突出显示--大于/小于/等于。。。--设置为&#xff08;可选自定义格式&#xff09; 选中区域--条件格式--清除规则--清除所选单元格的规…

Java中线程的7大状态的基本介绍

在线程的生命周期中&#xff0c;有七种不同的状态&#xff0c;这些状态描述了线程在不同阶段的情况。Java中线程的七大状态如下&#xff1a; 新建&#xff08;New&#xff09;&#xff1a; 当创建一个线程对象时&#xff0c;线程就处于新建状态。此时&#xff0c;线程已经被创建…

矿业配电柜监测,真的如此难以克服?

当今工业和商业领域中&#xff0c;电力作为生产和运营的基石&#xff0c;无可替代。在这个背景下&#xff0c;配电柜监控的重要性日益凸显。 配电柜作为电力系统的核心组成部分&#xff0c;其稳定运行直接关系到生产的连续性、安全性以及能源的高效利用。通过配电柜监控&#x…

1 Hadoop入门

1.Hadoop是什么&#xff1f; (1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 (2)主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。 (3)广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生态圈 2.Hadoop的优势 3 Hadoop组成 4 HDF…

1. 卷积原理

① 卷积核不停的在原图上进行滑动&#xff0c;对应元素相乘再相加。 ② 下图为每次滑动移动1格&#xff0c;然后再利用原图与卷积核上的数值进行计算得到缩略图矩阵的数据&#xff0c;如下图右所示。 import torch import torch.nn.functional as Finput torch.tensor([[1, 2…

树莓派3b无屏幕登录

如果要无屏登录&#xff0c;烧写时最好设置&#xff0c;勾选WIFI &#xff0c;登录密码&#xff0c;和SSH 树莓派操作系统下载地址 树莓派资源下载 | 树莓派实验室 无屏幕无键盘登录&#xff1a;新版中可能要先SSH登录&#xff0c;然后才能在RASPI-CONFIG中打开串口控制台 登录…

PDF校对:让您的文件无瑕疵

无论您是企业家、学生、教育者还是作家&#xff0c;我们都知道&#xff0c;提交或发布一个充满错误的PDF文件可能会给您的声誉或品牌带来严重损害。这就是为什么PDF校对如此关键的原因。现在&#xff0c;让我们深入了解PDF校对的重要性&#xff0c;以及如何确保您的文件尽可能完…

数据的语言:学习数据可视化的实际应用

数据可视化应该学什么&#xff1f;这是一个在信息时代越来越重要的问题。随着数据不断增长和积累&#xff0c;从社交媒体到企业业务&#xff0c;从科学研究到医疗健康&#xff0c;我们都面临着海量的数据。然而&#xff0c;数据本身往往是冰冷、抽象的数字&#xff0c;对于大多…

stm32之DS18B20

DS18B20与stm32之间也是通过单总线进行数据的传输的。单总线协议在DHT11中已经介绍过。虽说这两者外设都是单总线&#xff0c;但时序电路却很不一样&#xff0c;DS18B20是更为麻烦一点的。 DS18B20 举例&#xff08;原码补码反码转换_原码反码补码转换_王小小鸭的博客-CSDN博客…

「MySQL-00」MySQL在Linux上的安装、登录与删除

目录 一、安装MySQL 0. 安装前请先执行一遍删除操作&#xff0c;把预装或残留的MySQL删除掉 1. 安装yum源 &#xff08;解决了在哪里找MySQL的问题&#xff09; 2. 安装哪个版本的MySQL 二、启动和登录MySQL 三、删除MySQL / MariaDB 安装与卸载前&#xff0c;建议先将用户切换…

时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化

时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于SWD群体分解的分量可视化&#xff0c;基于群体分解的信号分解技术&#xff0c;MATLAB程序…

LeetCode538. 把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树 文章目录 [538. 把二叉搜索树转换为累加树](https://leetcode.cn/problems/convert-bst-to-greater-tree/)一、题目二、题解方法一&#xff1a;递归&#xff08;中序遍历与节点更新&#xff09;方法二&#xff1a;反向中序遍历与累加更新&#x…