第一次面试(笔试)-----(上海*****信息)
基础部分:
1. 作用域:public、private、protected?
- public:public 作用域表示该变量或函数可以被任何其他类或对象访问
- private: 作用域表示该变量或函数只能在其所在的类内部访问
- protected:protected 作用域表示该变量或函数可以被其所在类及其子类访问
2. short s1 = 1; s1 = s1 + 1;有错吗? short s1 = 1; s1 += 1;有错吗?若有错,描述错误
第一句代码中的错误与类型转换规则有关。
s1 + 1,s1是short类型,1是int型,s1会自动转换为int型的1,与1相加后,得到int型的2,要向左侧的short类型的s1看齐,即需要通过强制类型转换。正确写法:s1 = (short) (s1 + 1);
short s1 = 1; s1 += 1 正确,执行s1+=1;其实执行的是s1 = (short) (s1 + 1); 其中会有一个强制转换的过程。
3. string是最基本的数据类型吗? 可以被继承吗?为了提高效率可以用什么类替代?
- String不是最基本的数据类型(是引用类型)
- 不可被继承(被final关键字修饰)
- 为了提高效率,可以使用StringBuilder或StringBuffer类来替代String
4. 一个Java源文件是否可以包括多个类?
一个java文件可以包括多个类,但最多只能有一个public类,并且这个public类的类名与文件名要相同。
5. x==y 和x.equals(y)区别?
对于基本数据类型,== 比较的是两个变量的值是否相等;基本数据类型不支持equals
对于引用类型,== 比较的是对象存储地址,equals比较的是内容
6. jsp四种会话作用域?(冷门)
- Page:数据仅在当前页面内有效
- Request:数据在同一个请求范围内有效,即从服务器接收到请求到响应返回给客户端的整个过程
- Session:数据在用户与服务器的一次会话中有效
- application:数据在整个Web应用程序中有效,即从应用启动到应用停止运行期间
7. 说说你对MVC的理解?
组成部分:Model(模型):代表应用程序的数据结构和业务逻辑、View(视图):用户界面的表示,负责展示模型并于用户交互、Controller(控制器):是模型和视图中间的中介,负责处理用户输入并更新模型和视图状态。
8. 说说SS2中三个框架各自的作用?(一脸懵,比较老的框架)
- Spring 管理整个应用程序的组件、依赖和配置,提供了广泛的功能,如依赖注入、AOP、事务管理等,是整个应用的骨架。
- Struts 专注于 Web 层,提供了基于MVC模式的结构,简化了用户界面的开发和管理,通过控制器和视图的分离提高了应用的可维护性。
- Hibernate 处理数据访问层,通过对象关系映射(ORM)简化了数据持久化操作,允许开发人员使用面向对象的方式来操作数据库,提高了开发效率和代码质量。
代码题:
9.判断下列代码是否编译成功,不成功原因是什么?
final int i = 0;
public void doSomething(){
System.out.println("i=" + i);
}
无法编译成功,final修饰的变量必须被初始化,否则会编译器会抛出错误。
10.输出下列代码的运行结果
static boolean foo(char c){
System.out.print(c);
return true;
}
public static void main(String[] argv){
int i = 0;
for (foo('A');foo('B')&&(i<2);foo('C')){
i++;
foo('D');
}
}
ABDCBDCB
12. 补充代码,输出从大到小的值
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] values = {3, 1, 6, 2, 9, 0, 7, 4, 5};
sort(values);
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
}
public static void sort(int[] values) {
// 补充该方法中的代码
}
}
public static void sort(int[] values) {
/**
for (int i = 0; i < values.length / 2; i++) {
int temp = values[i];
values[i] = values[values.length - 1 - i];
values[values.length - 1 - i] = temp;
}
*/
Integer[] a = Arrays.stream(values).boxed().map(Integer[]::new);
Arrays.sort(a, Conllections.reverseOder());
for(int i = 0; i < a.length; i++) {
values[i] = a[i];
}
}
数据库:
有以下两张表(库表具体内容记不太清楚了😂😂😂)员工表、部门表
id | name | salary | depId |
1 | 张三 | 1500 | 1001 |
2 | 李四 | 1400 | 1002 |
3 | 王五 | 1800 | 1003 |
4 | 赵六 | 1200 | 1004 |
id | depId | depname |
1 | 1001 | 销售部 |
2 | 1002 | aaa |
3 | 1003 | 技术部 |
4 | 1004 | 营运部 |
1. 员工表和部门表 找出部门1002中薪水为1500的员工
// 1. 员工表和部门表 找出部门1002中薪水为1500的员工
SELECT *
FROM Employees e
JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE e.Salary = 1500 AND e.DepartmentID = 1002;
// 2. 找出部门1002中薪水最高的员工
SELECT *
FROM employee e
JOIN department d ON e.department_id = d.id
WHERE d.id = 1002
ORDER BY e.salary DESC
LIMIT 1;
SELECT e.EmployeeID, e.EmployeeName, e.Salary, e.DepartmentID FROM Employees e WHERE e.Salary = ( SELECT MAX(Salary) FROM Employees WHERE DepartmentID = 1002 ) AND e.DepartmentID = 1002;
// 3. 将部门1004的员工薪水➕100
UPDATE Employees
SET Salary = Salary + 100
WHERE DepartmentID = 1004;
// 4. 新增员工赵六到营运部,薪水为1800,年龄为24。
INSERT INTO Employees (EmployeeName, Salary, Age, DepartmentID)
VALUES ('赵六', 1800, 24, 1003);
// 5. 删除所有生产部人员信息。
DELETE FROM Employees
WHERE DepartmentID = 1004;
DELETE FROM 员工表
WHERE 部门_id IN (
SELECT 部门_id
FROM 部门表
WHERE 部门名称 = '生产部'
);
注意⚠️:以上两sql语句全为物理删除,在我们实际的开发中,对于数据删除应该逻辑删除,避免物理删除(万一哪一天又需要恢复呢😂)
// 6. 使用HQL语句得到与题1(员工表和部门表 找出部门1002中薪水为1500的员工)相同的结果,假设映射实体对象名和表名一样,雇员表对部门表为一对一的关系。压轴大题一脸懵哈哈哈哈哈哈
String hql = "FROM Employee e WHERE e.salary = 1500 AND e.department.departmentID = 1002";
Query query = session.createQuery(hql);
List<Employee> employees = query.list();
// 补充:Hibernate Query Language (HQL) 是 Hibernate 提供的一种面向对象的查询语言,它类似于 SQL,但是面向对象,并且直接操作实体对象而不是数据库表。HQL 允许开发人员使用类和属性名称来编写查询,而不是直接使用数据库表和列名。