首页 > 编程语言 >2024最全java面试题整理(持续更新)

2024最全java面试题整理(持续更新)

时间:2024-05-27 19:31:17浏览次数:16  
标签:面试题 java 数据库 sql 事务 查询 2024 SQL 数据

1. springboot项目和maven项目的区别?

(1)打包方式:传统项目如果需要打成war包,需要在WEB-INF目录结构配置web.xml文件;springboot则不需要
(2)项目启动方式:
传统web项目启动方式:在eclipse和tomcat插件中导入项目,然后启动tomcat,项目也启动了。或者将项目打成war包,放入tomcat中,启动tomcat。
采用springboot项目启动:如下图所示,打开HelloWorldApplication.java(这个类每个项目都有,类名自定),这是一个带有main方法的类,点击main方法,右键run as -java application。
(3)配置文件的区别:
二者的配置文件都是放在src/main/resources下面
传统项目:配置文件较多,必须包含applicationContext.xml这个核心配置文件
采用springboot项目:配置文件较少,相比传统项目,可以说配置文件极少,必须包含application.properties(或者是application.yml)这个配置文件

篇幅限制下面就只能给大家展示小册部分内容了。包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套资料及答案的【点击此处即可,免费获取】 备注:“CSDN”

2. spring mvc 工作流程

1、首先用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;
2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);
3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;
4、前端控制器再次收回控制权,将响应返回给用户。
在这里插入图片描述

3. 请简述一下IO流?

IO流用来处理设备之间的数据传输,Java程序中,对于数据的输入/输出操作 都是以“流”的方式进行的。java.io包下提供了各种“流”类的接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

对于计算机来说,数据都是以二进制形式读出或写入的。我们可以把文件想象为一个桶,我们可以通过管道将桶里的水抽出来。这里的管道也就相当于Java中的流。流的本质是一种有序的数据集合,有数据源和目的地。
在这里插入图片描述
输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输出:将程序(内存)数据输出到磁盘、光盘等存储设备中。

流的分类
按照流的方向(输出输入都是站在程序所在内存的角度划分的)
输入流:只能从中读数据
输出流:只能向文件中写数据

在这里插入图片描述
字节流:将数据解释为原始的二进制数据 ,读写均为字节数据,二进制数据不需要编码和解码,比文本Io效率更高,可移植(与主句编码方式无关)

字符流:将数据解释为字符数据,字符流将原始数据解析成一种字符,文本数据存储 依赖文件编码方式,它输入输出需要编码解码。

 需要全套资料及答案的【点击此处即可】 备注:“免费领资料”

4. 关系型数据库和非关系型数据库?

关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
当今十大主流的关系型数据库 Oracle,Microsoft SQL Server,MySQL,PostgreSQL,DB2, Microsoft Access, SQLite,Teradata,MariaDB(MySQL的一个分支),SAP

优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。

缺点:
1、读写性能较差,尤其是海量数据的高效率读写;
2、硬盘I/O要求高:网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
3、拓展困难
4、性能欠佳:在关系型数据库中,导致性能欠佳的最主要原因是多表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询。为了保证数据库的ACID特性(原子性、一致性、隔离性、持久性),必须尽量按照其要求的范式进行设计,关系型数据库中的表都是存储一个格式化的数据结构。

非关系型数据库指非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、查询便捷:可以根据需要去添加自己需要的字段,为了获取用户的不同信息,不像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。
3、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
4、高扩展性:Nosql基于键值对,数据之间没有耦合性,所以非常容易水平扩展。关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
5、成本低:nosql数据库部署简单,基本都是开源软件。

缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、只适合存储一些较为简单的数据,对于需要进行较复杂查询的数据,关系型数据库显的更为合适。
4、不适合持久存储海量数据

常见的非关系型数据库有redis,mongdb,Hbase。

5. MySQL数据库

优化SQL

  1. 选择正确的存储引擎。
    每个引擎都有利有弊,比如MyISAM,适用于大量查询,对大量写操作并不是很好,update一个字段都会把整个表锁起来,而Innodb,对一些小的应用,它比MyISAM慢,但它支持行锁,再写操作的时候,很优秀,它还支持更多的高级应用。
  2. 优化字段的数据类型
    一个原则,越小的越快,如果一个表只有几列,那我们就不用用INT来做主键,可以使用MEDIUMINTSMALLINT或是更小的TINYINT会更经济一些,如果不需要记录时间,使用DATE要比DATETIME好的多,也要留够足够的空间进行扩展。
  3. 为搜索字段添加索引
    索引不一定只添加给主键或唯一的字段,如果在表中有某个字段经常用来做搜索,那就为它建立索引,如果要搜索的字段是大的文本字段,那应该为它建立全文索引。
  4. 避免使用select *因为从数据库读出的数据越多,那么查询就会越慢。如果数据库服务和WEB服务器在不同的机器上的话,还会增加网络传输的负载。即使要查询表的所有字段,也尽量不要用*通配符。
  5. 使用ENUM而不是VARCHAR
    ENUM类型是非常快和紧凑的,它保存的是TINYINT,但外表上显示的是字符串,做一些选项列表很好,比如:性别,民族,部门,状态之类的字段,取值有限而且固定。
  6. 尽可能使用NOT NULL
    NULL其实也需要额外空间的,在进行比较的时候,程序也会变得复杂,并不是并不可以用NULL,在现实的复杂情况下,依然会有些情况需要使用NULL值。
  7. 固定长度的表会更快
    如果表中的所有字段都是固定长度的,那整个表会被认为是“static”或“fixed-lenght”。例如表中没有VARCHARTEXTBLOB,只要表中其中一个字段是这些类型,那么这个表就不是“固定长度静态表”了,这样的话MySQL引擎会用另一种方法来处理。
    固定长度的表也容易被缓存和重建,唯一的副作用就是,固定长度的字段会浪费一些空间,因为固定长度的字段无论用不用,都会分配那么多的空间。

 需要全套资料及答案的【点击此处即可】 备注:“免费领资料”

为什么要避免使用join查询
减少消耗。

对于大流量网站,如何解决各页面统计访问量问题

  1. 确认服务器是否能支撑当前访问量
  2. 优化数据库访问
  3. 禁止外部访问,如图片盗链
  4. 控制文件下载
  5. 使用不同主机进行分流
  6. 使用浏览统计软件,了解访问量,有针对性的进行优化

SQL注入的主要特点

  1. 变种极多,攻击简单,危害极大。
  2. 未经授权操作数据库的数据。
  3. 恶意篡改网页。
  4. 网页挂木马。
  5. 私自添加系统账号或是数据库使用者账号。

优化数据库的方法

  1. 选取最适合的字段属性,尽可能减少定义字段宽度,尽量把字段设成NOT NULL
  2. 使用exists替代in,用not exists替代not in
  3. 使用连接(JOIN)来替代子查询。
  4. 适用联合(NUION)来代替手动创建的临时表。
  5. 事务处理。
  6. 锁定表,优化事务处理。
  7. 适当用外键,优化锁定表。
  8. 建立索引。
  9. 优化查询语句。

数据库中的事务是什么

事务作为一个单元的一组有序的数据操作,如果组中的所有操作都完成,则认定事务成功,即使只有一个失败,事务也不成功。如果所有操作完成,事务则进行提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有的操作的影响都会取消。

  • ACID四大特性
  • 原子性:不可分割,事务要么全部被执行,要么全部不执行。
  • 一致性:事务的执行使得数据库从一种正确的状态转换成另一种正确的状态。
  • 隔离性:在事务正确提交前,不允许把该事务对数据的任何改变提供给任何其他事务。
  • 持久性:事务正确提交后,将结果永久保存到数据库中,即使在事务提交后,有了其他故障,事务处理结果也会得到保存。

索引的目的是什么

  1. 快速访问数据表中特定信息,提高检索速度。
  2. 创建唯一性索引,保证每一行数据的唯一性。
  3. 加速表和表之间的连接。
  4. 使用分组和排序子句进行数据检索时,可显著的减少分组和排序的时间。

需要全套资料及答案的在【翻到文章底部,点击名片】即可免费获取 备注:“CSDN”

对SQL语句的优化方法

  1. 避免在索引列上使用计算。
  2. 避免在索引列上使用IS NULLIS NOT NULL
  3. 对查询进行优化,尽量避免全表扫描,首先因该考虑在whereorder by涉及的列上建立索引。
  4. 避免在where子句对字段进行null值判断,这件导致引擎放弃使用索引而进行全表扫描。
  5. 避免在where子句中对字段进行表达式操作,也会导致引擎放弃使用索引而进行全表扫描。

char和varchar的区别

  • char类型的数据列里,每个值都占M个字节,如果长度小于M`,就会在它的右边用空格字符进行补足(在检索操作中填补出来的空格符将会被去掉)。
  • vachar类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录长度的字节,所以总长度为L+1字节。

SQL问题

  • 脏读

  • 在一个事务处理过程中读取到了另一个未提交事务中的数据。

【例子】

A在一个转账事务中,转了100给B,此时B读到了这个转账的数据,然后做了一些操作(给A发货,或是其他),可是这个时候A的事务并没有提交,如果A回滚了事务,那这就是脏读。

  • 不可重复读

  • 对数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,是由于在查询间隔,被另一个事务修改并提交了。

【示例】

事务A在读取某一数据,而事务B立马修改了这个数据并且提交了事务到数据库,事务A再次读取就得到了不同的结果。发生了不重复读。

  • 幻读

  • 事务非独立执行时发生的一种现象。

【示例】

事务A对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务B又对这个表中插入了一行数据项,这个数据的数值还是“1”并且提给了数据库,如果事务A查看刚刚修改的数据,会发现还有一数据没有修改,而这行数据时事务B中添加的,就像产生的幻觉一样。发生了幻读。

MySQL事务隔离级别

  1. read uncmmited:读到未提交数据
  • 最低级别,无法保证任情况
  1. read commited:读已提交
  • 可避免脏读
  1. repeatable read:可重复读
  • 可避免脏读、不可重复读
  1. serializable:串行事务
  • 可避免脏读、不可重复读、幻读

 需要全套资料及答案的【点击此处即可】​编辑https://bbs.csdn.net/topics/618656674备注:“免费领资料”

MySQL默认事务隔离级别为Repeatable Read(可重复读)】

MySQL临时表

什么是临时表:临时表是MySQL用于存储中间结果集的表,临时表只在当前连接可看,当连接关闭时会自动删除表并释放所有空间。

为什么会产生临时表:一般是因为复杂的SQL导致临时表被大量创建

6. MyBatis?

简介
MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

JDBC开发存在的问题
频繁创建数据库连接对象、释放,容易造成系统资源浪费,影响系统性能。可以使用连接池解决这个问题。但是使用jdbc需要自己实现连接池。
sql语句定义、参数设置、结果集处理存在硬编码。实际项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。
使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
结果集处理存在重复代码,处理麻烦。如果可以映射成Java对象会比较方便。

JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

解决:在mybatis-config.xml中配置数据链接池,使用连接池管理数据库连接。

2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决: Mybatis自动将java对象映射至sql语句。

4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

解决:Mybatis自动将sql执行结果映射至java对象。

Mybatis优缺点

优点:
与传统的数据库访问技术相比,ORM有以下优点:

基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用
与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接
很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)
提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护
能够与Spring很好的集成

 需要全套资料及答案的【点击此处即可】 备注:“免费领资料”

缺点:
SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

MyBatis编程步骤是什么样的?
1、 创建SqlSessionFactory

2、 通过SqlSessionFactory创建SqlSession

3、 通过sqlsession执行数据库操作

4、 调用session.commit()提交事务

5、 调用session.close()关闭会话

标签:面试题,java,数据库,sql,事务,查询,2024,SQL,数据
From: https://blog.csdn.net/BASK2311/article/details/139245892

相关文章

  • Java数组
    1、数组概述数组是相同类型数据的有序集合。数组描述的是相容类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。数组下标是从0开始的。2、数组声明创建首先必须声明数组变量,才能在程序中使用......
  • android studio2024最新详解(完全小白)安装-运行第一个程序
    前面我用2023最新版本的,死活就卡在引入依赖那里卡了两天,俺的崩溃谁知啊!! 后面我就换了个思维,看着网上大多的教程都是基于2022或者2020的,我就找了个看起来非常详细的视频,里面的是2020的,所以我就下载了2020。  有点小伙伴可能会找不到androidstudio的过往版本,这里我就直......
  • 实验六 Java流式编程与网络程序设计
    第1关字节输入/输出流实现数据的保存和读取packagestep1;importjava.io.*;importjava.util.*;publicclassSortArray{ publicstaticvoidmain(String[]args){/**********Begin**********/ //创建保存整型数据的数组(数组大小10)int[]da......
  • 郑州2024-ccpc-赛后总结-wh
    今年真的很可惜,就差1个罚时拿全国邀请银,省赛金。比较惋惜刚开始第一发,找到签到题太快了,忘写输入了直接wa1发,随后Fac,其次开始写J,J是我的问题,刚开始想5位全排列结果T了,然后发现性质结果一直卡endl,WA了4发(导致没拿邀请银,真的很可惜),随后Jac,然后wmh4分钟切出来了M,然后一起写B,我刚开始......
  • 【会议征稿,SPIE独立出版】第五届计算机视觉和数据挖掘国际学术会议(ICCVDM 2024)
    第五届计算机视觉与数据挖掘国际学术会议(ICCVDM2024)将于2024年7月19-21日在中国长春举行。此前,ICCVDM系列会议于2020年在中国西安、2021年在中国长沙(线上)、2022年在中国呼伦贝尔(线上+线下)、2023年在中国长春(线上+线下)皆已成功举办。ICCVDM为世界各地该领域的专家、学者、......
  • ubuntu java版本间切换
    今天在编译rk3288安卓5.1时出错,提示需要java1.7.x版本的jdk,而我的ubuntu默认已经安装了java 1.8.0_362版本,下面介绍下我是如何进行java版本切换的。1.从官网上下载得到java 1.7.0_80压缩包(找个QQ邮箱注册账号后就可以直接下载了)https://www.oracle.com/java/technol......
  • java泛型
    java泛型本人自建博客添砖java文章目录java泛型基本理解语法经典案例自定义泛型类自定义泛型接口自定义泛型方法泛型的继承和通配符通配符基本理解基本理解:就像类是对对象的抽象,泛型就是对类型的抽象,其作用类似于c++的模板语法泛型的声明:interface接......
  • 赶紧收藏!2024 年最常见 20道 Redis面试题(九)
    上一篇地址:赶紧收藏!2024年最常见20道Redis面试题(八)-CSDN博客十七、如何使用Redis做异步队列?使用Redis作为异步队列主要依赖于Redis的列表(list)数据结构,列表提供了原子的推入(push)和弹出(pop)操作,这使得它非常适合实现队列。以下是使用Redis实现异步队列的步骤:准备Red......
  • CVPR 2024 | 谷歌提出OmniGlue:特征匹配新工作
    前言 第一个以「泛化」能力为核心设计原则的可学习图像匹配器来了!欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。本文转载自机器之心仅用于学术分享,若侵权请联系删除CV方向的准研究生们,未来三年如何度过?招聘高光谱图像、语......
  • 京麒CTF2024-Ezjvav
    admin/admin弱密码登录,扫网页发现/js/manage.js,访问得到js混淆代码,直接gpt梭:window.onload=function(){  fetch('/source')    .then(response=>response.json())    .then(data=>{      console.log(data);    })  ......