Java面试题---第二阶段

本文详细探讨了Java面试中常见的数据库相关问题,包括MySQL的三大范式、事务隔离级别、连接查询类型,以及索引的概念与优化。此外,还涵盖了Web技术如HTTP的get/post方法、Servlet与JSP的区别、会话跟踪的不同方法,以及Ajax的应用。通过这些知识点,帮助求职者准备Java面试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MySQL的三大范式?

第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。 第二范式:要求非主属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。 第三范式:任何非主属性不依赖于其它非主属性。

2.MySQL中group by和having的作用?

group by 是分组,having是过滤,一般是一起使用,,表示分组之后再过滤。

3.MySQL的内连接和外连接的区别?

  • 内连接:取出连接表中匹配到的数据,匹配不到的不保留

  • 外连接:取出连接表中匹配到的数据,匹配不到的也会保留,其值为NULL

4.说一下数据库的事务隔离?

读未提交,最低隔离级别、可以读取到其他事务未提交的数据。(会出现幻读、脏读、不可重复读)。 读已提交,一个事务只能读取到其他事务提交后的数据。(会造成幻读、不可重复读)。 可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,(会造成幻读)。mysql默认级别是可重复读,orecle的默认级别是读已提交。 序列化,代价最高最可靠的隔离级别,效率最低。该隔离级别能防止脏读、不可重复读、幻读。

事务并发问题:

更新丢失:两事务同时对同一数据进行修改,后面的事务会覆盖前面事务的修改。

脏读 :表示一个事务能够读取另一个事务中还未提交的数据。

不可重复读 :是指在一个事务内,多次读同一数据,第二次和第一次读取到的数据不一致。(修改,删除)

幻读 :事务a在事务中读取2次数据,第二次读取到的数据与第一次不一致。(新增)

5.get和post方法的区别?

get在浏览器回退时是无害的,但是post会再次提交请求。 get请求会被浏览器主动缓存,但是post不会,除非手动设置。 get请求只能进行URL编码,但是post支持多种编码方式。 get请求的参数会保存在浏览器的历史记录中。 get请求在URL中传送的参数是有长度限制的,但是post没有。 get比post更加不安全,因为传送的参数直接暴露在URL上,所以不能来传送敏感信息。 get参数通过URL传送,但是post是放在request body里面的。

6.forward 和 redirect 的区别?

Forward和Redirect代表了两种请求转发方式:转发和重定向。

forward是服务器内部,redirect服务器外部。

转发是一个请求,重定向会发起2个请求。

forward性能高。

转发地址栏不会发生改变,重定向地址栏会发生改变。

转发可以获取到request作用域中的数据,而重定向不行,因为重定向发起了2次请求。

7.索引的数据结构是什么?

B+Tree,类似B-Tree,区别是:把实际数据都放在叶子节点中,减少了每个节点数据大小,每层可以放更多节点,树高度就降低了

查找效率更高,索引默认使用B+Tree。

8.MySQL的存储引擎有哪些?

InnoDB 引擎:支持事务,解决并发量的问题,支持表锁和行锁,支持外键,不支持全文索引,支持数据恢复。查询性能略低。

MyIASM 引擎:查询性能高,支持表锁,支持保存行数,支持全文索引。

9.MySQL的优化有哪些方法?

架构方面:使用分库分表解决表中的数据量大。使用mysql集群,主从复制,读写分离,解决并发量大。

设计方面:表的设计按具体情况范式和反范式结合使用,选择合适的存储引擎。

使用方面:使用索引,使用redis缓存,还有使用连接池。分页查询。

查询优化:使用explain查询执行计划。避免使用select*, 尽量避免where中使用or,union 代替,尽量避免模糊查询时,通配符在前面。尽量避免where中列避免使用函数和表达式 。

10.MySQL的索引是什么,有什么作用?索引的优缺点?什么时候适合建索引?

是一种数据,保存实际的数据的位置。

加快查询速度,MySQL查询时,先找索引,通过索引找到实际数据的位置,再直接定位到实际数据上。

优点:

极大提高查询速度

缺点:

1. 也是数据,需要占存储空间

  1. 降低增删改的速度

  2. 创建索引也需要一定的时间

    适合建索引的情况:

    1.表里面数据特别多

    2.建索引的列不能存在大量的重复,如:性别

    3.建索引的列不能频繁进行修改

    4.建索引的列不能存在大量的null值

    5.列经常用于做查询的条件或排序

11.jsp 和 servlet 有什么区别?

jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类) jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。 Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。 Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

12.jsp 有哪些内置对象?作用分别是什么?

request:封装客户端的请求,其中包含来自GET或POST请求的参数; response:封装服务器对客户端的响应; pageContext:通过该对象可以获取其他对象; session:封装用户会话的对象; application:封装服务器运行环境的对象; out:输出服务器响应的输出流对象; config:Web应用的配置对象; page:JSP页面本身(相当于Java程序中的this); exception:封装页面抛出异常的对象。

13.说一下 jsp 的 4 种作用域?

page作用在jsp界面,在当前页面内有效。 request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。作用在当前请求范围内。 session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。作用在整个会话。 application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。作用在整个项目中。

14.session 和 cookie 有什么区别?

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

15.说一下 session 的工作原理?

其实session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的map吧,里面的键存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了。

当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个SESSION,在创建这SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSIONID,如果包含了一个SESSION ID则说明之前该用户已经登陆过并为此用户创建过SESSION,那服务器就按照这个SESSION ID把这个SESSION在服务器的内存中查找出来,如果客户端请求里不包含有SESSION ID,则为该客户端创建一个SESSION并生成一个SESSION相关的SESSION ID。这个SESSION ID是唯一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存,而保存这个SESSION ID的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。

16.Servlet的生命周期?

servlet的生命周期顾名思义就是从servlet出现到消亡(销毁)的全过程。

主要分为以下几个阶段: 加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求响应(服务阶段)—>销毁

init()初始化阶段

service()处理客户端请求阶段

destroy()终止阶段

第一次访问该servlet时,servlet会调用构造方法创建出对象,然后调用init方法进行初始化操作。

在访问servlet时,会调用service方法来处理请求。

在tomcat停止时,会调用destory方法销毁servlet。

17.会话跟踪的几种方法?

将上一次的请求中的数据传递给下一次请求。

URL重写,隐藏表单域,cookie,sesion。

URL重写技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务端进行识别不同的用户。

隐藏表单域:将会话ID添加到HTML表单元素中提交到服务器,此表单不再客户端显示。

cookie,Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。

session:

在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户 ,

Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效

18.什么是Ajax,有什么作用,实现方式?

Ajax是一种使用现有技术集合,技术内容包括: HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。 作用:用于浏览器与服务器之间使用异步数据传输(HTTP 请求),做到局部请求以实现局部刷新。不刷新页面去更新页面内容。

实现方式:

原生js实现ajax

jquery实现ajax

axios实现ajax

19.SQL的连接查询有几种方式?

1、内连接。

2、外连接分为左外连接、右外连接和全外连接三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

20.索引的分类?失效的情况有哪些?

按使用效果分为:

  • 普通索引 没有约束效果

  • 主键索引 不能重复、不能为空、表中只能有一个

  • 唯一索引 不能重复

  • 全文索引 用于text长文本类型文字的搜索

  • 组合索引 在多个列建索引

按结构分为:

  • 聚簇索引

    索引键的顺序和实际数据的顺序一致,一个表只能有一个

    如:新华字典的拼音目录

  • 非聚簇索引

    索引键的顺序和实际数据的顺序不一致,一个表有多个

    如:字典的偏旁部首目录

    索引失效的情况:

    1. 使用or关键字

    2. 模糊查询时,把%放前面,如: like '%张'

    3. 将列放到函数中 如:SUBSTR(stu_name,1) = '三'

    4. 将列放到表达式,如:age + 2 = 20

    5. 组合索引,查询时没有包含第一列 (最左前缀原则:把最重要列放最左边)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值