一、背景说明
使用对象:2023届软件工程专业毕业生
1 题型设计原理
1.1 题目类型分为三大类,多选题、问答题、编码题,主要检测4个能力:工具、技术、算法、基础编程
多选题 6 题:检测面试者的对编程工具的认知程度,是否匹配我们的项目工具。
问答题 20 题:检测面试者对技术的掌握情况,是否全面掌握 JAVA SE 、JAVA EE、HTML、JavaScript相关技术。(JAVA SE: 编程基础 、面向对象 、IO流 、异常处理 、多线程 、网络编程 、JDBC 、 Servlet 、 JSP) ,JAVA EE:我们现在使用的两大框架:Spring、Hibernate )
编码题2 题:检测面试者对JAVA算法的理解,数据库编程能力与Java编程能力
1.2 笔试建议时间(60分钟)
二 题目模版
1 多选题
1.1您熟练的编程语言有哪些?
□ 1 JAVA □ 2JavaScript □ 3 SQL □ 4 ABAP □ 5 其他_________
1.2 您熟练的编程工具有哪些?
□ 1 Eclipse □ 2 Intellij IDEA □ 3 PyCharm □ 4 Visual Studio 5 其他_________
1.3您熟练的数据库连接开发工具有哪些?
□ 1 MySQL □ 2 Workbench PL/SQL □ 3 SQL Server Management Studio □ 4 Navicat
5 其他_________
1.4 你常用的程序版本管理工具有哪些?
□ 1 Git □ 2 SVN □ 3 CVS □ 4 TFS 5 其他_________
1.5你常使用的应用服务有哪些?
□ 1 Tomcat □ 2 Nginx □ 3 Apache HTTP Server □ 4 Microsoft IIS 5 其他_________
1.6您常用的操作系统有哪些?
□1 Windows □2 Linux □3 Unix □4 CentOS □5 其他_________
2 问答题
2.1 JAVA面向对象编程(OOP)的三个核心概念是什么?
封装、继承、多态
封装(Encapsulation):封装是把对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的方法进行操作。封装的主要目的是增加安全性和简化编程,用户只需要知道对象提供哪些方法,而不需要了解内部细节。
继承(Inheritance):继承是从已有的类派生出新的类,新的类能够继承现有类的各种属性和行为,并且可以增加新的能力。继承可以使代码重用,也使类与类之间形成一种层次关系。
多态(Polymorphism):多态意味着可以将子类的对象当作父类的对象使用。在Java中,父类引用指向子类对象,调用的方法是子类的方法。这是多态性的一个重要表现。多态的存在大大提高了程序的扩展性和复用性。
2.2 JAVA的原始类型有几种,分别是什么?
8种,Byte、short、int、long、float、double、char、boolean
2.3 String 与 StringBuffer的区别?
String和StringBuffer是Java中两种处理字符串的重要类,它们之间的主要区别体现在以下几个方面:
创建方式:String类的创建有两种方式,一种是直接赋值,例如String str = "abc";另一种是通过构造函数,例如String str = new String("abc")。而StringBuffer的创建只能通过构造函数,例如StringBuffer str = new StringBuffer("abc")。
线程安全性:String类是不可变的,也就是说在创建字符串对象之后,其值不能被修改。如果需要修改,必须创建一个新的String对象。而StringBuffer是可变的,可以在原有对象上进行修改,不需要创建新的对象。
性能:由于String类的不可变性,它在处理字符串时会产生大量不必要的对象创建,这会消耗额外的内存和CPU资源。StringBuffer由于其可变性,不会有这个问题,所以在处理大量字符串修改的情况下,StringBuffer的性能会优于String。
使用场景:一般来说,如果只是需要固定的字符串,不经常对其进行更改,可以选择使用String。如果需要频繁地对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer会更加适合一些
2.4 String类 的常用操作方法有哪些?
4种:length、substring、indexOf、replace
2.5 java字符串比较中 equals和== 的区别?
equals是Object类的一个方法,可以被所有的类对象调用。它主要用于比较两个对象的内容是否相等。
== 是Java中的一个运算符,用来比较两个变量或对象是否指向同一个内存地址
2.6 Vector类 和 ArrayList类 的区别?
Vector类和ArrayList类都是Java中的List实现类,它们的主要区别在于线程安全性和性能。
在选择使用Vector类还是ArrayList类时,需要根据具体的应用场景来决定。在要求线程安全性的场景下,可以选择Vector类;在追求性能的场景下,可以选择ArrayList类。
线程安全性:Vector类是线程安全的,而ArrayList类是线程不安全的。Vector的add()方法是同步的,因此它在多线程环境下是安全的,但访问它比访问ArrayList慢。ArrayList的add()方法是异步的,因此它可以在单线程环境下具有更高的性能,但在多线程环境下可能导致数据不一致的问题。
性能:ArrayList的扩容每次扩充0.5倍,而Vector扩容每次扩容1倍。对于查找指定位置的数据,Vector和ArrayList使用的时间是相同的,都是0(1),这个时候使用Vector和ArrayList都可以。但是在频繁插入和删除操作时,ArrayList的性能要优于Vector,因为Vector的线程同步操作会导致额外的开销。
2.7 HashMap和Hashtable的主要区别?
父类:HashMap继承自AbstractMap类,而Hashtable继承自Dictionary类。
对null的支持:HashMap允许一个null键和多个null值,而Hashtable不允许null键和null值。
线程安全性:HashMap是线程不安全的,而Hashtable是线程安全的。
初始容量和每次扩充容量:如果不指定初始容量,HashMap的默认初始容量为16,每次扩充容量变为原来的2倍;而Hashtable的默认初始容量为11,每次扩充容量变为原来的2n+1。
效率:因为HashTable需要保证线程安全,所以其效率相对于HashMap较低。
2.8 请您谈谈JAVA 关键字 final, finally, finalize的区别?
final、finally和finalize在Java中有着不同的意义和用法。final主要用于声明属性、方法和类,表示不可变性;finally是异常处理语句的一部分,表示总是执行;finalize是Object类的一个方法,在垃圾回收前被调用用于资源的清理和回收
2.9 请您谈谈JAVA 中 error和exception有什么区别?
含义:Error指的是在正常情况下不大可能出现的情况,一旦出现通常会导致程序处于非正常的、不可恢复的状态。Exception则是在程序正常运行中,可以预料的意外情况,可以被捕获,进行相应的处理。
用途:Error通常用来表示严重的系统错误或异常,比如内存溢出、文件不存在等。Exception则是用来表示程序运行过程中可能出现的异常情况,比如除数为零、数组越界等。
处理方式:Error通常不需要捕获,因为它表示的是程序无法恢复的严重错误。而Exception则是可以被捕获并处理的,在处理过程中可以进行相应的操作,比如日志记录、错误提示等。
2.10 JAVA中如何实现多线程?
继承Thread类:Java中的Thread类是实现线程的最基本方法。你可以通过继承Thread类并重写其run()方法来创建新线程。然后你可以创建Thread的实例,并调用start()方法启动新线程
实现Runnable接口:Runnable接口是Java中实现线程的另一种方式。要实现该接口,你需要重写其run()方法。然后你可以将Runnable对象传递给Thread类的构造函数,并调用start()方法启动新线程
2.11 TCP协议和UDP协议有什么区别?在什么情况下应该使用哪种协议?
TCP协议和UDP协议是两种不同的传输层协议,它们之间的主要区别在于连接方式和可靠性
TCP协议是一种面向连接的协议,它通过三次握手建立连接,四次挥手来关闭连接,能够保证数据的可靠传输。
UDP协议则是一种无连接的协议,它只是简单地发送数据包,不进行连接的建立和关闭。
TCP协议和UDP协议各有其适用场景。在需要可靠数据传输的情况下,例如文件传输、在线支付等,应当使用TCP协议。而在一些实时性要求较高的应用中,例如音视频通话、在线游戏等,则可以使用UDP协议
2.12请您谈谈使用Jdbc连接数据库的步骤?
- 加载jdbc驱动程序;
- 创建数据库的连接;
- 创建PreparedStatement;
- 执行SQL语句;
- 遍历结果集;
- 处理异常关闭JDBC对象资源
2.13请您谈谈Servlet的生命周期?
- 加载阶段:这个阶段由Web容器负责,当Servlet第一次被访问时,Web容器会将其加载到内存中,并执行其类文件中的静态初始化代码块(如果有的话)。
- 创建阶段:在加载阶段之后,Servlet对象会被创建,同时调用其构造函数进行初始化。
- 初始化阶段:在这个阶段,Servlet会调用其初始化方法(init()),在这个方法中,Servlet可以完成一些初始化的工作,比如读取配置文件、建立数据库连接等。
- 处理客户请求阶段:当有客户请求到达Servlet时,Servlet会调用其service()方法来处理请求。这个阶段也是Servlet最主要的工作阶段。
- 卸载阶段:当Servlet不再被使用时,Web容器会对其进行卸载,释放其占用的资源。
总的来说,Servlet的生命周期从Web容器加载它开始,到容器被关闭结束。在这个过程中,Servlet会经历一系列的生命周期过程和回调方法,这些过程和方法可以用于执行各种初始化和销毁的任务,增加了Servlet的灵活性和可配置性
2.14 请您写出4种常用的 jsp内置对象 ? 以及它的作用分别是什么 ?
- request:这是一个 javax.servlet.http.HttpServletRequest 对象。每一次用户请求一个 JSP 页面时,都会创建一个新的 request 对象。这个对象包含了用户的请求信息,例如请求参数,请求头,cookies等。
- response:这是一个 javax.servlet.http.HttpServletResponse 对象。这个对象代表了服务器对用户请求的响应。
- session:这是一个 javax.servlet.http.HttpSession 对象。它用于在用户的多个请求之间保留信息。
- pageContext:这是一个 javax.servlet.jsp.PageContext 对象。这个对象提供了对其他隐式对象的访问,同时还包括一些其他的JSP页面范围的功能。
- application:这是一个 javax.servlet.ServletContext 对象。它代表了JSP页面的应用程序/上下文。
- out:这是一个 javax.servlet.jsp.JspWriter 对象。用于发送内容到客户端。
- config:这是一个 javax.servlet.ServletConfig 对象。这个对象包含了servlet的初始化参数。
- page:这是一个 java.lang.Object 对象。它代表了调用JSP页面的servlet实例。
- exception:这是一个 java.lang.Throwable 对象。它代表了在处理JSP页面时产生的异常(只在错误页面中可用)。
2.15 JAVA 字节流和字符流有什么不同 ?
- 定义不同:字节流以字节为单位进行读写操作,而字符流以字符为单位进行读写操作。
- 处理方式不同:字节流通常用于处理二进制数据,它是按字节来处理的,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元。字符流通常处理文本数据,它支持写入及读取Unicode码元。
- 编码方式不同:字节流采用ASCII编码,字符流采用unicode编码。
- 结尾不同:字节流以stream结尾,例如FileInputStream,而字符流以reader和writer结尾,例如FileReader和FileWriter。
- 缓冲区不同:字节流默认不使用缓冲区,而字符流使用缓冲区。
- 使用场景:
如果你需要处理的数据是文本数据,并且使用了某种特定的字符集(如UTF-8、UTF-16等),那么你应该使用字符流。字符流会自动处理字符集的转换,使得读写文本数据变得简单。
如果你需要处理的数据是二进制数据,或者你需要对字节进行更为精细的控制(例如,你需要读取或写入特定的字节),那么你应该使用字节流
2.16 Spring 的工作原理?
Spring 的工作原理主要基于两个核心概念:控制反转(IOC)和面向切面编程(AOP)。
- 控制反转(IOC)
Spring 通过控制反转(IOC)来实现对象的创建和管理。在 Spring 应用程序中,Spring 容器负责创建、配置和管理对象,而不是由代码直接创建对象。这样可以将对象的创建和管理交给 Spring 容器,降低代码的耦合性。在运行时,Spring 容器通过配置文件(如 Spring 的 xml 配置文件)动态地创建对象,并在需要时将对象注入到应用程序中。
- 面向切面编程(AOP)
Spring 通过面向切面编程(AOP)来实现模块的解耦和扩展。面向切面编程是一种编程范式,它可以在不改变原始代码的情况下,通过在程序中的某个位置添加额外的功能。在 Spring 中,面向切面编程允许我们在运行时对特定的对象或方法进行监督和控制,以达到对一个模块进行功能扩展的目的。这可以通过配置类来实现,Spring 根据这些配置内部通过反射去动态的组装对象。
总结来说,Spring 的工作原理就是通过控制反转(IOC)和面向切面编程(AOP)来实现对象的创建和管理以及对模块的解耦和扩展。这使得 Spring 应用程序中的对象与对象、模块与模块之间的关系没有通过代码来关联,而是通过配置类和 Spring 容器来管理。
2.17 Hibernate 的工作原理?
Hibernate 是一个基于 Java 的持久化框架,它用于将 Java 对象映射到关系型数据库中。Hibernate 的工作原理可以简要概括为以下几个步骤:
- 创建配置实例:根据默认的配置文件(如 hibernate.cfg.xml)来读取并创建配置实例。这个配置实例包含了所有关于数据库连接、事务管理等配置信息。
- 创建 SessionFactory 实例:在创建了配置实例后,使用该实例来创建 SessionFactory 实例。SessionFactory 实例代表了一个数据库存储源,用于封装 Hibernate 映射关系和事务管理相关的操作。它是线程安全的,通常情况下,一个应用程序只有一个 SessionFactory 实例。
- 读取并解析映射信息:Hibernate 通过读取并解析映射信息(如 hbm.xml 文件),将 Java 类和数据库表进行映射。这些映射信息会被加载到 SessionFactory 中进行缓存。
- 打开 Session:在需要访问数据库时,通过 SessionFactory 打开一个 Session。Session 代表了一个数据库事务,用于执行 CRUD(创建、读取、更新、删除)操作。
- 持久化操作:通过 Session 对象执行持久化操作,即将 Java 对象保存到数据库中或将数据从数据库中加载到 Java 对象中。Hibernate 会根据映射关系自动进行数据转换。
- 提交事务:在完成持久化操作后,通过 Session 对象提交事务,将更改的数据同步到数据库中。
- 关闭 Session 和 SessionFactory:在使用完 Session 和 SessionFactory 后,应该关闭它们以释放资源。通常来说,Session 的生命周期和 HttpServletRequest 绑定,SessionFactory 的生命周期和应用程序绑定。
2.18 请列出6种常用的HTML标签?
<h1>到<h6>:用于定义标题,<h1>为最高级别标题,<h6>为最低级别标题。
<p>:用于定义段落。
<br />:用于插入换行符,使文本换行。
<strong>或者 <b>:用于定义粗体文本。
<em>:用于定义斜体文本。
<sup>:用于定义上标文本。
<sub>:用于定义下标文本。
<div>:用于定义文档中的区块,常用于布局设计。
<span>:用于对文档中的行内元素进行组织。
<ul>、<ol> 和 <li>:用于创建无序列表和有序列表。
<a>:用于定义超链接。
<img>:用于插入图像。
<script> 和 <style>:用于定义脚本和样式。
<input>:用于创建输入框,如文本框、密码框、单选框、复选框等。
<button>:用于创建按钮。
<label>:用于定义表单元素的标签。
<form>:用于创建表单,如提交表单、重置表单等。
<iframe>:用于嵌入另一个网页到当前页面中。
2.19 请用JavaScript 对 DIV标签内容进行赋值 ?
document.getElementById("myDiv").innerHTML = "新的内容";
2.20 JAVA 23种设计模式,你常用过几种,请谈谈您的理解?
Java设计模式共有23种,分别是:
抽象工厂模式、建造者模式、单例模式、工厂方法模式、原型模式、外观模式、适配器模式、桥接模式、组合模式、享元模式、代理模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
3 编码题
3.1 根据以下条件内容,请用SQL语句查出人数大于100的部门
- 部门表:dept
字段 | 字段描述 | 字段类型 | 备注 |
ID | ID | VARCHAR(32) | 主键 |
Dept_ID | 部门ID | VARCHAR(32) | |
Dept_DESC | 部门名称 | VARCHAR(32) |
2.人员表:empe
字段 | 字段描述 | 字段类型 | 备注 |
Empe_ID | 员工ID | VARCHAR(32) | 主键 |
Dept_ID | 部门ID | VARCHAR(32) | |
Empe _DESC | 员工名称 | VARCHAR(32) |
select e.Dept_ID ,count(e.Empe_ID) from empe e left join dept d on e.Dept_ID = d.Dept_ID GROUP BY e.Dept_ID ,e.Empe_ID having count(e.Empe_ID) > 100;
3.2 请用java语言写一段“冒泡排序”或者“二分查找”的算法(二选一)?
3.2.1 冒泡排序
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
3.2.2二分查找
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 没有找到目标元素
}