2025 年互联网公司校招 Java 面试题总结及答案实操示例解析

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本项目基于Spring Boot 3与Java 17技术栈,围绕校园招聘常见面试题,提供核心知识点的实操示例。涵盖多线程、RESTful API设计、数据库操作(Spring Data JPA)、事务管理及异常处理等。通过完整代码实现与运行步骤,帮助理解用户管理、线程池配置等实际应用场景。资源包含项目结构、关键代码示例(如User实体类、UserService服务层、ThreadService多线程实现)及数据库迁移脚本,适合深入学习与实践。环境要求:JDK 17+、Maven 3.8+、MySQL 8.0+。

我将基于之前总结的面试题,结合最新技术趋势,为每个核心知识点提供实操示例。这些示例采用Spring Boot 3、Java 17等最新技术栈,并包含完整的代码实现和运行步骤。

// 项目结构
java-campus-recruitment-practice
├── src/main/java/com/interview/practice
│   ├── Application.java                // 应用启动类
│   ├── config
│   │   ├── AsyncConfig.java            // 多线程配置
│   │   └── WebMvcConfig.java           // Web配置
│   ├── controller
│   │   ├── UserController.java         // 用户管理接口
│   │   └── ThreadController.java       // 多线程演示接口
│   ├── entity
│   │   ├── User.java                   // 用户实体类
│   │   └── Result.java                 // 通用返回结果
│   ├── service
│   │   ├── UserService.java            // 用户服务接口
│   │   ├── impl
│   │   │   └── UserServiceImpl.java    // 用户服务实现
│   │   └── ThreadService.java          // 多线程服务
│   ├── repository
│   │   └── UserRepository.java         // 用户数据访问
│   └── util
│       ├── HashUtils.java              // 哈希工具类
│       └── ExceptionUtil.java          // 异常处理工具
├── src/main/resources
│   ├── application.yml                 // 应用配置
│   └── db
│       └── migration                   // 数据库迁移脚本
└── pom.xml                             // Maven依赖配置

以下是各模块的核心代码实现:

// User.java - 演示Java Bean规范和Lombok使用
package com.interview.practice.entity;

import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "users")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
   
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String email;

    @Column(name = "create_time")
    private LocalDateTime createTime;

    @Column(name = "update_time")
    private LocalDateTime updateTime;

    // 演示自定义方法
    public void encryptPassword() {
   
        this.password = HashUtils.sha256(this.password);
    }
}
// UserRepository.java - 演示Spring Data JPA和自定义查询
package com.interview.practice.repository;

import com.interview.practice.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {
   
    Optional<User> findByUsername(String username);

    // 演示自定义SQL查询
    @Query("SELECT u FROM User u WHERE u.email = :email")
    Optional<User> findByEmail(@Param("email") String email);
}
// UserServiceImpl.java - 演示事务管理和线程安全
package com.interview.practice.service.impl;

import com.interview.practice.entity.User;
import com.interview.practice.repository.UserRepository;
import com.interview.practice.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.concurrent.CompletableFuture;

@Service
public class UserServiceImpl implements UserService {
   

    @Autowired
    private UserRepository userRepository;

    @Override
    @Transactional
    public User createUser(User user) {
   
        // 检查用户名是否已存在
        if (userRepository.findByUsername(user.getUsername()).isPresent()) {
   
            throw new IllegalArgumentException("用户名已存在");
        }

        // 加密密码
        user.encryptPassword();
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());

        return userRepository.save(user);
    }

    @Override
    @Async("asyncExecutor") // 使用自定义线程池
    public CompletableFuture<User> getUserAsync(Long id) {
   
        // 模拟耗时操作
        try {
   
            Thread.sleep(1000);
        } catch (InterruptedException e) {
   
            Thread.currentThread().interrupt();
        }

        return CompletableFuture.completedFuture(
            userRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("用户不存在"))
        );
    }
}
// AsyncConfig.java - 演示线程池配置
package com.interview.practice.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
@EnableAsync
public class AsyncConfig {
   

    @Bean(name = "asyncExecutor")
    public Executor asyncExecutor() {
   
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);       // 核心线程数
        executor.setMaxPoolSize(10);       // 最大线程数
        executor.setQueueCapacity(25);     // 队列容量
        executor.setThreadNamePrefix("async-thread-");
        executor.setRejectedExecutionHandler(
            new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy()
        );
        executor.initialize();
        return executor;
    }
}
// ThreadService.java - 演示各种多线程实现方式
package com.interview.practice.service;

import org.springframework.stereotype.Service;
import java.util.concurrent.*;

@Service
public class ThreadService {
   

    // 1. 继承Thread类
    public static class MyThread extends Thread {
   
        @Override
        public void run() {
   
            System.out.println("继承Thread类: " + Thread.currentThread().getName());
        }
    }

    // 2. 实现Runnable接口
    public static class MyRunnable implements Runnable {
   
        @Override
        public void run() {
   
            System.out.println("实现Runnable接口: " + Thread.currentThread().getName());
        }
    }

    // 3. 实现Callable接口
    public static class MyCallable implements Callable<String> {
   
        @Override
        public String call() throws Exception {
   
            Thread.sleep(1000);
            return "实现Callable接口: " + Thread.currentThread().getName();
        }
    }

    // 演示线程池使用
    public void executeWithThreadPool() {
   
        ExecutorService executor = Executors.newFixedThreadPool(3);

        // 提交Runnable任务
        executor.submit(new MyRunnable());

        // 提交Callable任务
        Future<String> future = executor.submit(new MyCallable());
        try {
   
            System.out.println(future.get());
        } catch (InterruptedException | ExecutionException e) {
   
            e.printStackTrace();
        }

        executor.shutdown();
    }

    // 演示CountDownLatch
    public void demoCountDownLatch() throws InterruptedException {
   
        CountDownLatch latch = new CountDownLatch(3);

        for (int i = 0; i < 3; i++) {
   
            final int index = i;
            new Thread(() -> {
   
                System.out.println("线程" + index + "开始工作");
                try {
   
                    Thread.sleep(1000 + index * 500);
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                }
                System.out.println("线程" + index + "完成工作");
                latch.countDown();
            }).start();
        }

        System.out.println("主线程等待所有子线程完成...");
        latch.await();
        System.out.println("所有子线程完成工作,主线程继续执行");
    }
}
// UserController.java - 演示RESTful API设计和异常处理
package com.interview.practice.controller;

import com.interview.practice.entity.Result;
import com.interview.practice.entity.User;
import com.interview.practice.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.CompletableFuture;

@RestController
@RequestMapping("/api/users")
public class UserController {
   

    @Autowired
    private UserService userService;

    @PostMapping
    public Result<User> createUser(@RequestBody User user) {
   
        User createdUser = userService.createUser(user);
        return Result.success(createdUser);
    }

    @GetMapping("/{id}")
    public Result<User> getUser(@PathVariable Long id) {
   
        User user = userService.getUserAsync(id).join();
        return Result.success(user);
    }
}
// Result.java - 演示通用返回结果封装
package com.interview.practice.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
   
    private int code;
    private String message;
    private T data;

    public static <T> Result<T> success(T data) {
   
        return new Result<>(200, "操作成功", data);
    }

    public static <T> Result<T> error(int code, String message) {
   
        return new Result<>(code, message, null);
    }
}
# application.yml - 应用配置示例
spring:
  application:
    name: java-interview-practice
  datasource:
    url: jdbc:mysql://localhost:3306/interview_db?useSSL=false&serverTimezone=UTC
    username: root
    password: yourpassword
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: validate
    show-sql: true
    properties:
      hibernate:
        format_sql: true
  flyway:
    enabled: true
    baseline-on-migrate: true

server:
  port: 8080
  servlet:
    context-path: /api

# 线程池配置
async:
  executor:
    core-pool-size: 5
    max-pool-size: 10
    queue-capacity: 25
-- V1__create_user_table.sql - 数据库迁移脚本
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    email VARCHAR(50) NOT NULL,
    create_time TIMESTAMP NOT NULL,
    update_time TIMESTAMP NOT NULL
);
// Application.java - 应用启动类
package com.interview.practice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class Application {
   
    public static void main(String[] args) {
   
        SpringApplication.run(Application.class, args);
    }
}

项目运行步骤:

  1. 环境准备

    • JDK 17+
    • Maven 3.8+
    • MySQL 8.0+
  2. 数据库配置

    • 创建数据库:CREATE DATABASE interview_db;
    • 修改application.yml中的数据库连接信息
  3. 项目构建与运行

    git clone https://github.com/your-repo/java-campus-recruitment-practice.git
    cd java-campus-recruitment-practice
    mvn clean install
    mvn spring-boot:run
    
  4. API测试

    • 创建用户:
      curl -X POST http://localhost:8080/api/users \
      -H "Content-Type: application/json" \
      -d '{"username":"testuser","password":"123456","email":"test@example.com"}'
      
    • 获取用户:
      curl http://localhost:8080/api/users/1
      

这个项目涵盖了Java基础、多线程、集合框架、数据库操作和Spring框架等核心知识点的实操示例。你可以根据需要扩展功能,或者针对特定知识点进行深入学习。


2025 年,互联网公司



资源地址:
https://pan.quark.cn/s/14fcf913bae6


相关文章
|
3天前
|
存储 安全 算法
Java 核心知识与技术全景解析
本文涵盖 Java 多方面核心知识,包括基础语法中重载与重写、== 与 equals 的区别,String 等类的特性及异常体系;集合类中常见数据结构、各集合实现类的特点,以及 HashMap 的底层结构和扩容机制;网络编程中 BIO、NIO、AIO 的差异;IO 流的分类及用途。 线程与并发部分详解了 ThreadLocal、悲观锁与乐观锁、synchronized 的原理及锁升级、线程池核心参数;JVM 部分涉及堆内存结构、垃圾回收算法及伊甸园等区域的细节;还包括 Lambda 表达式、反射与泛型的概念,以及 Tomcat 的优化配置。内容全面覆盖 Java 开发中的关键技术点,适用于深
|
3天前
|
缓存 安全 前端开发
Java 核心知识点与实战应用解析
我梳理的这些内容涵盖了 Java 众多核心知识点。包括 final 关键字的作用(修饰类、方法、变量的特性);重载与重写的区别;反射机制的定义、优缺点及项目中的应用(如结合自定义注解处理数据、框架底层实现)。 还涉及 String、StringBuffer、StringBuilder 的差异;常见集合类及线程安全类,ArrayList 与 LinkedList 的区别;HashMap 的实现原理、put 流程、扩容机制,以及 ConcurrentHashMap 的底层实现。 线程相关知识中,创建线程的四种方式,Runnable 与 Callable 的区别,加锁方式(synchronize
|
3天前
|
存储 Java 程序员
Java 基础知识点全面梳理包含核心要点及难点解析 Java 基础知识点
本文档系统梳理了Java基础知识点,涵盖核心特性、语法基础、面向对象编程、数组字符串、集合框架、异常处理及应用实例,帮助初学者全面掌握Java入门知识,提升编程实践能力。附示例代码下载链接。
11 0
|
11月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
8月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
8月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
8月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
194 4
|
9月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
471 2
|
9月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
110 0
|
11月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。