单选题

Example

1.下面属于面向字符的输入流的是哪个类
ObjectOutputStream
InputStreamWriter
BufferedReader
FilelnputStream

复习一下Java基础: 字节流分类以及字符流分类,这里提到了各种常用字节流以及字符流,考察Java基础功底

Example

  1. 如下哪些情况不建议使用索引?()

出现在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列
性别列
包含在 ORDER BY、GROUP BY、DISTINCT 中的字段
多表 JOIN 的关联列

先阅读一下:6 第6章 快速查询的秘籍-B+树索引

再思考下列文章,知其然

索引失效的情况及解决 (超详细)

MySQL 索引优缺点、何时需要 _ 不需要创建索引、索引及 sql 语句的优化

Example

  1. 如下代码
    当 Float 对象在第 11 行被创建后,什么时候能够被垃圾回收?
10 public Object m (){
11 Object o =  new Float (3.14 F);
12 Object [] oa = new Object[1];
13 a[0]=o;
14 o null;
15 oa[0] = null;
16 print 'return 0';
17}

复盘 JVM 体系: 📁JVM

其中垃圾回收 JVM系列-第10章-垃圾回收概述和相关算法

Example

  1. 不属于 sql 优化常用的方法是?()
    尽量利用索引
    尽量减少加锁时间
    尽量使用大事务
    优化 sql 的写法

如何优化 mysql 分页查询

Example

  1. 新建一个流对象,下面那个选项的代码是错误的
    new BufferedReader (new FilelnputStream (“a.dat”));
    new ObjectInputStream (ney FilelnputStream (“a.dat”));
    new GZIPOutputStream (new FileOutputStream (“a.zip”));
    new BufferedWriter (new FileWriter (“a.txt”));

Example

  1. 关于 Application Context 接口,下列说法错误的是:
    FileSystemXmlApplication Context 是其子接口
    Application Context 提供了对资源文件进行访问的支持
    Application Context 是基于 beanfactoryi 而 a 建立的,ApplicationContext 继承了 beanFactory 的功能
    它是 peanfactory 的子接口

Example

  1. 下面关于垃圾收集的说法正确的是
    一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此
    一旦一个对象成为垃圾,就立刻被收集掉
    对象空间被收集掉之后,会执行试寸象的 finalize 方法
    Finalize 方法和 C++的析构函数是完全一回事情

Example

  1. 不属于 Nginx 的特点是?()
    高内存消耗
    高扩展性
    高可靠性
    更快

Example

  1. 考察继承多态代码执行顺序,其中考察向上转型

Java 多态详解(调用和初始化顺序)

2.多态演示实例:向上转型

Example

  1. Synchronized: 锁升级过程:无锁(锁对象初始化时)偏向锁(有线程请求锁)轻量级锁(多线程轻度竞争)重量级锁(线程过多或长耗时操作),其中描述错误的是
    锁只能升级,不能降级
    如果当前锁处于膨胀中,说明该锁正在被其它线程执行膨胀操作,则当前线程就进行自旋等待,会一直占用 CPU 资源。等待其他线程完成锁的膨胀操作,退出自旋并返回
    偏向锁可以被重置为无锁状态
    偏向锁和轻量级锁在用户态维护,重量级锁需要切换到内核态 (os)进行维护

文言一心回答:

  1. 锁只能升级,不能降级:这是正确的。锁的状态只能从一种更轻量级的锁状态升级到更重量级的锁状态,不能降级。例如,一个对象一旦从轻量级锁膨胀到重量级锁,就不能再降级到轻量级锁或偏向锁。
  2. 如果当前锁处于膨胀中,说明该锁正在被其它线程执行膨胀操作,则当前线程就进行自旋等待,会一直占用 CPU 资源。等待其他线程完成锁的膨胀操作,退出自旋并返回:这也是正确的。当一个线程尝试获取一个正在膨胀(从轻量级锁膨胀到重量级锁)的锁时,该线程会进入自旋等待,直到膨胀完成。
  3. 偏向锁可以被重置为无锁状态:这是错误的。偏向锁一旦被重置,就会变为无锁状态,而不是其他状态。
  4. 偏向锁和轻量级锁在用户态维护,重量级锁需要切换到内核态 (os)进行维护:这是正确的。偏向锁和轻量级锁的获取和释放都是在用户态进行的,不需要内核态的介入。而重量级锁的获取和释放则需要内核态的参与。

多选题

Example

  1. 下面哪些可以作为微服务之间的通信方式
    Mq
    REST
    RPC
    Kafka
    Tomcat
  1. REST (Representational State Transfer):REST 是一种基于 HTTP 协议的远程调用方式,它简单明了,易于理解和实现,并且可以在不同的平台和技术之间进行通信。在微服务架构中,REST 通常用于服务间的异步通信。
  2. RPC (Remote Procedure Call):RPC 是一种通过网络从远程计算机上请求服务的技术。RPC 通常用于在同一组织内或者相同技术栈的服务之间进行通信,可以提供更高效和更灵活的通信方式。
  3. MQ (Message Queue):消息队列是一种用于异步通信的机制,允许服务之间通过发送和接收消息进行通信。常见的消息队列技术包括 RabbitMQ、ActiveMQ 和 Kafka 等。
  4. Kafka:Kafka 是一种基于发布-订阅模型的消息系统,它通常用于大规模的实时数据流处理。在微服务架构中,Kafka 可以用于服务间的异步通信,特别是在需要处理大量数据的情况下。

Example

  1. 下列哪些是方法 public int add (inta, int b)的重载方法 public int add(double a,int b)
    public double add(int a,int b)
    public void add(int a,int b)
    public double add(int a,int b,int c)

在 Java 中,方法的重载(Overloading)是指在一个类中可以有多个名字相同但参数列表不同的方法。重载的方法必须满足以下条件:

  1. 方法名必须相同。
  2. 参数类型、顺序或数量必须不同。
  3. 返回类型可以相同也可以不同。

对于你提供的这几个方法,哪些是属于public int add(int a, int b)的重载方法呢?

  1. public int add(double a, int b):这是一个重载方法,因为它有相同的方法名,但参数类型或顺序不同(doubleintintint)。
  2. public double add(int a, int b):这也是一个重载方法,因为它有相同的方法名,但返回类型和参数类型或顺序不同(doubleintintint)。
  3. public void add(int a, int b):这也是一个重载方法,因为它有相同的方法名,但返回类型和参数类型或顺序不同(voidintintint)。
  4. public double add(int a, int b, int c):这也是一个重载方法,因为它有相同的方法名,但参数类型、顺序或数量不同(三个参数与两个参数)。

所以,这四个方法都是public int add(int a, int b)的重载方法

关于重载与重写请查看: 2.方法重写(需区别于方法重载;)

^lnp5fa

面试官:为什么不同返回类型不算方法重载?

Example

  1. 下面对 Spring 中 Bean 的注入说法正确的是()
    使用构造方法注入构造对象的同时,完成依赖关系的建立
    在关系的对象很多时,不应该使用构造方法注入
    Bean 根据注入方式不同可以分为构造方法注入和自动装载
    构造方法通过 constructor-Index)属性来指定,在该标签下要指定索引的位置

构造方法通过 constructor-arg 属性来指定,在该标签下要指定索引的位置。

Example

  1. Spring 默认默认事务传播级别是
    PROPAGATION SUPPORTS
    PROPAGATION REQUIRED
    PROPAGATION MANDATORY
    PROPAGATION NOT SUPPORTED

Spring 事务的基本原理、传播属性、隔离级别以及数据库事务

Example

  1. MyBatis 事务管理的方式包含 :
    JDBC
    MANAGED
    TRANSACTION
    POOLED

MyBatis 支持四种事务管理方式,它们分别是:

  1. JDBC:这种配置直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源获得连接来管理事务作用域。
  2. MANAGED:这种配置几乎没做任何事情。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
  3. TRANSACTION:这种配置使用了一个标准的 JDBC 事务,它依赖于从数据源获得连接来管理事务作用域。
  4. POOLED:这种配置使用了一个有连接的连接池,不过它管理事务的行为就像 TRANSACTION 一样。

请注意,在 Spring Boot 中,我们通常使用 Spring 的事务管理,而不是 MyBatis 的事务管理。Spring 支持编程式事务管理和声明式事务管理,提供了强大且灵活的事务管理功能。

编程题

Question

  1. 给你一个字符串 S,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(不能打乱其他字符的相对位置)。

样例输入:cbacdcbc
样例输出:acdb

这个问题可以通过贪心算法来解决。具体步骤如下:

  1. 遍历字符串,对于每个字符,如果它之前没有出现过,则加入结果字符串。
  2. 如果字符之前已经出现过,我们需要判断是否可以将它替换掉。为了保证字典序最小,我们需要找到当前字符之前最大的字符,如果当前字符比它大 ,则将当前字符替换掉该字符。
  3. 为了快速查找当前字符之前最大的字符,我们可以使用单调栈数据结构。

Question

  1. 一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?

样例输入:1000
样例输出:156

public class Main {  
public static void main(String[] args) 
{ int x = 1000; // 替换为你想要的输入的整数 
 for (int i = x; i >= 0; i--) {
  if (isPerfectSquare(i + 100) && isPerfectSquare(i + 268)) 
  { 
  System.out.println(i);
   break; 
   } 
   } 
   } 
public static boolean isPerfectSquare(int num) {
  int sqrt = (int) Math.sqrt(num); 
   return sqrt * sqrt == num; 
} 
}
 

Example

  1. 输入某年某月某日,判断这一天是这一年的第几天?

样例输入:1998821
样例输出:1998-8-21 是这年的第 233 天。

import java.time.LocalDate;  
import java.time.format.DateTimeFormatter;  
  
public class Main {  
    public static void main(String[] args) {  
        String dateStr = "1998821";  
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");  
        LocalDate date = LocalDate.parse(dateStr, formatter);  
        System.out.println(date.toString() + "是这一年的第" + date.getDayOfYear() + "天。");  
    }  
}

主要考察 Java 8 新特性LocalDate

【Java 8 新特性】Java LocalDate 详解