java面试题-阿里真题详解

news2024/11/18 23:25:02

前言

大家好,我是局外人一枚,最近有不少粉丝去阿里巴巴面试了,回来之后总结不少难题给我,以下是面试的真题,跟大家一起来讨论怎么回答。

阿里一面

在这里插入图片描述

1、说⼀下ArrayList和LinkedList区别

⾸先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的
由于底层数据结构不同,他们所适⽤的场景也不同,ArrayList更适合随机查找,LinkedList更适合删除和添加,查询、添加、删除的时间复杂度不同
另外ArrayList和LinkedList都实现了List接⼝,但是LinkedList还额外实现了Deque接⼝,所以LinkedList还可以当做队列来使⽤

2、说一下HashMap的Put方法

根据Key通过哈希算法与与运算得出数组下标
如果数组下标位置元素为空,则将key和value封装为Entry对象(JDK1.7中是Entry对象,JDK1.8中是Node对象)并放⼊该位置
如果数组下标位置元素不为空,则要分情况讨论

a. 如果是JDK1.7,则先判断是否需要扩容,如果要扩容就进⾏扩容,如果不⽤扩容就⽣成Entry对象,并使⽤头插法添加到当前位置的链表中
b. 如果是JDK1.8,则会先判断当前位置上的Node的类型,看是红⿊树Node,还是链表Node

i. 如果是红⿊树Node,则将key和value封装为⼀个红⿊树节点并添加到红⿊树中去,在这个过程中会判断红⿊树中是否存在当前key,如果存在则更新value

ii. 如果此位置上的Node对象是链表节点,则将key和value封装为⼀个链表Node并通过尾插法插⼊到链表的最后位置去,因为是尾插法,所以需要遍历链表,在遍历链表的过程中会判断是否存在当前key,如果存在则更新value,当遍历完链表后,将新链表Node插⼊到链表中,插⼊到链表后,会看当前链表的节点个数,如果⼤于等于8,那么则会将该链表转成红⿊树

iii. 将key和value封装为Node插⼊到链表或红⿊树中后,再判断是否需要进⾏扩容,如果需要就扩容,如果不需要就结束PUT⽅法

3、说一下ThreadLocal

1、ThreadLocal是Java中所提供的线程本地存储机制,可以利⽤该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意⽅法中获取缓存的数据。
2、ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象(注意不是ThreadLocal对象)中都存在⼀个ThreadLocalMap,Map的key为ThreadLocal对象,Map的value为需要缓存的值
3、如果在线程池中使⽤ThreadLocal会造成内存泄漏,因为当ThreadLocal对象使⽤完之后,应该要把设置的key,value,也就是Entry对象进⾏回收,但线程池中的线程不会回收,⽽线程对象是通过强引⽤指向ThreadLocalMap,ThreadLocalMap也是通过强引⽤指向Entry对象,线程不被回收,Entry对象也就不会被回收,从⽽出现内存泄漏,解决办法是,在使⽤了ThreadLocal对象之后,⼿动调⽤ThreadLocal的remove⽅法,⼿动清楚Entry对象
4、ThreadLocal经典的应⽤场景就是连接管理(⼀个线程持有⼀个连接,该连接对象可以在不同的⽅法之间进⾏传递,线程之间不共享同⼀个连接)
在这里插入图片描述

5、说一下JVM中,哪些是共享区,哪些可以作为gc root你们项目

1、堆区和⽅法区是所有线程共享的,栈、本地⽅法栈、程序计数器是每个线程独有的

在这里插入图片描述

2、什么是gc root,JVM在进⾏垃圾回收时,需要找到“垃圾”对象,也就是没有被引⽤的对象,但是直接找“垃圾”对象是⽐较耗时的,所以反过来,先找“⾮垃圾”对象,也就是正常对象,那么就需要从某些“根”开始去找,根据这些“根”的引⽤路径找到正常对象,⽽这些“根”有⼀个特征,就是它只会引⽤其他对象,⽽不会被其他对象引⽤,例如:栈中的本地变量、⽅法区中的静态变量、本地⽅法栈中的变量、正在运⾏的线程等可以作为gc root。

6、你们项目如何排查JVM问题

对于还在正常运⾏的系统:

可以使⽤jmap来查看JVM中各个区域的使⽤情况

可以通过jstack来查看线程的运⾏情况,⽐如哪些线程阻塞、是否出现了死锁

可以通过jstat命令来查看垃圾回收的情况,特别是fullgc,如果发现fullgc⽐较频繁,那么就得进⾏调优了

通过各个命令的结果,或者jvisualvm等⼯具来进⾏分析

⾸先,初步猜测频繁发送fullgc的原因,如果频繁发⽣fullgc但是⼜⼀直没有出现内存溢出,那么表示fullgc实际上是回收了很多对象了,所以这些对象最好能在younggc过程中就直接回收掉,避免这些对象进⼊到⽼年代,对于这种情况,就要考虑这些存活时间不⻓的对象是不是⽐较⼤,导致年轻代放不下,直接进⼊到了⽼年代,尝试加⼤年轻代的⼤⼩,如果改完之后,fullgc减少,则证明修改有效

同时,还可以找到占⽤CPU最多的线程,定位到具体的⽅法,优化这个⽅法的执⾏,看是否能避免某些对象的创建,从⽽节省内存

对于已经发⽣了OOM的系统:
1、⼀般⽣产系统中都会设置当系统发⽣了OOM时,⽣成当时的dump⽂件

(- XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/base) 

2、我们可以利⽤jsisualvm等⼯具来分析dump⽂件
3、根据dump⽂件找到异常的实例对象,和异常的线程(占⽤CPU⾼),定位到具体的代码
4、然后再进⾏详细的分析和调试

总之,调优不是⼀蹴⽽就的,需要分析、推理、实践、总结、再分析,最终定位到具体的问题

7、如何查看线程死锁

1.可以通过jstack命令来进⾏查看,jstack命令中会显示发⽣了死锁的线程
2.或者两个线程去操作数据库时,数据库发⽣了死锁,这是可以查询数据库的死锁情况

1、查询是否锁表 show OPEN TABLES where In_use > 0;
2、查询进程 show processlist;
3、查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
4、查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

8、线程之间如何进行通讯的

1、线程之间可以通过共享内存或基于⽹络来进⾏通信
2、如果是通过共享内存来进⾏通信,则需要考虑并发问题,什么时候阻塞,什么时候唤醒
3、像Java中的wait()、notify()就是阻塞和唤醒
4、通过⽹络就⽐较简单了,通过⽹络连接将通信数据发送给对⽅,当然也要考虑到并发问题,处理⽅式就是加锁等⽅式

9、介绍一下Spring,读过源码介绍一下大致流程

1、Spring是⼀个快速开发框架,Spring帮助程序员来管理对象
2、Spring的源码实现的是⾮常优秀的,设计模式的应⽤、并发安全的实现、⾯向接⼝的设计等
3、在创建Spring容器,也就是启动Spring时:

a. ⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中
b.然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean,对于多例Bean不需要在启动过程中去进⾏创建,对于多例Bean会在每次获取Bean时利⽤BeanDefinition去创建
c.利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,这期间包括了合并BeanDefinition、推断构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发⽣在初始化后这⼀步骤中

4、单例Bean创建完了之后,Spring会发布⼀个容器启动事件
5、Spring启动结束
6、在源码中会更复杂,⽐如源码中会提供⼀些模板⽅法,让⼦类来实现,⽐如源码中还涉及到⼀些BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过BenaFactoryPostProcessor来实现的,依赖注⼊就是通过BeanPostProcessor来实现的
7、在Spring启动过程中还会去处理@Import等注解

10、说一下Spring的事务机制

1、Spring事务底层是基于数据库事务和AOP机制的
2、⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
3、当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
4、如果加了,那么则利⽤事务管理器创建⼀个数据库连接
5、并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮常重要的⼀步
6、然后执⾏当前⽅法,⽅法中会执⾏sql
7、执⾏完当前⽅法后,如果没有出现异常就直接提交事务
8、如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
9、Spring事务的隔离级别对应的就是数据库的隔离级别
10、Spring事务的传播机制是Spring事务⾃⼰实现的,也是Spring事务中最复杂的
11、Spring事务的传播机制是基于数据库连接来做的,⼀个数据库连接⼀个事务,如果传播机制配置为需要新开⼀个事务,那么实际上就是先建⽴⼀个数据库连接,在此新数据库连接上执⾏sql

11、什么时候@Transactional失效

因为Spring事务是基于代理来实现的,所以某个加了@Transactional的⽅法只有是被代理对象调⽤时,那么这个注解才会⽣效,所以如果是被代理对象来调⽤这个⽅法,那么@Transactional是不会⽣效的。

同时如果某个⽅法是private的,那么@Transactional也会失效,因为底层cglib是基于⽗⼦类来实现的,⼦类是不能重载⽗类的private⽅法的,所以⽆法很好的利⽤代理,也会导致@Transactianal失效

Dubbo底层是通过RPC来完成服务和服务之间的调⽤的,Dubbo⽀持很多协议,⽐如默认的dubbo协议,⽐如http协议、⽐如rest等都是⽀持的,他们的底层所使⽤的技术是不太⼀样的,⽐如dubbo协议底层使⽤的是netty,也可以使⽤mina,http协议底层使⽤的tomcat或jetty。

服务消费者在调⽤某个服务时,会将当前所调⽤的服务接⼝信息、当前⽅法信息、执⾏⽅法所传⼊的⼊参信息等组装为⼀个Invocation对象,然后不同的协议通过不同的数据组织⽅式和传输⽅式将这个对象传送给服务提供者,提供者接收到这个对象后,找到对应的服务实现,利⽤反射执⾏对应的⽅法,得到⽅法结果后再通过⽹络响应给服务消费者。

当然,Dubbo在这个调⽤过程中还做很多其他的设计,⽐如服务容错、负载均衡、Filter机制、动态路由机制等等,让Dubbo能处理更多企业中的需求。

12、Dubbo是如何做系统交互的Dubbo的负载均衡策略

Dubbo⽬前⽀持:
1、平衡加权轮询算法
2、加权随机算法
3、⼀致性哈希算法
4、最⼩活跃数算法

13、还读过哪些框架源码介绍一下你还熟悉的

这个问题⽐较⼴泛,你即可以说:HashMap、线程池等JDK⾃带的源码,也可以说Mybatis、Spring Boot、Spring Cloud、消息队列等开发框架或中间件的源码

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

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

相关文章

CSA《企业架构参考指南》实现安全、效率和运营,最佳实践指南!

企业数字化安全转型面临着信息系统架构的选择、判断和组合的困扰。对组织、技术、人才、管理和业务模型等多方面的有机融合和运转构成了架构,而安全是架构高效发挥的基础,二者都是竞争力。 国际云安全联盟CSA发布报告《企业架构参考指南》是国外大型企业…

【Windows】使用Fiddler 工具对手机进行接口监听

目录 工具下载 配置Fidder 手机端获取证书 过滤指定接口 工具下载 CSDN下载地址 其他下载地址 配置Fidder 安装后,打开进入如下界面 在fiddler菜单项选择Tools -> Options -> HTTPS 勾选【Decrypt HTTPS traffic 】 下拉框默认:【from al…

C++复习笔记11

1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被…

时隔多年再学习Vuex,什么?原来如此简单!

时隔多年再学习Vuex,什么?原来如此简单! start 写 Vue 写了好多年了,少不了和 Vuex 打交道。虽然使用它的次数非常频繁,但是潜意识里总觉得这东西很难,导致遇到与之相关的问题就容易慌张。时至今日,升级版…

CDH 6.3.2 升级Hive 2.3.9

升级背景 DolphinScheduler 3.1.1安装好后,其源码中集成的是Hive 2.1.1,版本太低,当在数据中心连接Hive数据源时报错,所以升级CDH自带的Hive为2.3.9版本。 一、准备工作 1、下载hive2.3.9并解压 下载地址:http://a…

世界前沿3D开发工具HOOPS 2023震撼发布,核心功能再升级

HOOPS SDK简介 HOOPS SDK是全球领先开发商TechSoft 3D旗下的原生产品,专注于Web端、桌面端、移动端3D工程应用程序的开发。长期以来,HOOPS通过卓越的3D技术,帮助全球600多家知名客户推动3D软件创新,这些客户包括SolidWorks、SIEM…

springboot+vue学生考勤请假管理系统

管理员: 系统用户管理:针对系统的管理员用户, 系统用户的基本信息情况,进行管理。 教师管理:可以对教师权限的用户信息进行管理。并且能过实现教师信息的查看,密码修改等。 学生管理:对学生用户…

Unreal Engine06:Actor的实现

写在前面 Actor是可以放进地图的最基本类,这里主要是介绍一下Actor的使用。 一、空间坐标系 1. Actor的变换操作 Actor的变换变换操作主要包括四个部分: 位置;旋转;缩放; 上面三者都是对应三个轴进行变换&#xff1…

IP SAN组网配置

目录一、确认网络连接畅通二、服务器端ISCSI启动器配置1.以root身份登录2.验证是否已安装iSCSI启动器3.安装iSCSI启动器4.启动iSCSI服务5.给iSCSI启动器命名6.扫描目标器7.登录目标器8.将登录目标器行为设置为自启动三、主机多路径配置四、存储配置五、主机挂载背景&#xff1a…

ubuntu20.04配置UR机械臂的仿真环境

ubuntu20.04配置UR机械臂的仿真环境 参考链接 1. 首先安装好ROS ubuntu20.04安装Noetic版本的ros,具体安装可见之前写的博客 2. 配置UR机械臂仿真工具包 找一个你喜欢的地方创建ros工作空间(也就是找个文件夹放ros的包,然后编译运行&…

03 路由匹配

封装了框架的 Context, 将请求结构 request 和返回结构 responseWriter 都封装在 Context 中。利用这个 Context, 我们将控制器简化为带有一个参数的函数 FooControllerHandler,这个控制器函数的输入和输出都是固定的。在框架层面&#xff0c…

MySQL(二)表的操作

一、创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明: field 表示列名 datatype 表示列的类型 character set 字符集,如…

如何创建你的公司的FAQ页面?

很多企业考虑为公司搭建一个“常见问题”页面,作为帮助客户回答关于产品和服务的常见问题的一种方式。 FAQ页面和登录/销售页面不同,没有展现出直接的投资回报,但是为团队节省了其他成本,据了解,高达67%的客户相比于跟…

STM32 - 看门狗

独立看门狗 IWDG专业时钟LSI 低功耗仍可以运行对定时的控制比较松喂狗这些时间是按照40kHz时钟给出。实际上,MCU内部的RC频率会在30kHz到60kHz之间变化。此外,即使RC振荡器的频率是精确的,确切的时序仍然依赖于APB接口时钟与RC振荡器时钟之间…

浅谈IDE 和代码编辑器之间有什么区别?

您希望如何完成日常编码?快速地?明显地。以既不重复也不单调的方式?自然。拥有您可能随时需要的所有工具。 是否会得到这一切取决于选择在哪里编写代码。您在这里的两个主要选择是代码编辑器或 IDE。两者都旨在使您的编码更容易 - 但是&…

使用 PyNeuraLogic 超越 Transformers

展示神经符号编程的力量neuro-symbolic1. 简介 在过去的几年里,我们看到了基于 Transformer 的模型的兴起,并在自然语言处理或计算机视觉等许多领域取得了成功的应用。在本文[1]中,我们将探索一种简洁、可解释和可扩展的方式来表达深度学习模…

捕获最小化窗口的缩略图画面

关键字: capture minimized window window thumbnail IsIconic 问题背景 最小化的窗口,API GetClientRect 返回的窗口尺寸是0x0,故无法通过GetDCBitBlt捕获到窗口画面。 但是 Agora/zoom/tencentMeeting 都可以拿到最小化窗口的缩略图…

Python自动化必不可少的测试框架 — pytest

Python在测试圈的应用非常广泛,特别是在自动化测试以及测试开发的领域,其中在自动化测试中我们常用的测试框架是uniitest和pytest,本文将带领大家搭建以及熟悉pytest的使用。 既然有unittest那么为什么还要用pytest呢? 这是因为…

会议论文分享-Security22-状态感知符号执行

Ferry: State-Aware Symbolic Execution for Exploring State-Dependent Program Paths1.引言2.问题陈述与分析2.1.实现状态感知符号执行的挑战2.2.真实程序的特征2.3.Ferry的模型2.3.1.程序状态的定义2.3.2.状态描述变量的特征3.Design3.1.Overview of Ferry3.2.状态描述变量识…

CISCN(Web Ezpentest)GC、序列化、case when

目录 REGEXP的一个点(正则) like(默认不区分大小写) 当禁用了空格 regexp,like的区分大小写的使用方法 [CISCN 2022 初赛]ezpentest 卡点 2022 HFCTF babysql 最近又学到了一道新知识,case when的错…