JAVA后端面试

一、基础

1、创建对象的方法

new、反射、clone、反序列化

Class cl = Class.forName("TestMe");

2、有哪些引用类型

强引用、软引用、弱引用、虚引用

3、JVM 类加载机制

双亲委派机制(Parent-Delegate Model)是Java类加载器中采用的一种类加载策略,如果一个类加载器收到了类加载请求,默认先将该请求委托给其父类加载器处理。

只有当父级加载器无法加载该类时,才会尝试自行加载。避免重复加载,提高安全性

4、反射怎么实现

因为Java虚拟机会把类加载到方法区,并且保留Class对象作为每个类的元对象,通过这个对象就可以获取该类的信息,从而获取它的方法,构造函数,变量等内容。

5、JDK11的新特性

局部变量类型推断 var message = "Hello, World!";

Java JDK 11引入了一个新的HTTP Client API,用于进行HTTP通信

6、JVM类加载过程

JVM类加载过程分为:加载 、链接 、初始化 、使用 、卸载 这五个阶段,其中链接阶段又包括: 验证 、 准备 、 解析

7、JVM内存模型

JVM 内存模型主要分为堆、方法区、栈区(程序计数器、虚拟机栈和本地方法栈)。其中,堆和方法区被所有线程共享需要定期被GC,虚拟机栈、本地方法栈、程序计数器

是线程私有的,在超出作用域后会被JVM自动释放掉

二、数据库

1、redis的优点和可以存储的数据结构,zset的底层实现

速度快(数据存在内存)、持久化(允许将内存中的数据定期写入磁盘)、支持事务操作(原子性);string、list、set、zset、hash

2、MySql索引的实现原理,为什么用B+树不用二叉树

索引的实现一般是B树或B+树(InnoDB使用)

B+ 树的特点是能够保持数据稳定的顺序,并且非叶子节点只存储键值信息,而叶子节点存储了完整的数据行,同时每个叶子节点都包含了指向下一个叶子节点的指针,形成了一个有序的数据链表

减少了磁盘IO的次数(树的高度决定)

树的高度较低,提高了查找效率

叶子节点之间有链指针,方便范围查询

3、什么是分库分表?怎么分?为什么要分?

分库是指在表数量不变的情况下对库进行切分。

分库分表是指库和表都切分,数量都发生变化。

水平分(数据结构不变)、垂直分(数据结构变)

出现性能瓶颈需要分库分表,增加维护难度

4、怎么解决并发带来的问题

事务隔离、乐观锁、查询优化、读写分离

5、脏读、幻读、不可重复读以及数据库的事务隔离机制

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据

幻读是指在一个事务内,多次读同一数据,由于第二个事务的修改,导致两次读到的数据不一致

事务A查询数据的时候,事务B删除或增加了多个数据,导致事务A查询的数据集发生了变化

读未提交、读已提交(防止脏读)、可重复读(避免不可重复读)、串行化

6、分页的方法

使用LIMIT(SELECT * FROM example_table LIMIT 10;)

使用LIMIT OFFSET(SELECT * FROM example_table LIMIT 10 OFFSET 10;)

动态构建分页查询

SET @page := 2; -- 当前页码

SET @pageSize := 10; -- 每页显示的记录数

SELECT * FROM example_table LIMIT @pageSize OFFSET (@page - 1) * @pageSize;

7、mysql的行锁有几种,什么情况下会锁住整张表

锁按照操作粒度从小到大可以划分为行锁、页面、表锁(锁整张表)

8、MyISAM 与 InnoDB

INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MYISAM不支持。MYISAM的性能更优,占用的存储空间少

8、慢查询

缺乏索引、复杂的查询、大量的数据、硬件限制和配置不当

使用mysqldumpslow工具分析慢查询日志,做sql优化,将慢查询日志中的SQL语句复制到查询窗口,在前面加上EXPLAIN,

运行查看查询的执行计划,包括是否使用了索引、数据扫描的行数等

9、怎么解决死锁

SHOW PROCESSLIST查看当前运行的进程,死锁会被标记为waiting for lock

三、springboot

1、springboot和spring的区别

简化了配置

2、spring常用注解

@SpringBootApplication,复合注解

3、SpringBoot如何启动的Tomcat

内嵌的Tomcat服务器是通过Spring Boot Starter Web模块提供的功能来启动的

tomcat的作用:解析用户的http请求

4、Spring Boot 如何定义多套不同环境配置?

使用不同的配置文件、使用 @Profile 注解来加载不同的配置文件

5、spring的核心思想

IOC(控制反转):将组件间的关系从程序内部转移至外部容器(xml文件)中进行管理。

DI(依赖注入):组件间的依赖关系由系统运行期间决定。外部容器将带有依赖关系的目标对象实例动态注入到系统中的各个组件中。

AOP(面向切面编程):AOP可以进一步将业务无关的但是与业务模块共同调用的逻辑操作单独封装起来,减少重复代码,降低耦合性,提高维护性。

6、spring启动流程

Spring启动流程主要包括以下几个步骤:

启动Spring容器:通过ApplicationContext实例化Spring容器,可以是ClassPathXmlApplicationContext、FileSystemXmlApplicationContext或者

基于注解的AnnotationConfigApplicationContext。

读取配置文件或注解配置:Spring容器读取配置文件或注解,并解析Bean定义。

实例化Bean:基于Bean定义,Spring创建Bean的实例。

设置Bean属性:为Bean的属性设置值和对其他Bean的引用。

初始化Bean:如果Bean实现了InitializingBean接口,调用afterPropertiesSet()方法,如果在配置文件中定义了init-method,调用指定的初始化方法。

注册Bean到Spring容器:Bean现在可以被Spring容器使用了。

四、数据结构

1、hashmap的底层实现

将k,v封装到Node对象当中,算出k的hash值,将hash值转换成数组的下标,下标位置如果不止一个元素,拿k和链表上每个节点的k进行equal

初始size是6,每次扩容为2的n次幂

2、ArrayList 和 LinkedList、Vector的区别是什么

ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问

3、哪些集合类是线程安全的

集合主要分为Collection和Map两大接口,

Vector(方法同步,处理大量数据性能不行)、Hashtable(synchronized关键字)、ConcurrentHashMap(分段锁机制)

4、Iterator迭代器的实现原理

5、hashmap和hashtable的区别

Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key

Hashtable是线程安全的,每个方法都加了synchronized 关键字

6、ArrayList的底层?为什么加载因子是0.75?如何扩容

考虑到性能和容量的平衡

7、ConcurrentHashMap怎么实现线程安全

采用分段锁机制,类似悲观锁的实现,每一段操作都需要对应的锁

五、垃圾回收

1、常用GC算法

引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;

可达性分析: 从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Root 没有任何引用链相连时,则证明此对象是可以被回收的。

根搜索算法、标记-清除算法、分代算法

2、介绍下垃圾回收器CMS

如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现;

采用标记-清除算法,产生大量的内存碎片

3、频繁产生Full GC是什么原因,怎么排查

系统并发高、执行耗时过长,或者数据量过大

存在内存溢出的情况

程序一次性加载过多对象到内存

排查:通过jmap来获取dump文件,通过JDK自带的jvisualvm工具分析

4、堆内存和栈内存的区别,堆区怎么做内存管理

对象都在堆内存,定期被GC,

堆内存会分成young区和old区,young区又分成eden区和两个surviver,new对象时,会分配在eden区,对象经过gc后分代年龄增加,达到阈值进入old区

5、StackOverFlowError的场景,怎么排查

调用(没有结束递归条件的)递归函数

创建大量的线程或方法,使得栈帧超量

检查代码中是否有递归调用,并确保有适当的退出条件

如果是多线程,检查线程切换是否正确

6、OutOfMemoryError(内存溢出)

栈内存溢出:创建了太多线程,没有足够的空间为一个新的线程分配空间

堆内存溢出:创建了太多对象,没有足够的空间为一个新的对象分配空间

检查代码中是否有大对象分配,如大数组或大字符串

申请更多内存,调整虚拟机的启动参数

使用内存分析工具(如 VisualVM, JProfiler, MAT)来找出内存泄漏

-Xms1500m(起始) -Xmx1500m(最大) -XX:PermSize=125M -XX:MaxPermSize=256M

7、内存泄露和内存溢出的区别

后者是持续累计的结果,内存灭有手动释放

解决内存溢出的方法通常包括优化数据结构和算法、减少内存消耗或增加系统可用内存

解决内存泄漏则需要定位泄漏源头,修复代码中的内存管理问题,确保不再使用的内存能够被及时释放

六、多线程

1、线程和进程的区别,线程有哪些状态

初始、运行、阻塞、等待、超时等待、终止

继承Thread类、实现Runnable接口、实现Callable接口、使用线程池

3、线程池的参数介绍下,有什么拒绝策略

corePoolSize:核心线程数

maximumPoolSize:最大线程数

keepAliveTime:空闲线程存活时间

TimeUnit:时间单位

BlockingQueue:线程池任务队列

ThreadFactory:创建线程的工厂

RejectedExecutionHandler:拒绝策略

4、wait和notify介绍下

5、什么是死锁,怎么避免,乐观锁和悲观锁

乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。

悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。

6、什么是线程安全问题,怎么实现线程安全

多个线程同时操作同一个共享资源的时候可能会出现业务安全问题(买票,不同窗口卖同一张票)

线程同步,synchronized同步方法或者同步代码块,一前一后执行,不竞争;核心思想是把共享资源加锁,每次只能一个线程访问完毕以后解锁

七、设计模式

1、策略模式

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换

2、工厂模式

解决接口选择的问题

3、手写单例模式

public class Singleton { 

    private static Singleton instance; 

    private Singleton (){} 

    public static Singleton getInstance() { 

        if (instance == null) { 

            instance = new Singleton(); 

        } 

        return instance; 

    } 

}

八、网络协议

1、websocket有什么优点

双向通信、实时性、长连接、

2、session和cookie的区别,cookie被禁了怎么办

cookie数据存放在客户的浏览器上(不安全),session数据放在服务器上

URL重写:URL重写要求将站点中的所有超链接都进行改造,在超链接后用一个特殊的参数JSESSIONID保存当前浏览器对应session的编号

用文件、数据库等形式保存Session ID,在跨页过程中手动调用

3、tcp粘包

由于接收方和发送方的缓冲区大小不一致,导致接收方一次性收了一个半的数据

两个数据之间设定特殊的符号、包头添加数据包的长度

4、tcp为什么要三次握手

如果采用两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务器端的请求,

那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。若采用三次握手,服务器端没

有收到来自客户端的再此确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。

5、http和https的区别

安全版、加密传输

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

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

相关文章

基于java+springboot+vue实现的健身俱乐部系统(文末源码+Lw+ppt)23-49

摘 要 随着社会的发展,健身俱乐部的管理形势越来越严峻。越来越多的用户利用互联网获得信息,健身信息鱼龙混杂,信息真假难以辨别。为了方便用户更好的获得本健身俱乐部管理信息,因此,设计一种安全高效的健身俱乐部网…

React-基础语法学习

1、教程:井字棋游戏 本教程将引导你逐步实现一个简单的井字棋游戏,并且不需要你对 React 有任何了解。在此过程中你会学习到一些编写 React 程序的基本知识,完全理解它们可以让你对 React 有比较深入的理解。 1.1、教程分成以下几个部分&am…

计算机视觉动作识别——YOWO用于实时时空动作定位与识别的算法解析

摘要 时空动作定位要求将两种信息源整合到设计的架构中:(1) 来自先前帧的时间信息和(2) 来自关键帧的空间信息。当前的最先进方法通常使用单独的网络提取这些信息,并使用额外的机制进行融合以获得检测结果。YOWO是一个用于视频流中实时时空动作定位的统…

宏集eX700M系列HMI实现港口设备数据上云

前言 随着港口设备信息化技术的快速发展,越来越多的企业想要把现场设备数据上传到云平台,进而实现关键数据的远程监控和分析处理。在此背景下,国内某信息化公司想要将港口设备数据通过MQTT上传到该公司自研IOT平台,实现数据上云&…

vue-treeselect 的基本使用

vue-treeselect 的基本使用 1. 效果展示2. 安装 插件3. 引入组件4. 代码 1. 效果展示 2. 安装 插件 vue-treeselect是一个树形的下拉菜单,至于到底有多少节点那就要看你的数据源有多少层了,挺方便的。下面这个这个不用多说吧,下载依赖 npm in…

中兴通讯AI全场景终端新品 赋能行业数智化升级发布 (2)

2024年4月11日,南京,在2024年中兴通讯云网生态峰会召开之际,中兴行业终端合作伙伴大会暨春季新品发布会也同期举行。本次大会主题为“强基拓新,价值创造”,中兴行业终端持续践行合作伙伴优先、深度定制更安全更高效的解…

揭秘ebay、亚马逊测评系统:从稳定环境搭建到防关联技术

在亚马逊、ebay平台上进行自养号测评、L ka等活动,首要问题是确保环境的安全性和稳定性。一个稳定的环境是进行测评的基础,如果无法解决安全性问题,那么从事这些项目就不值得。我们在环境技术研发领域已经有8年的经验,在早期测试了…

连连看游戏页面网站源码,直接使用

可以上传自己喜欢的图片 游戏页面 通关页面 源码免费下载地址抄笔记 (chaobiji.cn)

信号分解 | VMD(变分模态分解)-Matlab

分解效果 VMD(变分模态分解) 变分模态分解(Variational Mode Decomposition,VMD)是一种信号分解方法,用于将非平稳信号分解为一组模态函数。VMD是一种自适应的数据驱动方法,可以有效地处理具有非线性和非平稳特性的信号。 VMD的基本思想是通过迭代优化过程,将原始信号分…

4.16学习总结

MySQL数据库学习(一) 一.MySQL数据库的基本知识 (一).数据库 概念:数据仓库,软件,安装在操作系统之上 作用:存储数据,管理数据 (二).数据库的分类 关系型数据库:SQL(Structured Query Language) MySQL…

创建k8s deploy yaml文件的imagePullSecrets语句

镜像仓库是harbor kubectl create secret docker-registry key --docker-server192.168.0.190 --docker-usernameadmin --docker-passwordHarbor12345

Fluke ADPT连接器(隔离版)----发布1

代替手工记录、记录后在整理的麻烦,轻点鼠标(单次采集、自动时间间隔采集自由选择)即可完成,测试数据导出图片、导出数据到EXCEL文件随意选择; 所需设备: 1、Fluke ADPT连接器;内附链接 主要…

docker网路和主机通讯问题

#注 1,安装docker和启动容器服务的时候如果防火墙处于开启状态,那么重启docker里面的容器的时候必须开启防火墙,否则会出现iptable错误; 2,linux开启防火墙会导致主机和docker网络之间单向通讯,主机可以访…

Ubuntu 部署ChatGLM3大语言模型

Ubuntu 部署ChatGLM3大语言模型 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。 源码:https://github.com/THUDM/ChatGLM3 部署步骤 1.服务器配置 Ubuntu 20.04 8核(vCPU) 32GiB 5Mbps GPU NVIDIA T4 16GB 硬盘 100GiB CUDA 版本 12.2.2/…

专业143总分428学硕第一东南大学920专业基础综合考研经验电子信息与通信工程,海洋工程,电路系统,鲁汶,真题,大纲,参考书。

24考研基本已经尘埃落定,总归要为回忆留下点什么。回想起这一年的备考之路,至今仍觉得时间过得很快,有些感到恍惚,似乎不能接受。但是仔细思考一下,这一年经历了很多,走过很多弯路也取得一些阶段性的小成功…

Hive-Sql复杂面试题

参考链接:hive sql面试题及答案 - 知乎 有哪些好的题目都可以给我哦 我来汇总到一起 1、编写sql实现每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数 数据: userid,month,visits A,2015-01,5 A,2015-01,15 B,2015-01,5 A,2015-01,…

独角数卡发卡系统源码hyper模版首页产品列表添加库存数量显示的方法

默认的独角数卡hyper模版商品列表只显示标题和价格,没有显示库存数量 如图: 对于买家来说,无法通过首页快捷的知道某事产品的库存数量 故此在此列出显示库存数量的修改方法。 首先找到根目录下文件/resources/views/hyper/static_pages/ho…

Servlet-Filter实现反爬虫

以前用DotNetCore实现过反爬虫功能。在tomcat里面可以利用Servlet的Filter类实现请求的控制来达到反爬虫功能,进而增强JRT的web安全。 实现黑名单过滤器,对在黑名单列表的IP的所有请求都跳转到警告页面,业务各种请求自行定义加入黑名单 /* …

Vanna-ai 大模型开源项目 基于RAG的TextToSql框架 安装和使用教程

github项目地址:vanna-ai/vanna: 🤖 与 SQL 数据库聊天📊。通过 LLMs使用RAG进行准确的TextToSQL的生成工作 🔄 。 Vanna 是 MIT 许可的开源 Python RAG(检索增强生成)框架,用于 SQL 生成和相关…

逻辑回归模型-逻辑回归算法原理-逻辑回归代码与实现-笔记整合

通过一段时间的学习,总算把逻辑回归模型弄清楚了 《老饼讲解-机器学习》www.bbbdata.com中是讲得最清晰的,结合其它资料,整理一个完整的笔记如下,希望能帮助像我这样入门的新人,快速理解逻辑回归算法原理和逻辑回归实…
最新文章