【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(二)

简介: 【前言】别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 ……   【下载】个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员。想要word完整版下载的,评论里留言留下你的邮箱! 16.请写出hibernate中主键生成策略? 答:①incr

【前言】别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 ……  

【下载】个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员想要word完整版下载的,评论里留言留下你的邮箱!

16.请写出hibernate中主键生成策略?

答:increment:适用于short,int,long作为主键.不是使用的数据库自动增长机制。

* Hibernate中提供的一种增长机制;

* 先进行查询:select max(id) from user

* 再进行插入:获得最大值+1作为新的记录的主键;

* 问题:不能在集群环境下或者有并发访问的情况下使用;

identity:适用于short,int,long作为主键。必须使用底层带有自动增长机制的数据库。

* 底层使用的是数据库的自动增长(auto_increment).Oracle数据库没有自动增长;

sequence:适用于short,int,long作为主键.底层使用的是序列的增长方式。

* Oracle数据库底层没有自动增长,想自动增长需要使用序列;

uuid:适用于char,varchar类型的作为主键.

* 使用随机的字符串作为主键;

native:本地策略.根据底层的数据库不同,自动选择适用于该种数据库的生成策略.(short,int,long)

* 如果底层使用的MySQL数据库:相当于identity

* 如果底层使用Oracle数据库:相当于sequence

assigned:主键的生成不用Hibernate管理了.必须手动设置主键。

17.具有相同名称的一组值,struts2如何实现封装

答:①对于String类型,Struts2会采用“, ”方法进行字符串连接。

如:23ad, 43e4, 65ds.....

解决:  String ids[] = model.getId().split(", ");

//调用业务方法,实现批量删除

deptService.delete(Dept.class, ids);

②对于Integer,Float,Date类型,Struts2默认接收的是最后一个值;

如:客户端给id传了三个值,id=3id=4id=5....服务器只能接受最后一个值,就是id=5

解决:private List<Integer> ids;//生成它的gettersetter

18.阐述实体对象的三种状态以及转换关系?

答:Hibernate中对象有三种状态:

瞬时态(transient):没有持久化标识OID,没有被纳入到Session对象的管理;

持久态(persistent):有持久化标识OID,已经被纳入到Session对象的管理;

游离态(detached)有持久化标识OID,没有被纳入到Session对象的管理;

 

注意:处在持久态的对象,有自动更新数据库的能力。尤其快照机制引起的:

19.简述Hibernate中快照机制的原理?

 

20.简述Hibernate中常见的优化策略?

答:①指定合理的缓存策略;

②采用合理的Session管理机制;

③尽量使用延迟加载特性;

④设定合理的批量处理参数;

⑤如果可以,选用UUID作为主键生成器;

⑥如果可以, 选用基于version的乐观锁替代悲观锁;

⑦开发过程中, 开启hibernate.show_sql选项查看生成的SQL,从而了解底层的状况;开发完成后关闭此选项;

⑧数据库本身的优化(合理的索引,缓存,数据分区策略等)也会对持久层的性能带来可观的提升,这些需要专业的DBA提供支持;

21.谈一谈Hibernate的一级缓存、二级缓存和查询缓存?

答:HibernateSession提供了一级缓存的功能,默认总是有效的,当应用程序保存持久化实体、修改持久化实体时,Session并不会立即把这种改变提交到数据库,而是缓存在当前的Session中,除非显示调用了Sessionflush()方法或通过close()方法关闭Session。通过一级缓存,可以减少程序与数据库的交互,从而提高数据库访问性能。

SessionFactory级别的二级缓存是全局性的,所有的Session可以共享这个二级缓存。不过二级缓存默认是关闭的,需要显示开启并指定需要使用哪种二级缓存实现类(可以使用第三方提供的实现)。一旦开启了二级缓存并设置了需要使用二级缓存的实体类,SessionFactory就会缓存访问过的该实体类的每个对象,除非缓存的数据超出了指定的缓存空间。

③一级缓存和二级缓存都是对整个实体进行缓存,不会缓存普通属性,如果希望对普通属性进行缓存,可以使用查询缓存。查询缓存是将HQLSQL语句以及它们的查询结果作为键值对进行缓存,对于同样的查询可以直接从缓存中获取数据。查询缓存默认也是关闭的,需要显示开启。

22.说出Servlet的生命周期?

答:Servlet的生命周期:

servlet是单实例多线程的

②默认第一次收到请求的时候,服务器创建servlet

③与此同时调用init方法,实现初始化操作,并调用service方法;

service方法会调用与请求对应的doGetdoPost等方法完成业务操作;

⑤以后每当收到请求的时候,都创建一个新的线程,同样服务器会调用service方法来处理业务逻辑;

⑥当服务器正常关闭或者servlet被移除的时候,服务器调用destroy方法,实现销毁操作。

23.请求转发(forward)和重定向(redirect)的区别?

答:① 请求转发是1次请求;重定向是2次请求;

② 请求转发地址栏不变;重定向地址栏改变;

③ 请求转发是request的方法;重定向是response的方法;

④ 请求转发的时候可以使用request域对象;而重定向不能使用;

⑤ 请求转发的路径是内部路径;重定向的路径是绝对路径;

⑥ 若访问站外资源,需要使用重定向;

24. getpost请求的区别?

答: get请求用来从浏览器上获取资源,而post是用来向服务器提交数据;

get会将表单中的数据,按照name=value的形式,添加到action所指向的URL后面,并且两者间使用“?”连接,各个变量之间使用“&”连接;post是将表单中的数据放在HTML头部(header),传递到action所指向URL,不会出现在地址栏中;

get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件只能使用post方式;

25.JSPServlet有有什么关系?

答:Servlet是一个特殊的Java程序,它运行于服务器的JVM中,依靠服务器的支持向浏览器提供显示内容;

JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于ServletJava程序,可以简化页面内容的生成;

ServletJSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是JavaHTML可以组合成一个扩展名为.jsp的文件(有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然,这个说法还是很片面的);

JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller);

26.JSP9个内置对象和4个域对象?

答:(19个内置对象:

  request:封装客户端的请求,其中包含来自GETPOST请求的参数;

  application:封装服务器运行环境的对象;

  response:封装服务器对客户端的响应;

  session:封装用户会话的对象;

  pageJSP页面本身(相当于Java程序中的this);

  configWeb应用的配置对象;

  exception:封装页面抛出异常的对象;

  pageContext:通过该对象可以获取其他对象;

  out(滚吧)用来传送回应的输出;

24个域对象

  page(当前页面)

  reques(一次请求)

  session( 一次会话)

  application(整个会话)

27.实现会话跟踪的技术有哪些?

答:由于HTTP协议本身是无状态的,服务器为了区分不同的用户,就需要对用户会话进行跟踪,简单的说就是为用户进行登记,为用户分配唯一的ID,下一次用户在请求中包含此ID,服务器根据此判断到底是哪一个用户。

  URL重写:在URL中添加会话信息作为请求的参数,或者将唯一的会话ID添加到URL结尾,以表示一个会话;

  ②设置表单隐藏域:将和会话跟踪相关的字段添加到隐藏域中,这些信息不会在浏览器显示,但是提交表单时会提交给服务器;

  cookiecookie有两种,一种是基于窗口的,浏览器关闭后,cookie就没有了;另一种是将信息存储在一个临时文件中,并设置其有效路径和最大存活时间。当用户通过浏览器和服务器建立一次会话后,会话ID就会随相应信息储存在基于窗口的cookie中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID又会提交给服务器,让服务器识别用户身份。在使用cookie时要注意几点:首先不要在cookie中存放敏感信息;其次cookie存储的数据量有限(4k),不能将过多的内容存储cookie中;再者浏览器通常只允许一个站点最多存放20cookie。当然,和用户会话相关的其他信息(除了会话ID)也可以存在cookie方便进行会话跟踪;

  HttpSession:在所有会话跟踪技术中,HttpSession对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建HttpSession,每个用户可以访问他自己的HttpSession。可以通过HttpServletRequest对象的getSession方法获得HttpSession,通过HttpSessionsetAttribute方法可以将一个值放在HttpSession中,通过调用HttpSession对象的getAttribute方法,同时传入属性名就可以获取保存在HttpSession中的对象。与上面三种方式不同的是,HttpSession放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的Servlet容器可以在内存将满时将HttpSession中的对象移到其他存储设备中,但是这样势必影响性能。添加到HttpSession中的值可以是任意Java对象,这个对象最好实现了Serializable接口,这样Servlet容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。

28.你的项目中使用过哪些JSTL标签?

答:项目中主要使用了JSTL的核心标签库,包括<c:if><c:choose><c: when><c: otherwise><c:forEach>等,主要用于构造循环和分支结构,以控制显示逻辑。

29.使用标签库有什么好处?

答:使用标签库的好处包括以下几个方面:

  ①分离JSP页面的内容逻辑,简化Web开发;

  ②开发者可以创建自定义标签库来封装业务逻辑和显示逻辑;

  ③标签库具有很好的可移植性、可维护性和可重用性;

  ④避免了对Scriptlet(小脚本)的使用(很多公司的项目都不允许在JSP中书写小脚本)

30.表达式语言(EL)支持哪些运算符?

答:除了.[]运算符,EL还提供了:

①算术运算符:+-*/div%mod

②关系运算符:==eq!=ne>gt>=ge<lt<=le

③逻辑运算符:&&and||or!not

④条件运算符:${statement? A : B}(跟Java的三元运算符类似)

empty运算符:检查一个值是否为null或者空(数组长度为0或集合中没有元素也返回true

相关文章
|
27天前
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
164 60
|
3天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
36 14
|
2天前
|
JavaScript 安全 Java
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
28 12
|
6天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13
|
26天前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
65 16
|
23天前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
55 9
|
1月前
|
人工智能 缓存 Ubuntu
AI+树莓派=阿里P8技术专家。模拟面试、学技术真的太香了 | 手把手教学
本课程由阿里P8技术专家分享,介绍如何使用树莓派和阿里云服务构建AI面试助手。通过模拟面试场景,讲解了Java中`==`与`equals`的区别,并演示了从硬件搭建、语音识别、AI Agent配置到代码实现的完整流程。项目利用树莓派作为核心,结合阿里云的实时语音识别、AI Agent和文字转语音服务,实现了一个能够回答面试问题的智能玩偶。课程展示了AI应用的简易构建过程,适合初学者学习和实践。
98 22
|
28天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
60 12
|
1月前
|
监控 Dubbo Java
Java Dubbo 面试题
Java Dubbo相关基础面试题
|
1月前
|
SQL Java 数据库连接
Java MyBatis 面试题
Java MyBatis相关基础面试题