Java面试八股文合集(持续更新)

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()关闭会话

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java面试八股文是指在准备Java面试时需要重点掌握的一些核心知识和常见问题。下载Java面试八股文是为了将这些知识和问题整理成一份文档,方便学习和准备。这份文档通常包含Java基础知识、Java集合框架、多线程、IO流、数据库、设计模式、网络编程等各个方面的问题和答案。 Java面试八股文的下载对于准备面试的候选人来说非常重要。因为Java面试的问题种类繁多,面试官可能会选择任意一个方面进行提问。同时,面试官一般会倾向于问一些经典的问题,以便评估候选人对于基础和核心知识的掌握程度。如果候选人能够提前下载并学习这份八股文,不仅可以提高回答问题的准确性和流利度,还能够帮助候选人在面试中更好地展示自己的能力和优势。 当然,光有Java面试八股文还远远不够,候选人还需要结合自己在实际项目中的经验、对于面试岗位的理解以及对于技术的持续学习来进行综合准备。另外,面试本身也不是仅仅靠死记硬背答题,更重要的是能够准确理解问题的本质,提出合理的解决思路和方案,并能够清晰地表达自己的观点和思考过程。 总的来说,下载Java面试八股文是为了提高面试准备的效率和质量,但准备八股文只是面试准备的一部分,更重要的是掌握基础知识、理解问题本质,发展自己的解决问题的能力。希望以上回答对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值