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

news2024/11/17 15:33:39

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


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


原题:


 

下课。 

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

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

相关文章

微信小程序开发项目步骤【详细】

在平常是H5开发中已经不能满足我们的需求了&#xff0c;随着小程序的火热&#xff0c;越来越多的项目开发也离不开小程序的运用&#xff0c;目前常用的就是微信小程序&#xff0c;我们学完微信小程序后其他的小程序开发也是基本一样的&#xff0c;也为后面的uniapp开发做下一定…

港联证券|油价上涨对股票影响大吗?利好还是利空?

石油是现代国家国民经济的血脉&#xff0c;直接影响国民经济的发展。那么&#xff0c;油价上涨对股票影响大吗&#xff1f;利好仍是利空&#xff1f;为大家准备了相关内容&#xff0c;以供参阅。 香港港联证券有限公司&#xff08;百度一下港联证券&#xff09;成立于2021年1月…

vue 简单实验 v-model 变量和htm值双向绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"two-way-binding"><p>{{ message }}</p><input v-model"message" /> </div> <script>…

AD域组策略开机脚本客户端不执行:解决方法

需求&#xff1a;本例实现的客户端计算机开机执行脚本&#xff0c;实现重置本地管理员的密码 1、创建组策略 2、在AD域中添加脚本 3、注意脚本的路径&#xff1a;就是打开 Show Files 目录&#xff0c;保证在客户端也能正常访问 4、本例建了2个脚本&#xff0c;一个是用来测试…

当《孤注一掷》照进现实,创邻科技Galaxybase助反诈一臂之力

“想成功&#xff0c;先发疯&#xff0c;不顾一切向钱冲&#xff1b;拼一次&#xff0c;富三代&#xff0c;拼命才能不失败。” 这看似振奋、实则让人背后发凉的口号来自于电影《孤注一掷》&#xff0c;它的背后是无数受害人血泪交织的受骗故事。 作为一部反诈题材电影&…

若依微服务版部署到IDEA

1.进入若依官网&#xff0c;找到我们要下的微服务版框架 2.点击进入gitee,获取源码&#xff0c;下载到本地 3.下载到本地后&#xff0c;用Idea打开&#xff0c;点击若依官网&#xff0c;找到在线文档&#xff0c;找到微服务版本的&#xff0c;当然你不看文档&#xff0c;直接按…

【从零学习python 】69. 网络通信及IP地址分类解析

文章目录 网络通信的概念IP地址IP地址的分类A类地址B类地址C类地址D类地址E类地址私有地址 进阶案例 网络通信的概念 简单来说&#xff0c;网络是用物理链路将各个孤立的工作站或主机相连在一起&#xff0c;组成数据链路&#xff0c;从而达到资源共享和通信的目的。 使用网络…

适用于各阶段Java程序员的面试备战/避坑指南

最近阅读了一些找工作的文章&#xff0c;特别是看了一位00后找工作的经历&#xff0c;历时2个月&#xff0c;使用了各种途径&#xff0c;也遇到了各类公司。看完之后&#xff0c;感慨后生可畏。其中涉及到了很多的技巧、踩坑和事项&#xff0c;提炼出来&#xff0c;以供大家享用…

互联网企业如何在线编写产品说明书?

互联网企业在线编写产品说明书是一个重要的工作环节&#xff0c;它能够帮助企业有效地传达产品的特点、功能和使用方法&#xff0c;提高用户的使用体验。 编写一份优秀的产品说明文档对于企业来说非常重要&#xff0c;它可以帮助用户理解产品的功能、使用方法和优势&#xff0c…

《深入浅出OCR》前言知识(一):机器学习知识总结

✨专栏介绍&#xff1a; 经过几个月的精心筹备&#xff0c;本作者推出全新系列《深入浅出OCR》专栏&#xff0c;对标最全OCR教程&#xff0c;具体章节如导图所示&#xff0c;将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 &#x1f468;‍&…

解决css英文内容不自动换行的问题

解决css英文内容不自动换行的问题 这里主要是针对CMS后台管理系统添加进入数据库&#xff0c;再抓取出来前端显示的英文不换行的问题的情况 1.一般常见的就是英文不自动换行&#xff0c;或者英文换行单词背截断的问题。 这种处理方法通过前端样式就可以解决&#xff0c;方法网…

R包开发1:RStudio 与 GitHub建立连接

目录 1.安装Git 2-配置Git&#xff08;只需配置一次&#xff09; 3-用SSH连接GitHub(只需配置一次) 4-创建Github远程仓库 5-克隆仓库到本地 目标&#xff1a;创建的R包&#xff0c;包含Git版本控制&#xff0c;并且能在远程Github仓库同步&#xff0c;相当于发布在Github。…

Vue报错 TypeError: this.getOptions is not a function

一般而言这是因为sass而报出来的错误 我们先删除node_modules&#xff0c;然后重新安装依赖 如果使用的是node-sass&#xff0c;则需要考虑正确的版本 示例 npm install sass-loader7.3.1 node-sass4.14.1 --save-dev 如果使用的是sass&#xff0c;则使用以下命令 npm i -…

第八章:Echarts统计功能【基于Servlet+JSP的图书管理系统】

Echarts统计 1.图书统计 通过Echarts根据不同的数据类型统计数据的数量。并且通过柱状图来展示 实现的步骤&#xff1a; 引入echars的js文件 然后定义柱状图展示的div 然后是基础的js代码 <script type"text/javascript">// 基于准备好的dom&#xff0c;初始…

亚马逊鲲鹏测评养号系统是怎么用的

亚马逊鲲鹏系统是一款可以全自动测评养号的软件&#xff0c;有批量注册亚马逊买家号、AI智能养号、自动绑定收货地址及支付卡、开通二步验证、根据关键词货比三家后进行加购、下单、留评等。 想要使用这款软件进行下单&#xff0c;那么首先我们需要有买家账号才行&#xff0c;买…

Python(八十六)字符串的编码与解码

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

腾讯、众安、卡斯柯、极狐GitLab 圆桌精华版:“狂飙”减速,效能登场

目录 Q1&#xff1a;近年来众多软件企业纷纷投身“效能革命”&#xff0c;降本增效的呼声越来越大&#xff0c;背后的原因是什么&#xff1f; 变化与成本方法论进步&#xff0c;点燃研发效能。 “狂飙”踩下刹车&#xff0c;“湖水岩石效应”加速显现。 Q2&#xff1a;当我…

【附安装包】Quartus II 18.0安装教程

软件下载 软件&#xff1a;Quartus II版本&#xff1a;18.0语言&#xff1a;英文大小&#xff1a;2.62G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu.c…

长时间带什么耳机最舒服,分享长时间佩戴舒服的耳机推荐

时代在进步&#xff0c;科技在不断革新。近年来&#xff0c;一种崭新的耳机——骨传导耳机&#xff0c;如火如荼地进驻耳机市场&#xff0c;引起一阵热潮。不论是平日里的工作出勤还是运动时的挥洒汗水&#xff0c;相比传统耳机&#xff0c;骨传导耳机无疑更加贴合现代生活的需…

客服如何使用ChatGPT提高工作效率

文章目录 ChatGPT简介ChatGPT在客服中的应用ChatGPT的优势和挑战客服人员应该如何应对1. 与ChatGPT保持较高的专业水平2. 与ChatGPT建立良好的合作关系3. 强调人性化的服务4. 不断提升沟通和解决问题的能力5. 提供多渠道的服务 总结 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3…