软件研发 --- 软件研发技术认证考试试题 - 详解
软件研发技术(Java开发)认证考试试题 - 详解
单选题(共30题,每题2分)
1. 下列哪个是JDK8引入的新特性? A) 泛型 B) 注解 C) Lambda表达式 D) 枚举
✅ 正确答案:C) Lambda表达式
📖 答案解析:
Lambda表达式:是JDK 8最重要的新特性之一,它允许我们将函数作为方法的参数,简化了匿名内部类的写法。
泛型 (Generics):是在JDK 5.0中引入的,用于提供编译时的类型安全。
注解 (Annotations):也是在JDK 5.0中引入的,为代码提供元数据。
枚举 (Enum):同样是在JDK 5.0中引入的,用于定义一组常量。
2. 关于switch语句错误的是: A) 支持String类型 B) case值可以是final变量 C) 必须有default分支 D) 支持枚举类型
正确答案:C) 必须有 default 分支
📖 解析:
✅ A) 支持 String 类型 —— 正确
从 Java 7 开始,switch 就可以使用 String 作为判断条件。
String color = "red";
switch (color) {
case "red":
System.out.println("红色");
break;
}
✅ B) case 值可以是 final 变量 —— 正确
case 后面必须是 编译期常量,所以 final 常量是允许的:
final int a = 3;
switch (x) {
case a:
...
❌ C) 必须有 default 分支 —— 错误
default 是可选的,不是必须的。你可以完全不写 default。
switch (x) {
case 1: System.out.println("One"); break;
case 2: System.out.println("Two"); break;
}
✅ D) 支持枚举类型 —— 正确
Java 的 switch 语句支持枚举类型:
enum Color { RED, GREEN, BLUE }
Color c = Color.RED;
switch (c) {
case RED: System.out.println("红"); break;
}
3. 下列代码的输出结果是? System.out.println(1 + 2 + "3" + 4 + 5); A) 3345 B) 12345 C) 339 D) 1239
✅ 正确答案:A) 3345 📖 答案解析: Java中的 + 操作符有两种含义:数字加法和字符串连接。
代码从左到右执行。首先计算 1 + 2,因为两者都是数字,所以结果是 3。
接下来是 3 + "3"。因为遇到了字符串 "3",所以 + 被解释为字符串连接符,结果是字符串 "33"。
此后所有的 + 都将是字符串连接。"33" + 4 结果是 "334"。
最后 "334" + 5 结果是 "3345"。
4. 关于方法重载正确的是: A) 必须参数列表不同 B) 返回值类型可以不同 C) 访问修饰符可以不同 D) 可以只改变static修饰符
✅ 正确答案:A) 必须参数列表不同 📖 答案解析: 方法重载(Overloading)的充要条件是:在同一个类中,方法名相同,但参数列表必须不同(参数的个数、类型或顺序不同)。方法的返回值类型、访问修饰符或static修饰符的不同都不能构成重载。
5. 下列哪个不是Object类的方法: A) wait() B) notify() C) run() D) hashCode()
✅ 正确答案:C) run()
A) wait(): 是 Object 类的方法。它用于线程同步,使当前线程等待,直到另一个线程调用 notify() 或 notifyAll()。
B) notify(): 是 Object 类的方法。它用于线程同步,唤醒在该对象上等待的单个线程。
C) run(): 不是 Object 类的方法。run() 方法是 Runnable 接口中定义的抽象方法,通常用于线程执行(例如,在实现 Runnable 或继承 Thread 类时使用)。Object 类中没有 run() 方法。
D) hashCode(): 是 Object 类的方法。它返回对象的哈希码值,用于支持哈希表(如 HashMap)。
6. 关于接口正确的是: A) 可以有构造方法 B) 可以有实例变量 C) 方法默认是public abstract D) JDK8后可以有静态方法
✅ 正确答案:C) 方法默认是public abstract
A) 可以有构造方法 ❌
错误。
接口不能被实例化,因此不能有构造方法。
java
CopyEdit
interface MyInterface { // MyInterface() {} ❌ 编译错误 }
B) 可以有实例变量 ❌
错误。
接口中声明的变量默认是:
public static final(即常量)
也就是说,接口不能有实例变量,也不能有未初始化的字段。
java
CopyEdit
interface MyInterface { int VALUE = 10; // ✔ 是 public static final 类型常量 // int num; ❌ 错误:必须初始化 }
C) 方法默认是 public abstract ✔️
正确 。
在 JDK 8 之前,接口中的方法默认是:
public abstract(即必须被实现)
java
CopyEdit
interface MyInterface { void doSomething(); // ✔ 等价于 public abstract void doSomething(); }
D) JDK8后可以有静态方法 ✔️
正确 。
从 JDK 8 开始,接口可以包含:
default 方法(带方法体)
static 静态方法
java
CopyEdit
interface MyInterface { static void print() { System.out.println("Static method in interface"); } default void show() { System.out.println("Default method in interface"); } }
调用静态方法:
java
CopyEdit
MyInterface.print(); // ✔ 正确调用方式
7. 关于多态错误的是: A) 编译看左边,运行看右边 B) 只能调用父类中定义的方法 C) 成员变量没有多态性 D) 可以强制类型转换
✅ 正确答案:B) 只能调用父类中定义的方法
A)编译看左边,运行看右边 ✔️ 正确
这句话是描述多态的经典口诀:
左边:编译时看变量的声明类型(决定你能调用哪些方法)
右边:运行时看变量的实际对象类型(决定实际执行哪个方法)
java
CopyEdit
Animal a = new Dog(); // 左边Animal,右边Dog a.speak(); // 编译时看Animal有没有speak(),运行时执行Dog的实现
B)只能调用父类中定义的方法 ❌ 错误
这是错误说法,因为通过类型转换(向下转型),也可以调用子类特有的方法。
例如:
java
CopyEdit
Animal a = new Dog(); ((Dog)a).run(); // run 是 Dog 特有的方法,必须强转后才能调用
结论:虽然默认编译时只能调用父类中声明的方法,但通过类型转换,确实可以访问子类特有方法,因此说“只能”是不准确的。
C)成员变量没有多态性 ✔️ 正确
变量的访问是编译时绑定的,不具有多态性:
java
CopyEdit
class Parent { int x = 10; } class Child extends Parent { int x = 20; } Parent p = new Child(); System.out.println(p.x); // 输出10,而不是20
D)可以强制类型转换 ✔️ 正确
确实可以通过向下转型来访问子类特有的成员:
java
CopyEdit
Animal a = new Dog(); Dog d = (Dog)a; // ✔ 强制类型转换
当然前提是对象的实际类型兼容,否则会抛出 ClassCastException。
8. 关于包错误的是: A) package语句必须在第一行 B) import可以导入静态成员 C) 不同包的同名类可以同时导入 D) 默认导入java.lang包
✅ 正确答案:C) 不同包的同名类可以同时导入 📖 答案解析: 如果你尝试 import java.util.Date; 和 import java.sql.Date;,编译器会报错,因为类名冲突。在这种情况下,你必须至少有一个类使用其完全限定名(如 java.util.Date d = new java.util.Date();)。import 语句只是为了方便我们使用短类名。
9. 关于工厂模式正确的是: A) 隐藏对象创建细节 B) 提高代码扩展性 C) 降低耦合度 D) 以上都是
✅ 正确答案:D) 以上都是 📖 答案解析: 工厂模式是一种创建型设计模式,它的核心思想是:
A) 隐藏对象创建细节:客户端不需要知道具体的类是如何创建的,只需向工厂请求即可。
B) 提高代码扩展性:当需要添加新产品时,只需创建新的产品类并修改工厂,而不需要修改客户端代码。
C) 降低耦合度:客户端代码只依赖于抽象的接口或父类,而不依赖于具体的产品类,实现了客户端与具体实现的解耦。
10. ArrayList和LinkedList的区别: A) ArrayList基于数组 B) LinkedList插入删除更快 C) ArrayList内存连续 D) 以上都是
✅ 正确答案:D) 以上都是 📖 答案解析:
A/C) ArrayList 的底层是动态数组,内存空间是连续的。这使得它按索引查找(get)非常快,但插入和删除元素(特别是在中间位置)较慢,因为需要移动后续元素。
B) LinkedList 的底层是双向链表,内存空间不一定是连续的。这使得它插入和删除元素(特别是首尾)非常快,只需修改相邻节点的指针即可,但按索引查找较慢,需要从头或尾开始遍历。
11. 关于泛型错误的是: A) 编译时类型安全 B) 可以用于类、接口、方法 C) 泛型类可以有多个类型参数 D) 泛型信息会保留到运行时
✅ 正确答案:D) 泛型信息会保留到运行时
✅ A) 编译时类型安全 —— 正确
泛型的主要作用之一就是在编译期检查类型,防止类型转换错误。
java
CopyEdit
List<String> list = new ArrayList<>(); list.add("hello"); list.add(123); // 编译错误,确保类型安全
✅ B) 可以用于类、接口、方法 —— 正确
泛型可以用于:
类:class Box<T> {}
接口:interface Comparable<T> {}
方法:public <T> void print(T value)
✅ C) 泛型类可以有多个类型参数 —— 正确
java
CopyEdit
class Pair<K, V> { K key; V value; }
❌ D) 泛型信息会保留到运行时 —— 错误
错误点:Java 的泛型采用“类型擦除”机制,即:
编译后泛型信息会被擦除。
运行时不会保留泛型的具体类型。
java
CopyEdit
List<String> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); System.out.println(list1.getClass() == list2.getClass()); // true
上面例子中,list1 和 list2 的实际运行时类型相同。
12. 下列哪个是运行时异常: A) IOException B) SQLException C) NullPointerException D) FileNotFoundException
✅ 正确答案:C) NullPointerException 📖 答案解析:
运行时异常(RuntimeException):通常是由程序逻辑错误引起的,编译器不强制检查。NullPointerException(空指针异常)是典型的运行时异常。
受检异常(Checked Exception):通常是外部错误(如文件不存在、网络问题),编译器会强制开发者处理(try-catch或throws)。IOException、SQLException、FileNotFoundException 都属于受检异常。
13. 关于try-catch-finally错误的是: A) finally一定会执行 B) catch可以有多个 C) try可以单独使用 D) finally中可以return
✅ 正确答案:C) try可以单独使用 📖 答案解析: try 块不能单独存在,它必须和 catch 或 finally 块至少一个一起使用。合法的组合有 try-catch、try-finally、try-catch-finally。
14. 关于synchronized错误的是: A) 可以修饰方法 B) 可以修饰代码块 C) 可以修饰类 D) 保证可见性和原子性
✅ 正确答案:C) 可以修饰类
📖 选项解析:
✅ A) 可以修饰方法 —— 正确
synchronized 可以修饰实例方法或静态方法,用于同步整个方法体。
java
CopyEdit
public synchronized void instanceMethod() { ... } public static synchronized void staticMethod() { ... }
✅ B) 可以修饰代码块 —— 正确
synchronized 可以用于代码块中,通过指定一个对象作为锁:
java
CopyEdit
synchronized(this) { // 临界区 }
❌ C) 可以修饰类 —— 错误 ❌
synchronized 不能直接修饰类,但可以通过 synchronized(SomeClass.class) 的代码块来实现对类的同步(静态锁),不能写成 synchronized class MyClass 这种语法。
✅ D) 保证可见性和原子性 —— 正确
synchronized 可以确保:
可见性:一个线程对共享变量的修改对其他线程可见;
原子性:同一时间只有一个线程执行同步代码块。
15. 关于volatile正确的是: A) 保证原子性 B) 保证可见性 C) 禁止指令重排序 D) 以上都是
✅ 正确答案:B) 保证可见性 📖 答案解析: volatile 是一个轻量级的同步机制。它的主要作用有两个:
保证可见性:当一个线程修改了 volatile 变量的值,新值对其他线程是立即可见的。
禁止指令重排序:防止编译器和处理器为了优化而随意改变指令的执行顺序。 但是,volatile 不能保证原子性。例如 i++ 操作,它不是一个原子操作,volatile 无法保证其线程安全。
16. 以下哪个 SQL 语句用于删除表中所有记录,但保留表结构? A) DROP TABLE B) TRUNCATE TABLE C) DELETE FROM D) REMOVE TABLE
✅ 正确答案:B) TRUNCATE TABLE 📖 答案解析:
TRUNCATE TABLE table_name:快速删除表中的所有行,但表结构、列、约束、索引等保持不变。它通常比 DELETE 快,且不触发DELETE触发器,并且会重置自增ID。
DELETE FROM table_name:逐行删除记录,可以带 WHERE 子句删除部分行。速度较慢,会触发DELETE触发器,不重置自增ID。
DROP TABLE table_name:完全删除整个表,包括结构和数据。
17. Java 中操作 Redis 的常用客户端库是? A) Jedis B) Hibernate C) MyBatis D) JDBC
✅ 正确答案:A) Jedis 📖 答案解析:
Jedis 和 Lettuce 是Java中最主流的两个用于连接和操作Redis数据库的客户端库。
Hibernate 和 MyBatis 是ORM(对象关系映射)框架,用于操作关系型数据库(如MySQL)。
JDBC (Java Database Connectivity) 是Java连接关系型数据库的标准API。
18. Spring Boot 中默认的嵌入式 Web 服务器是? A) Tomcat B) Jetty C) Undertow D) Netty
✅ 正确答案:A) Tomcat 📖 答案解析: 当你引入 spring-boot-starter-web 依赖时,Spring Boot 默认会包含并自动配置 Tomcat作为嵌入式Servlet容器。当然,你也可以通过修改依赖轻松地切换到 Jetty 或 Undertow。
场景 示例项目 推荐容器
部署 JSP/Servlet Web 项目 企业 OA、JSP 系统 Tomcat
嵌入式、快速启动、轻量服务 Eclipse 插件、微服务边缘节点 Jetty
高性能 REST API、异步处理 Soul 网关、Spring Boot 高并发服务 Undertow
RPC、自定义协议、推送系统 Dubbo、Netty IM、MQ 消息系统 Netty
19. 以下哪个注解是 Spring Cloud 中实现服务发现的客户端注解? A) @EnableDiscoveryClient B) @EnableEurekaClient C) @LoadBalanced D) @FeignClient
✅ 正确答案:A) @EnableDiscoveryClient 📖 答案解析:
@EnableDiscoveryClient 是Spring Cloud提供的更通用的服务发现注解,它可以适配多种服务注册中心,如Eureka, Consul, Zookeeper。
@EnableEurekaClient 是专门用于Eureka的注解。在新版本的Spring Cloud中,@EnableDiscoveryClient 已被推荐使用,甚至在很多情况下可以省略。
20. Spring Boot 中用于外部化配置的注解是? A) @PropertySource B) @ConfigurationProperties C) @Value D) @EnableConfigurationProperties
✅ 正确答案:B) @ConfigurationProperties 📖 答案解析:
@ConfigurationProperties 是最强大和推荐的方式,它可以将配置文件(如 application.yml)中的一组属性批量绑定到一个Java Bean对象的字段上。
@Value 用于将单个属性值注入到字段中。
@PropertySource 用于加载指定的配置文件。
@EnableConfigurationProperties 用于在Spring容器中启用 @ConfigurationProperties 注解的Bean。
21. 在Spring Boot中,以下哪个注解用于定义RESTful接口? A) @Controller B) @RestController C) @RequestMapping D) @ResponseBody
✅ 正确答案:B) @RestController 📖 答案解析: @RestController 是一个组合注解,它相当于 @Controller 和 @ResponseBody 的结合。它告诉Spring,这个控制器中的所有方法都将直接返回JSON或XML等数据,而不是视图名,是构建RESTful Web服务的标准注解。
22. 关于Spring的事务管理,以下说法错误的是: A) @Transactional可以标注在类或方法上 B) 默认情况下只对RuntimeException回滚 C) propagation属性定义事务的传播行为 D) isolation属性定义事务的隔离级别
✅ 正确答案:B) 默认情况下只对RuntimeException回滚 📖 答案解析: Spring的 @Transactional 默认情况下会对 RuntimeException (运行时异常) 和 Error (错误) 进行回滚。它不会对受检异常(Checked Exception)进行回滚。所以说“只对RuntimeException回滚”是不准确的。
23. 关于Spring框架的核心功能,以下说法错误的是: A) Spring IOC负责对象的创建和管理 B) Spring AOP用于面向切面编程 C) Spring MVC是Spring的Web框架 D) Spring Data是Spring的核心容器
✅ 正确答案:D) Spring Data是Spring的核心容器 📖 答案解析: Spring的核心容器是 IoC Container (控制反转容器)。Spring Data 是一个用于简化数据访问(包括关系型数据库、NoSQL数据库等)的项目集合,它建立在核心容器之上,但不是核心容器本身。
24. 以下哪个SQL语句可以查询出表中不重复的记录? A) SELECT UNIQUE * FROM table B) SELECT DIFFERENT * FROM table C) SELECT DISTINCT * FROM table D) SELECT ONLY * FROM table
✅ 正确答案:C) SELECT DISTINCT * FROM table 📖 答案解析: 在SQL中,DISTINCT 关键字用于返回唯一不同的值。它会移除查询结果中的重复行。其他选项都不是标准的SQL语法。
25. 关于Java的封装特性,以下说法错误的是: A) 通过private关键字实现数据隐藏 B) 通过public方法提供访问接口 C) 封装可以提高代码的安全性 D) 封装会降低代码的可维护性
✅ 正确答案:D) 封装会降低代码的可维护性 📖 答案解析: 封装恰恰相反,它通过隐藏内部实现细节,只暴露必要的接口,提高了代码的可维护性。当内部实现需要修改时,只要接口不变,就不会影响到调用方的代码。
多选题(共10题,每题2分)
1. 会抛出运行时异常的情况: A) "hello".charAt(5) B) Integer.parseInt("1.23") C) new FileInputStream("nonexist.txt") D) Arrays.asList("a","b").add("c")
✅ 正确答案:A, B, D 📖 答案解析: 运行时异常(RuntimeException)也称为非受检异常,编译器不会强制我们处理。
A) StringIndexOutOfBoundsException: 字符串"hello"的索引是0到4,访问索引5会越界。
B) NumberFormatException: parseInt 只能解析整数,字符串"1.23"包含小数点,无法解析为int。
C) FileNotFoundException: 这是一个受检异常(Checked Exception),编译器会强制要求用try-catch或throws处理。
D) UnsupportedOperationException: Arrays.asList() 返回的是一个固定大小的列表,不支持添加或删除元素的操作。
2. 关于HashMap正确的是: A) 允许null键 B) 线程不安全 C) 使用链表+红黑树 D) 初始容量16
✅ 正确答案:A, B, C, D 📖 答案解析:
A) HashMap 允许一个 null 键和一个或多个 null 值。
B) HashMap 是非线程安全的。如果需要线程安全,应使用 ConcurrentHashMap。
C) 在JDK 8及以后,HashMap 的底层实现是数组+链表/红黑树。当链表长度超过阈值(默认为8)且数组容量大于64时,链表会转换为红黑树以提高查询效率。
D) HashMap 的默认初始容量是16,默认加载因子是0.75。
3. 关于异常处理正确的是: A) try-with-resources自动关闭资源 B) catch块应该从具体到抽象 C) finally中不要return D) 可以捕获Throwable
✅ 正确答案:A, B, C 📖 答案解析:
A) JDK 7引入的 try-with-resources 语法可以自动关闭实现了 AutoCloseable 接口的资源,代码更简洁。
B) 如果有多个 catch 块,应该将更具体的异常类放在前面,更通用的异常类(如 Exception)放在后面,否则前面的具体异常永远不会被捕获。
C) 在 finally 块中使用 return 会覆盖 try 或 catch 块中的 return 语句或抛出的异常,这通常会隐藏真正的异常信息,是一种不推荐的做法。
D) Throwable 是所有错误(Error)和异常(Exception)的根父类。虽然语法上可以捕获它,但通常不建议这样做,因为 Error 通常表示JVM的严重问题(如 OutOfMemoryError),应用程序一般无法处理。
4. 关于多线程正确的是: A) wait()释放锁 B) sleep()不释放锁 C) notify()随机唤醒 D) join()等待线程结束
✅ 正确答案:A, B, C, D 📖 答案解析:
A) wait() 是 Object 的方法,调用时线程会进入等待状态并释放它持有的对象锁。
B) sleep() 是 Thread 的静态方法,调用时线程会休眠指定时间,但不会释放它持有的任何锁。
C) notify() 会从等待该对象锁的线程池中随机唤醒一个线程。
D) t.join() 会使当前线程阻塞,直到线程 t 执行完毕。
5. 关于集合框架正确的是: A) Vector是线程安全的 B) HashSet基于HashMap C) TreeSet是有序的 D) LinkedList可以作队列
✅ 正确答案:A, B, C, D 📖 答案解析:
A) Vector 是一个古老的集合类,它的方法大多是 synchronized 的,因此是线程安全的,但性能较差。
B) HashSet 的底层就是用 HashMap 实现的。它使用 HashMap 的键来存储元素,值则是一个固定的 PRESENT 对象。
C) TreeSet 基于红黑树实现,它能保证元素处于有序状态(自然排序或自定义比较器排序)。
D) LinkedList 实现了 Deque 接口(双端队列),因此可以非常高效地作为栈或队列来使用。
6. 关于面向对象正确的是: A) 封装隐藏实现细节 B) 继承提高代码复用 C) 多态提高扩展性 D) 抽象类不能实例化
✅ 正确答案:A, B, C, D 📖 答案解析: 这四个选项都是对面向对象(OOP)三大特性(封装、继承、多态)和抽象的正确描述。
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式。
继承:子类继承父类的属性和方法,实现代码复用。
多态:允许不同类的对象对同一消息做出响应,提高了程序的灵活性和扩展性。
抽象:抽象类是用来被继承的,不能直接创建实例。
7. 关于Java内存区域正确的是: A) 堆存放对象实例 B) 栈存放局部变量 C) 方法区存放类信息 D) 程序计数器线程私有
✅ 正确答案:A, B, C, D 📖 答案解析: 这些都描述了JVM内存模型(JMM)的主要区域及其功能:
A) 堆 (Heap):线程共享,主要用于存放对象实例和数组。
B) Java虚拟机栈 (Stack):线程私有,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
C) 方法区 (Method Area):线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量等数据。
D) 程序计数器 (Program Counter Register):线程私有,记录当前线程正在执行的字节码指令的地址。
8. 关于 PreparedStatement 的优势,以下哪些是正确的? A. 防止 SQL 注入攻击 B. 支持批量操作addBatch() C. 执行速度总是比 Statement 快 D. 可以直接拼接 SQL 字符串
✅ 正确答案:A, B 📖 答案解析:
A) 这是 PreparedStatement 最重要的优势。它通过预编译和参数占位符 ? 的方式,将SQL指令和数据分开,从根本上防止了SQL注入。
B) PreparedStatement 提供了 addBatch() 和 executeBatch() 方法,可以高效地执行批量SQL操作。
C) 并不总是更快。对于只执行一次的SQL,Statement 可能更快。PreparedStatement 的优势在于对同一SQL语句的多次执行,因为它只需要编译一次。
D) 直接拼接SQL字符串是 Statement 的做法,也是导致SQL注入的根源。PreparedStatement 正是为了避免这种情况。
9. 以下哪些是 Redis 支持的数据类型? A. String B. List C. HashMap D. SortedSet
✅ 正确答案:A, B, D 📖 答案解析: Redis的核心数据类型包括:
String (字符串)
List (列表)
Set (集合)
Sorted Set (有序集合, ZSet)
Hash (哈希表) HashMap 是Java中的一个类,虽然Redis的Hash类型在功能上类似它,但它不是Redis的原生数据类型名称。
10. 以下哪些是 Spring Boot 的 Starter 依赖? A. spring-boot-starter-data-jpa B. spring-boot-starter-webflux C. spring-cloud-starter-gateway D. spring-boot-starter-log4j
✅ 正确答案:A, B, C 📖 答案解析: Spring Boot Starter是实现“约定优于配置”理念的关键。
A, B 都是常见的Spring Boot官方Starter,分别用于集成JPA和响应式Web开发。
C) spring-cloud-starter-gateway 是Spring Cloud项目提供的Starter,用于构建API网关,它也是基于Spring Boot的。
D) Spring Boot默认使用Logback作为日志框架(通过spring-boot-starter-logging)。虽然可以切换到Log4j2(使用spring-boot-starter-log4j2),但spring-boot-starter-log4j是针对旧版Log4j的,已不推荐使用。
判断题(共20题,每题1分)
1. String是基本数据类型( F ) 📖 答案解析: String 是一个对象,属于引用数据类型,不是基本数据类型。Java的基本数据类型只有8种:byte, short, int, long, float, double, char, boolean。
2. finally块中的代码一定会执行( F ) 📖 答案解析: 这个说法在绝大多数情况下是正确的,但并非绝对。如果在 try 或 catch 块中调用了 System.exit() 来终止JVM,或者线程在执行到 finally 之前被杀死,finally 块就不会执行。因此,严格来说这个命题是错误的。
3. 抽象类可以有构造方法( T ) 📖 答案解析: 抽象类虽然不能被实例化,但它可以有构造方法。这个构造方法不是给自己用的,而是给子类在实例化时调用的(通过super()),用于初始化父类继承来的成员变量。
4. 接口中的变量默认是public static final( T ) 📖 答案解析: 是的,在接口中声明的任何变量(成员变量),其修饰符默认为 public static final,即它是一个公开的静态常量。
5. ==比较的是对象的内容( F ) 📖 答案解析: 对于引用类型,== 比较的是两个引用是否指向堆内存中的同一个对象(即比较内存地址)。要比较对象的内容是否相等,应该重写并使用 equals() 方法。
6. 构造方法可以声明为static( F ) 📖 答案解析: 构造方法是用于创建对象实例的,它与对象实例绑定。而 static 成员属于类,不依赖于任何实例。因此,构造方法不能是静态的。
7. String类的substring方法会产生新对象( T ) 📖 答案解析: 是的。由于 String 对象是不可变的(immutable),任何对 String 的修改操作(如substring, concat, replace)都会返回一个新的 String 对象,而原始对象保持不变。
8. final类中的方法默认是final的( T ) 📖 答案解析: 一个类被声明为 final,意味着它不能被继承。既然不能被继承,那么它的方法也就不可能被子类重写(override),所以这些方法实际上就具备了 final 的特性。
9. 一个.java文件可以有多个public类( F ) 📖 答案解析: 一个 .java 源文件中最多只能有一个 public 类,且该 public 类的名称必须与文件名相同。可以有多个非 public 的类。
10. Spring Cloud Gateway 是基于 Servlet 的阻塞式网关。( F ) 📖 答案解析: Spring Cloud Gateway 是基于 Spring WebFlux 构建的,而 WebFlux 是一个响应式、非阻塞的框架,底层使用Netty等服务器。因此Gateway是异步非阻塞的,适合高并发场景。传统的Zuul 1.x是基于Servlet的阻塞式网关。
11. static方法可以直接通过类名调用,不需要创建对象。( T ) 📖 答案解析: 静态(static)方法和变量属于类本身,不属于任何特定的对象实例。因此,它们可以通过 类名.方法名() 的方式直接调用。
12. @Autowired注解默认按名称进行自动装配。( F ) 📖 答案解析: @Autowired 默认是按**类型(byType)进行装配的。如果在容器中找到多个相同类型的Bean,它会尝试按名称(byName)**进行匹配。如果仍无法确定,可以使用 @Qualifier 注解来明确指定要注入哪个Bean。
13. MySQL中,DELETE和TRUNCATE都可以删除表中的数据,但TRUNCATE会重置自增ID。( T ) 📖 答案解析: 这是两者的一个重要区别。DELETE 是一行一行地删除,不会影响自增计数器。而 TRUNCATE 是直接销毁并重建表,效率更高,并且会将自增ID重置为初始值。
14. SQL语句中,HAVING子句用于过滤分组后的结果,WHERE子句用于过滤分组前的数据。( T ) 📖 答案解析: 正确。WHERE 在 GROUP BY 之前执行,用于过滤原始表中的行。HAVING 在 GROUP BY 之后执行,用于过滤分组聚合后的结果。
15. Redis的持久化可以完全避免数据丢失。( F ) 📖 答案解析: Redis提供RDB(快照)和AOF(追加日志)两种持久化方式,但都不能100%保证数据不丢失。RDB是间隔性保存,会丢失上次保存到现在的数。AOF虽然可以配置为每秒同步(appendfsync everysec),但在极端情况下(如服务器在同步前宕机)仍然可能丢失1秒的数据。
16. Spring Cloud是基于Spring Boot的微服务框架。( T ) 📖 答案解析: Spring Cloud 利用 Spring Boot 的自动配置和快速开发特性,在其基础上提供了一整套微服务治理的解决方案,如服务发现、配置中心、网关、熔断器等。
17. MyBatis中,#{}和${}都可以防止SQL注入。( F ) 📖 答案解析: 只有 #{} 可以有效防止SQL注入。#{} 会将传入的参数作为字符串处理,并使用预编译(PreparedStatement)。而 ${} 只是简单的字符串替换,会直接将参数拼接到SQL语句中,存在SQL注入风险。
18. Spring的IOC容器通过依赖注入(DI)实现控制反转。( T ) 📖 答案解析: 这是对IoC和DI关系的正确描述。控制反转(IoC)是一种设计思想,即把对象的创建和依赖关系的管理权从程序代码中交由外部容器来负责。依赖注入(DI)是实现控制反转最主要的方式。
前端工程师认证笔试题 - 详解
单选题(共20题,每题2分)
1. 当 CSS 样式发生冲突时,以下哪种选择器的优先级最高( ) A) 标签选择器 B) 类选择器 C) ID 选择器 D) 内联样式
✅ 正确答案:D) 内联样式 📖 答案解析: CSS选择器的优先级(特异性)遵循以下基本规则: 内联样式 > ID 选择器 > 类选择器/属性选择器/伪类 > 标签选择器/伪元素 !important 声明的优先级是最高的,可以覆盖以上所有。
2. 以下哪个 ES6 语法用于声明块级作用域的变量( ) A) var B) let C) const D) B 和 C 都正确
✅ 正确答案:D) B 和 C 都正确 📖 答案解析:
let 和 const 都是 ES6 引入的,用于声明变量,它们的作用域都是块级的({}内)。const 用于声明一个只读的常量,一旦声明,常量的值就不能改变(对于对象是引用不能改变)。
var 声明的变量是函数作用域或全局作用域,没有块级作用域的概念,并且存在变量提升。
3. 在 JavaScript 中, null 和 undefined 的区别是( ) A) 没有区别,它们的值和类型都相同 B) null 的类型是 object,undefined 的类型是 undefined C) null 表示空对象指针,undefined 表示变量未初始化 D) B 和 C 都正确
✅ 正确答案:D) B 和 C 都正确 📖 答案解析:
undefined 表示一个变量已被声明,但尚未被赋值。它的类型是 undefined。
null 是一个表示“无”的对象值,可以主动赋值给一个变量,用来表示该变量不指向任何对象。typeof null 返回 object,这是一个历史遗留的bug,但已被广泛接受。
因此,B 和 C 的描述都是正确的。
4. 在 JavaScript 中,以下代码的输出结果是( )
const a = { name: '张三' };
const b = a;
a.name = '李四';
console.log(b.name);
A) 张三 B) 李四 C) undefined D) 报错
✅ 正确答案:B) 李四 📖 答案解析: 在JavaScript中,对象是引用类型。
const a = { name: '张三' }; 创建了一个对象,并让变量 a 指向它。
const b = a; 并没有创建一个新对象,而是让变量 b 也指向了和 a 相同的那个对象。
a.name = '李四'; 修改了这个对象内部的 name 属性。
因为 a 和 b 指向同一个对象,所以通过 b 来访问 name 属性时,得到的是修改后的值 "李四"。
5. 当浏览器发送 HTTP 请求时,以下哪个状态码表示服务器成功处理了请求,并返回了请求的数据( ) A) 200 B) 301 C) 404 D) 500
✅ 正确答案:A) 200 📖 答案解析:
200 OK: 请求已成功,请求所希望的响应头或数据体将随此响应返回。
301 Moved Permanently: 永久重定向。
404 Not Found: 服务器找不到请求的资源。
500 Internal Server Error: 服务器遇到了一个未曾预料的状况,导致其无法完成对请求的处理。
6. 在 JavaScript 中,this 关键字在普通函数和箭头函数中的指向分别是( ) A) 普通函数中 this 指向函数的调用者,箭头函数中 this 指向定义时所在的对象 B) 普通函数中 this 指向全局对象,箭头函数中 this 指向函数的调用者 C) 普通函数和箭头函数中 this 都指向函数的调用者 D) 普通函数和箭头函数中 this 都指向全局对象
✅ 正确答案:A) 普通函数中 this 指向函数的调用者,箭头函数中 this 指向定义时所在的对象 📖 答案解析:
普通函数:this 的指向在函数被调用时确定,谁调用它,this 就指向谁。在全局作用域下调用,this 指向全局对象(浏览器中是 window)。作为对象的方法调用,this 指向该对象。
箭头函数:它没有自己的 this。它会捕获其所在上下文(即定义时所在的作用域)的 this 值作为自己的 this,且指向是固定的。
7. 以下关于 CSS Grid 布局的说法,正确的是( ) A) Grid 布局只能实现二维布局,不能实现一维布局 B) grid-template-columns 属性用于定义网格的列 C) grid-template-rows 属性用于定义网格的行高,但不能使用百分比值 D) Grid 布局不支持响应式设计
✅ 正确答案:B) grid-template-columns 属性用于定义网格的列 📖 答案解析:
A) Grid 布局是强大的二维布局系统,当然也可以用来实现一维布局,但通常一维布局更推荐使用 Flexbox。
B) grid-template-columns 用于定义网格的列数和列宽,grid-template-rows 用于定义行数和行高。
C) grid-template-rows 可以使用各种单位,包括像素(px)、百分比(%)、fr(分数单位)等。
D) Grid 布局与媒体查询等技术结合,是实现复杂响应式设计的利器。
8. 在 Web 存储中,localStorage 和 sessionStorage 的区别是( ) A) localStorage 存储的数据会一直存在,除非主动删除;sessionStorage 存储的数据在页面会话结束时(关闭窗口或标签页)会被清除 B) localStorage 存储的数据大小限制比 sessionStorage 小 C) localStorage 只能存储字符串类型的数据,sessionStorage 可以存储任意类型的数据 D) 没有区别,它们的使用方式和存储特性完全相同
✅ 正确答案:A) localStorage 存储的数据会一直存在,除非主动删除;sessionStorage 存储的数据在页面会话结束时(关闭窗口或标签页)会被清除 📖 答案解析: 这是两者最核心的区别:
localStorage: 持久化存储,数据存储在客户端,除非用户手动清除浏览器缓存或代码主动删除,否则数据永远不会过期。
sessionStorage: 会话级存储,数据仅在当前浏览器会话期间有效。一旦关闭标签页或浏览器窗口,数据就会被清除。
两者都只能存储字符串,且通常有相同的大小限制(约5MB)。
9. 在 Vue 中,父子组件通信时,子组件向父组件传递数据应使用?( ) A) props B) emit + 自定义事件 C) refs D) provide / inject
✅ 正确答案:B) emit + 自定义事件 📖 答案解析:
父 -> 子: 使用 props。父组件通过属性将数据传递给子组件。
子 -> 父: 使用 $emit。子组件触发一个自定义事件,并可以携带数据,父组件监听这个事件来接收数据。
refs 用于父组件直接访问子组件实例。provide / inject 用于跨层级组件通信。
10. 在 Vue3 中,响应式数据的核心实现是基于( ) A) Object.defineProperty B) Proxy C) setTimeout D) Promise
✅ 正确答案:B) Proxy 📖 答案解析:
Vue 2: 核心是 Object.defineProperty,它通过劫持对象的 getter 和 setter 来实现响应式。但它有局限性,比如无法检测到对象属性的新增或删除,以及数组索引和长度的变化。
Vue 3: 核心是 Proxy,它在目标对象之上架设了一层拦截,可以代理对整个对象的操作(包括属性的读写、添加、删除等),功能更强大,性能也更好。
11. 以下哪个选项不是 JavaScript 的基础数据类型?( ) A) string B) number C) array D) boolean
✅ 正确答案:C) array 📖 答案解析: JavaScript有7种基本数据类型:String, Number, Boolean, Null, Undefined, Symbol (ES6新增), BigInt (ES2020新增)。Array (数组) 是一种特殊的对象,属于引用数据类型。
12. CSS 中,box-sizing 属性的默认值是?( ) A) content-box B) border-box C) padding-box D) margin-box
✅ 正确答案:A) content-box 📖 答案解析:
content-box (默认值): 元素的 width 和 height 只包含内容区域(content)的尺寸,不包括 padding 和 border。
border-box: 元素的 width 和 height 包含内容区域、padding 和 border。这是现代Web开发中更常用、更直观的盒模型。
13. 在 JavaScript 中,以下哪个方法可以改变数组的原始内容?( ) A) slice() B) concat() C) filter() D) splice()
✅ 正确答案:D) splice() 📖 答案解析:
splice(): 通过删除、替换或添加元素的方式来修改原始数组。
slice(), concat(), filter() 都是非破坏性方法,它们不会改变原始数组,而是返回一个新的数组。
14. 下列哪个标签用于定义 HTML5 中的导航区域?( ) A) <nav> B) <header> C) <section> D) <aside>
✅ 正确答案:A) <nav> 📖 答案解析: <nav> 标签专门用于定义页面的主要导航链接区域,如菜单、目录、索引等,具有明确的语义。
15. HTML 中 标签的 alt 属性主要作用是?( ) A) 图片加载失败时的替代文本 B) 鼠标悬停时的提示文本 C) 图片的文件路径 D) 图片的宽度设置
✅ 正确答案:A) 图片加载失败时的替代文本 📖 答案解析: alt (alternative text) 属性对SEO和可访问性至关重要。当图片因网络问题、路径错误等原因无法显示时,浏览器会显示alt属性中的文本。屏幕阅读器也会朗读alt文本,帮助视障用户理解图片内容。鼠标悬停时的提示文本是 title 属性的作用。
16. 下列哪个 HTML 标签用于定义无序列表?( ) A) <ol> B) <ul> C) <li> D) <dl>
✅ 正确答案:B) <ul> 📖 答案解析:
<ul> (Unordered List): 无序列表,项目前通常是圆点。
<ol> (Ordered List): 有序列表,项目前是数字或字母。
<li> (List Item): 列表中的每一个项目。
<dl> (Definition List): 定义列表。
17. 在 JavaScript 中,数组的push方法的作用是?( ) A) 向数组末尾添加元素 B) 向数组开头添加元素 C) 删除数组末尾元素 D) 删除数组开头元素
✅ 正确答案:A) 向数组末尾添加元素 📖 答案解析: push() 方法向数组的末尾添加一个或多个元素,并返回新的长度。向开头添加元素是 unshift(),删除末尾元素是 pop(),删除开头元素是 shift()。
18. CSS 中,设置元素水平居中的正确方式是?( ) A) margin: 0 auto; B) text-align: center; C) padding: 0 auto; D) float: center;
✅ 正确答案:A) margin: 0 auto; 📖 答案解析: 要让一个块级元素水平居中,需要给它设置一个明确的宽度(width),然后将其左右 margin 设置为 auto。text-align: center; 用于使元素内的行内内容(如文本、图片)水平居中。
19. JavaScript 中event.preventDefault()的作用是?( ) A) 阻止事件冒泡 B) 停止事件传播 C) 取消事件默认行为 D) 延迟事件触发
✅ 正确答案:C) 取消事件默认行为 📖 答案解析: event.preventDefault() 用于阻止元素的默认行为。例如,阻止 <a> 标签的页面跳转,阻止 <form> 表单的提交。阻止事件冒泡的方法是 event.stopPropagation()。
20. JavaScript 中parseInt("10px")的返回值是?( ) A) 10 B) 10px C) NaN D) 0
✅ 正确答案:A) 10 📖 答案解析: parseInt() 会解析一个字符串,并返回一个整数。它会从字符串的开头开始解析,直到遇到一个非数字字符为止。所以它会解析 "10",然后遇到 "p" 就停止了,返回整数 10。
多选题(共10题,每题4分)
1. 以下属于 HTML5 新增表单元素的有( ) A) <input type="email"> B) <input type="date"> C) <input type="number"> D) <input type="color">
✅ 正确答案:A, B, C, D 📖 答案解析: HTML5 引入了许多新的 <input> 类型,以增强表单的功能和用户体验。email, date, number, color, tel, url, range 等都是新增的类型,它们通常带有内置的验证和更友好的UI(如日期选择器)。
2. 在 JavaScript 中,以下哪些操作会触发事件冒泡( ) A) 点击按钮 B) 鼠标移入元素 C) 键盘按键按下 D) 提交表单
✅ 正确答案:A, B, C, D 📖 答案解析: 事件冒泡是DOM事件流的一个阶段。当一个元素上的事件被触发时,该事件会从该元素开始,逐级向上传播到其父元素,直到文档的根节点。几乎所有常见的UI事件,如 click, mouseover, keydown, submit 等,默认都是会冒泡的。
3. 在 Web 开发中,以下哪些技术可以用于实现跨域请求( ) A) JSONP B) CORS(跨域资源共享) C) 代理服务器 D) 修改浏览器的安全设置
✅ 正确答案:A, B, C 📖 答案解析:
JSONP: 利用 <script> 标签没有跨域限制的漏洞,是早期常用的跨域方案,但只支持GET请求。
CORS: 目前主流的官方解决方案,需要服务器端设置响应头(如 Access-Control-Allow-Origin)来允许跨域请求。
代理服务器: 在同域下架设一个代理服务器,由它来转发请求到目标服务器,因为服务器与服务器之间通信不受同源策略限制。
D) 修改浏览器安全设置是一种不安全、不可行的方法,不能用于实际开发。
4. 以下关于 ES6 中的 Promise 的说法,正确的有( ) A) Promise 是一个用于处理异步操作的对象,它有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败) B) Promise 的 then() 方法可以接收两个回调函数,分别处理成功和失败的情况 C) catch() 方法用于捕获 Promise 链中的错误 D) Promise.all () 方法可以将多个 Promise 实例包装成一个新的 Promise 实例,只有当所有 Promise 都成功时,新的 Promise 才会成功
✅ 正确答案:A, B, C, D 📖 答案解析: 这四个选项都准确地描述了 Promise 的核心特性和常用方法,是处理现代JavaScript异步编程的基础。
5. 以下哪些是常见的 HTTP 请求方法( ) A) GET B) POST C) PUT D) REQUEST
✅ 正确答案:A, B, C 📖 答案解析: 常见的HTTP请求方法包括GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)、PATCH(部分更新资源)、HEAD(获取报文首部)等。REQUEST 不是一个标准的HTTP请求方法。
6. 在 JavaScript 中,以下哪些方法可以用于遍历数组( ) A) for 循环 B) forEach() 方法 C) map() 方法 D) filter() 方法
✅ 正确答案:A, B, C, D 📖 答案解析: 这些都是常用的数组遍历方式。
for循环: 最基本的遍历方式。
forEach(): 遍历数组,对每个元素执行回调函数,没有返回值。
map(): 遍历数组,对每个元素执行回调函数,并将结果组成一个新数组返回。
filter(): 遍历数组,根据回调函数的返回值(true/false)过滤元素,并将满足条件的元素组成一个新数组返回。
7. 以下关于 JavaScript 模块化的说法,正确的有( ) A) ES6 引入了模块化语法,通过 import 和 export 关键字实现模块的导入和导出 B) 模块化可以提高代码的可维护性和复用性 C) 一个模块中只能有一个 export 语句 D) 可以使用 default 关键字导出默认模块
✅ 正确答案:A, B, D 📖 答案解析:
A, B, D 都是正确的。ES6模块化是现代JS开发的基础。
C) 是错误的。一个模块可以有多个 export 语句(命名导出),但最多只能有一个 export default 语句(默认导出)。
8. 以下关于 CSS 伪类和伪元素的说法,正确的有( ) A) 伪类用于选择处于某种状态的元素,如 :hover(鼠标悬停) B) 伪元素用于创建一些不在文档树中的元素,如 ::before 和 ::after C) 伪类和伪元素的语法区别在于伪元素使用双冒号 ::,伪类使用单冒号 : D) 伪类和伪元素都可以同时使用多个,以实现更复杂的样式效果
✅ 正确答案:A, B, C 📖 答案解析:
A, B 准确定义了两者的区别。
C) CSS3规范建议用双冒号 :: 表示伪元素,以区分伪类 :,但为了兼容旧浏览器,单冒号也有效。
D) 伪类可以链式使用(如 a:visited:hover),但一个选择器上只能使用一个伪元素。
9. 在 CSS 中,以下哪些属性可以用来实现动画效果( ) A) transition B) animation C) transform D) opacity
✅ 正确答案:A, B, C, D 📖 答案解析:
transition: 实现简单的过渡动画。
animation: 配合 @keyframes 实现复杂的自定义动画。
transform (如 translate, scale, rotate) 和 opacity 是最常用于动画的CSS属性,因为改变它们不会触发页面重排(reflow),动画性能更好。
10. 以下哪些 是Vue的生命周期( ) A) onMounted B) onUpdated C) setup D) onUnmounted
✅ 正确答案:A, B, D 📖 答案解析: 这些都是Vue 3组合式API(Composition API)中的生命周期钩子函数。onMounted 对应 mounted,onUpdated 对应 updated,onUnmounted 对应 unmounted。setup 是组合式API的入口函数,它本身不是一个生命周期钩子,但生命周期钩子函数需要在 setup 中调用。
判断题(共10题,每题2分)
1. 在 HTML中, 标签的 target="_self" 表示在当前窗口打开链接,target="_blank" 表示在新窗口打开链接。( 正确 ) 📖 答案解析: 这是 <a> 标签 target 属性最常用的两个值。_self 是默认值,_blank 则用于在新标签页或新窗口中打开链接,可以防止用户离开当前页面。
2. CSS中,display: none 和 visibility: hidden 都能隐藏元素,且元素占位空间都会被保留。( 错误 ) 📖 答案解析:
display: none; 会将元素从渲染树中完全移除,元素自身及其所占用的空间都会消失,就好像它从未存在过一样。
visibility: hidden; 只是将元素设置为不可见,但它仍然占据着原来的文档流空间。
3. JavaScript 中async/await函数返回的是 Promise 对象。( 正确 ) 📖 答案解析: async 函数是 Promise 的语法糖。无论你在 async 函数中返回一个什么值,它都会被自动包装成一个 resolved 状态的 Promise 对象。如果函数中抛出异常,则会返回一个 rejected 状态的 Promise。
4. JavaScript 中==和===都严格比较值和类型,不存在隐式类型转换。( 错误 ) 📖 答案解析:
=== (严格相等): 会同时比较值和类型,只有两者都相同时才返回 true。
== (宽松相等): 在比较前会进行隐式类型转换,尝试将两边的值转换为相同类型再比较。
5. CSS 中z-index属性仅对定位元素(如position: relative/absolute/fixed)生效。( 正确 ) 📖 答案解析: z-index 属性用于设置元素的堆叠顺序。它只对设置了 position 属性值(非 static)的元素生效。
6. CSS 中overflow: auto会在内容超出时显示滚动条,overflow: hidden会隐藏超出内容。( 正确 ) 📖 答案解析: 这是 overflow 属性的正确用法。auto 是按需显示滚动条,而 hidden 是直接裁剪掉超出的部分。
7. 在 HTML 中,标签用于定义独立的内容区域,语义上比标签更明确。( 正确 ) 📖 答案解析: HTML5引入了 <section>, <article>, <nav>, <header>, <footer> 等语义化标签,就是为了让页面结构更清晰,更易于被机器(如搜索引擎)和人理解。<div> 是一个无任何语义的通用容器。
8. CSS 中的display: flex布局默认是水平排列子元素,且主轴方向从左到右。( 正确 ) 📖 答案解析: display: flex 的默认 flex-direction 属性值为 row,即主轴为水平方向,起点在左端。
9. CSS 的float属性会使元素脱离文档流,而position: absolute不会。( 错误 ) 📖 答案解析: 两者都会使元素脱离正常的文档流。
float: 元素脱离文档流,但其周围的行内元素会环绕它。
position: absolute / fixed: 元素完全脱离文档流,层级提高,其空间被后续元素占据。
10. JavaScript 中,箭头函数不能使用arguments对象,只能通过参数列表获取传入值。( 正确 ) 📖 答案解析: 箭头函数没有自己的 arguments 对象。如果需要获取所有传入的参数,应该使用剩余参数(rest parameters)语法:( ...args ) => { ... }。