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.mzph.cn/news/822425.shtml

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

相关文章

hover时预览切换,点击后才正式切换

1、使用CSS的:hover伪类 虽然这不是通过JavaScript或jQuery直接绑定事件,但CSS的:hover伪类可以用来改变元素在鼠标移入和移出时的样式。这种方法主要用于视觉效果的改变,而不是执行复杂的JavaScript逻辑。 #myElement:hover { /* 当鼠标悬停在#myEleme…

【学习笔记】Python大数据处理与分析——pandas数据分析

一、pandas中的对象 1、Series对象 由两个相互关联的数组(values, index)组成,前者(又称主数组)存储数据,后者存储values内每个元素对应关联的标签。 import numpy as np import pandas as pds1 pd.Series([1, 3, 5, 7])print(…

js如何設置滾動到元素位置

在JavaScript中,你可以使用window.scrollTo()方法或元素的scrollIntoView()方法来设置滚动位置。这些方法允许你将页面滚动到特定的坐标或元素。 使用 window.scrollTo() window.scrollTo() 方法接受两个参数:x坐标和y坐标,分别代表水平滚动…

pyqt的人脸识别 基于face_recognition库

参考文献: 1、python face_recognition实现人脸识别系统_python facerecognition检测人脸-CSDN博客 2、cv2.VideoCapture()_cv2.videocapture(0)-CSDN博客 1、camera.py文件代码如下;目录如下 import sys from PyQt5.QtWidgets import QApplication, …

JS两个按钮水平排列

要使两个按钮在水平方向上对半铺满&#xff0c;你可以使用CSS中的Flexbox布局或Grid布局。下面是使用Flexbox和Grid分别实现的示例代码&#xff1a; Flexbox布局&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF…

NineData正式将SQL开发正式升级为数据库DevOps

NineData SQL 开发早期主要提供 SQL 窗口&#xff08;IDE&#xff09;功能&#xff0c;产品经过将近两年时间的打磨&#xff0c;新增了大量的企业级功能&#xff0c;时至今日已经服务了上万开发者&#xff0c;覆盖了数据库设计、开发、测试、变更等生命周期的功能。 为了让企业…

深入理解数据结构第五弹——排序(2)——快速排序

排序&#xff08;1&#xff09;&#xff1a;深入了解数据结构第四弹——排序&#xff08;1&#xff09;——插入排序和希尔排序-CSDN博客 前言&#xff1a; 在前面我们已经讲过了几种排序方式&#xff0c;他们的效率有快有慢&#xff0c;今天我们来学习一种非常高效的排序方式…

笔记本电脑上的聊天机器人: 在英特尔 Meteor Lake 上运行 Phi-2

对应于其强大的能力&#xff0c;大语言模型 (LLM) 需要强大的算力支撑&#xff0c;而个人计算机上很难满足这一需求。因此&#xff0c;我们别无选择&#xff0c;只能将它们部署至由本地或云端托管的性能强大的定制 AI 服务器上。 为何需要将 LLM 推理本地化 如果我们可以在典配…

Hudi 表支持多种查询引擎对比

Hudi 表支持多种查询引擎对比 Apache Hudi有两种主要的表类型&#xff0c;分别是Copy on Write&#xff08;COW&#xff09;表和Merge on Read&#xff08;MOR&#xff09;表。 Copy on Write&#xff08;COW&#xff09;表&#xff1a; 特点&#xff1a;COW表在写入新数据时会…

windows下使用nginx设置静态资源路由

1、下载nginx http://nginx.org/en/download.html 下载稳定版本&#xff0c;以nginx/Windows-1.24.0为例&#xff0c;下载后解压&#xff0c;解压后如下&#xff1a; 2、启动nginx 打开cmd命令窗口&#xff0c;切换到nginx解压目录下&#xff1a; start nginx # 启动nginx服务…

OpenWrt 多拨负载均衡不起作用

检查 负载均衡->规则->Https->粘滞模式 是否启动&#xff0c;设置为 否 如果设置为是&#xff0c;那么根据官方描述&#xff1a; 来自相同源 IP 的流量&#xff0c;如果已经匹配过此规则并且在粘滞超时时间内&#xff0c;将会使用相同的 WAN 接口 意思就是如果你同一个…

实验六 智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 请完成创建图片库应用&#xff0c;显示一系列预设的图片。 提供按钮来切换显示不同类别的图片。 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; 1.WXML <view> <button bindtap"showAll">所有图片</but…

小程序视频怎么保存到mp4

小程序上的视频如何下载成mp4&#xff0c;本文就将教大家如何将小程序视频保存到mp4&#xff0c;这里要用到一个工具:下载高手 下载高手的文件我已经打包好了 下载高手链接&#xff1a;https://pan.baidu.com/s/1qJ81sNBzzzU0w6DWf-9Nxw?pwdl09r 提取码&#xff1a;l09r -…

多线程学习

1.同步代码块&#xff0c;同步方法 同步代码块 代码块又称为初始化块&#xff0c;属于类中的成员[即是类的一部分]&#xff0c;类似于方法&#xff0c;将逻辑语句分装在方法体中&#xff0c;通过{}包围起来。 和方法不同&#xff0c;没有方法名&#xff0c;没有返回&#xff…

PHP反序列化命令执行+PHP反序列化POP大链 +PHP反序列化基础

[题目信息]&#xff1a; 题目名称题目难度PHP反序列化命令执行1 [题目考点]&#xff1a; 反序列化命令执行&#xff0c;获取题目flag。[Flag格式]: SangFor{t5euvZ_OB8Jd_h2-}[环境部署]&#xff1a; docker-compose.yml文件或者docker tar原始文件。 docker-compose up …

DataGrip2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 DataGrip是由JetBrains公司开发的一款强大的关系数据库集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为数据库开发人员和数据库管理员设计。它提供了一个统一的界面&#xff0c;用于管理和开发各种关系型数据库&#x…

用于半监督的图扩散网络 笔记

1 Title Graph Neural Diffusion Networks for Semi-supervised Learning&#xff08;Wei Ye, Zexi Huang, Yunqi Hong, and Ambuj Singh&#xff09;【2022】 2 Conclusion This paper proposes a new graph neural network called GND-Nets (for Graph Neural Diffu…

计算股价波动率python

上述图片上传gemini&#xff0c;提问&#xff1a;转换为python代码 好的&#xff0c;以下是您发送的图像中公式的 Python 代码&#xff1a; python def stock_volatility(prices, opening_prices, N): """ 计算股票价格的波动率。 参数&#xff1a; p…

vscode如何方便地添加todo和管理todo

如果想在vscode中更加方便的添加和管理TODO标签&#xff0c;比如添加高亮提醒和查看哪里有TODO标签等&#xff0c;就可以通过安装插件快速实现。 安装插件 VSCode关于TODO使用人数最多的插件是TODO Height和Todo Tree 按住 CtrlShiftX按键进入应用扩展商店&#xff0c;输入to…

getOutputStream() has already been called for this response

问题描述 在做java导出Excel数据的时候&#xff0c;接口层面需要有HttpServletResponse的入参来设置输出流 然后执行的时候报getOutputStream() has already been called for this response错误 问题排查 返回的错误信息 {"timestamp": "2024-04-16T11:49:…