博客
关于我
7家公司拿了5个offer,无非就是问源码、分布式微服务这些
阅读量:176 次
发布时间:2019-02-28

本文共 5758 字,大约阅读时间需要 19 分钟。

Java面试题汇总

JVM相关面试题

  • 唤醒阻塞线程

    在Java中,唤醒阻塞线程的方法是通过notify()notifyAll()方法,在同步块中调用。

  • CycliBarriar与CountdownLatch的区别

    • CycliBarriar:用于多线程任务的协调,允许某些任务在其他任务完成之前等待。
    • CountdownLatch:用于等待多个任务的完成,所有任务完成后才能继续。
  • start()与run()的区别

    • start()方法将线程加入线程池并执行run()方法,而run()方法直接由线程执行,不能直接调用。
  • 垃圾回收算法

    • 标记清除、复制算法、标记整理算法、分代收集算法。
  • 分代收集与分区收集的区别

    • 分代收集:根据对象年龄划分代次,优先回收老对象。
    • 分区收集:将堆分为固定大小的区间,按规律回收。
  • 程序计数器与虚拟机栈

    • 程序计数器:线程私有,记录当前线程执行的位置。
    • 虚拟机栈:线程私有,存储方法调用的栈帧。
  • JVM类加载机制

    • 类加载机制包括验证、加载、准备、直接引用、类构造器等。
  • JVM加载类文件的原理

    • 类文件由字节流读取,转换为Class对象,存储到方法区。
  • 堆与运行时数据区

    • 堆是线程共享的运行时数据区,用于存储对象实例。
  • JVM内存结构

    • 新生代、老年代、永久代,新生代包括Eden、Survivor区。
  • 对象创建过程

    • new操作符创建对象,分配内存,初始化,设置元数据。
  • 对象回收条件

    • 失去引用、内存不足。
  • 永久代垃圾回收

    • 永久代中的类元数据可能不被回收,但JDK 8后,永久代被移除。
  • 垃圾收集算法类型

    • 标记清除、复制算法、标记整理算法、分代收集算法。
  • Spring相关面试题

  • Spring Boot Starters

    提供预配置好的依赖,简化配置管理。

  • Spring Framework

    轻量级的前端控制器框架,支持IOC和依赖注入。

  • Spring Boot运行方式

    • 命令行运行:java -jar spring-boot.jar
    • IDE运行:主类方法直接运行。
  • 异常处理

    使用@ExceptionHandler注解,自定义异常处理逻辑。

  • 监视器

    Spring Boot提供监控功能,集成Prometheus等。

  • Spring优点

    简化配置、依赖管理、AOP功能强大。

  • Spring配置文件

    • application.properties:核心配置
    • application.xml:用于配置文件替换
  • 热部署方式

    • 热部署工具(如JRebel)
    • 使用类加载器重新加载类
  • 核心配置文件区别

    • application.properties:所有配置
    • application.xml:配置文件替换
  • 服务注册与发现

    使用Spring Cloud的服务发现组件(如Eureka)。

  • 负载均衡与Hystrix

    • 负载均衡:随机、轮询、加权
    • Hystrix:实现容错和流量控制。
  • Spring Cloud Bus

    用于事件发布和通知,主要用于分布式系统间通信。

  • SpringMVC控制器问题

    • 单例问题:使用@Async注解转换为异步处理。
  • SpringMVC与Struts2对比

    • MVC:基于控制器模型,请求-处理-回应流程。
    • Struts2:基于动作为中心的模型。
  • SpringMVC重定向与转发

    • 重定向:redirect:
    • 转发:forward:
  • SpringMVC拦截器

    拦截器链处理请求,通过@Component注解实现。

  • Spring IOC容器

    管理Bean的生命周期,提供依赖注入功能。

  • 依赖注入方式

    • setter方法注入
    • 构造器注入
    • 自动注入(@Autowired)
  • BeanFactory与ApplicationContext

    • BeanFactory:功能较简单,适合内部管理。
    • ApplicationContext:提供更复杂的功能支持。
  • Bean容器生命周期

    • 初始化:读取配置文件、解析定义。
    • 处理请求:创建Bean、注入服务。
    • 卸载:销毁Bean、关闭资源。
  • 内部Bean与装配

    • 内部Bean:仅在同一类中可用。
    • 装配:通过注解或配置文件。
  • 注解区别

    • @Component:通用标记。
    • @Controller:标记控制器。
    • @Repository:标记持久化层。
    • @Service:标记业务逻辑层。
  • 注解用途

    • @Required:依赖注入条件。
    • @Autowired:自动注入依赖。
  • @RequestMapping与@Qualifier

    • @RequestMapping:定义路由映射。
    • @Qualifier:指定注入的Bean。
  • Spring支持的ORM框架

    • MyBatis
    • Hibernate
    • JPA
  • Aspect切点与通知类型

    • 切点:执行某个方法或类的方法。
    • 通知类型:前置(@Before)、后置(@After)、异常处理(@Throwable)。
  • DispatcherServlet工作流程

  • 请求进入:通过Tomcat等容器。
  • 执行拦截器链。
  • 找到控制器处理。
  • 返回结果。
  • WebApplicationContext

    • 功能:获取上下文信息。
    • 常用方法:getServletContext(), getRequestScope()
  • 多线程并发相关面试题

  • 线程创建方式

    • 继承Thread类:new Thread(" runnable").start();
    • 实现Runnable接口:new Thread(new Runnable() { ... }).start();
  • volatile与有序性

    • volatile变量确保线程间可见性和有序性,但不能保证原子性。
  • start()与run()区别

    • start():线程池执行run()方法。
    • run():直接由线程执行。
  • wait与notify的使用条件

    • wait():释放锁,等待其他线程通知。
    • notify():通知等待的线程,但不释放锁。
  • wait、notify的位置要求

    • 必须在同步块中调用。
  • wait、notify的实现

    • Java通过内核对象实现,避免死锁。
  • 线程生命周期与终止方式

    • 四个状态:新生、运行、等待、终止。
    • 终止方式:stop()exit()、出-of-bounds异常、等待超时。
  • 线程同步方法

    • synchronized关键字:锁对象控制同步。
    • Lock接口:提供更细粒度的锁。
  • 线程调度算法

    • Java使用优先级队列调度算法。
  • 线程组与 ExecutorService

    • 线程组:适合处理大量短任务。
    • ExecutorService:提供任务执行框架,推荐使用。
  • Callable与Future

    • Callable接口定义一个返回值的任务。
    • Future接口表示异步计算,获取结果。
  • FutureTask与ExecutorService

    • FutureTask包装Callable任务,提交到ExecutorService执行。
  • 线程同步方法

    • synchronized、lock、atomicReference、countDownLatch。
  • 线程唤醒与其他方法

    • notify(): 唤醒单个线程。
    • notifyAll(): 唤醒所有线程。
    • sleep(): 让当前线程暂停。
  • 线程池与任务执行

    • 线程池提供并发执行环境,任务提交到线程池执行。
  • MyBatis相关面试题

  • MyBatis简介

    半自动ORM框架,通过XML配置映射数据库。

  • 优缺点

    • 优点:简化CRUD操作、支持动态SQL。
    • 缺点:配置复杂、特定于数据库。
  • 适用场景

    • 简单的数据处理、RESTful服务。
  • 与Hibernate对比

    • MyBatis:动态SQL、延迟加载。
    • Hibernate:ORM层面更强,提供更高级别的抽象。
  • 模糊查询

    使用like关键字实现。

  • 分页实现

    MyBatis提供RowBounds接口,通过分页插件实现。

  • 延迟加载

    MyBatis通过缓存机制实现,减少数据库访问。

  • 一级、二级缓存

    • 一级缓存:SqlSession缓存。
    • 二级缓存:SqlSessionFactory缓存。
  • 接口绑定

    使用动态代理实现,通过接口实现延伸。

  • Mapper接口要求

    • 方法名与数据库语句对应。
  • 一对一、一对多实现

    • 一对一:使用多个结果集。
    • 一对多:使用关联查询。
  • 插件原理

    • MyBatis插件扩展框架,通过拦截器链实现功能增强。
  • MyBatis的半自动特性

    • 需手动配置XML映射文件。
  • 微服务相关面试题

  • 前后端分离与微服务

    微服务架构扩展前后端分离,提供更高效的服务设计。

  • RPC与Dubbo

    • RPC:分布式通信协议。
      -Dubbo:基于Java的高性能RPC框架。
  • 微服务优势

    • 高效率:服务拆分后提高性能。
    • 可扩展性:单点故障不影响整体系统。
  • 微服务设计实践

    • 设计接口:RESTful规范。
    • 版本控制:使用Semantic Versioning。
  • 微服务运作流程

    • 输入请求:客户端发送请求。
    • 内部处理:各服务按业务逻辑处理。
    • 集成:服务注册与发现。
  • 微服务优缺点

    • 优点:可扩展性强、灵活性高。
    • 缺点:开发复杂、运维难度大。
  • SOA与微服务区别

    • SOA:服务化架构,强调接口规范。
    • 微服务:更强调服务独立性,支持弹性扩展。
  • API管理

    • API网关:接收请求、路由、鉴权。
    • API门控:限流、监控、统计。
  • 服务熔与服务跟踪

    • 服务熔:实现服务容错,防止长时间调用。
    • 服务跟踪:跟踪服务调用链路,定位问题。
  • 有界上下文与双因素身份验证

    • 有界上下文:限制服务调用次数。
    • 双因素身份验证:结合证书和密码验证。
  • PACT在微服务中的作用

    • 提供跨服务测试支持,确保不同服务间兼容。
  • OAuth与端到端测试

    • OAuth:身份验证协议。
    • 端到端测试:确保整个应用流程的正确性。
  • 语义监控与跨功能测试

    • 语义监控:监控服务状态和性能。
    • 跨功能测试:测试多个服务协同工作。
  • 消费者驱动的合同

    • 确保服务之间的契约一致性,防止单点故障。
  • ZooKeeper相关面试题

  • ZooKeeper简介

    分布式的持久化键值存储系统,支持动态的数据集群。

  • ZooKeeper功能

    • 数据存储:基于文件系统。
    • 命名服务:基于ZAB协议。
    • 分布式锁:基于ZXID机制。
  • Znode类型

    • 持久节点(Ephemeral):临时存在。
    • 临时节点(Ephemeral):持久性更强。
  • ZooKeeper通知机制

    • Watcher机制:注册回调,响应节点状态变化。
  • ZooKeeper的典型应用

    • 分布式锁:防止多个进程同时修改同一资源。
    • 元数据管理:存储服务的配置信息。
  • ZooKeeper部署模式

    • 单机模式:单节点运行。
    • 多机模式:集群部署。
  • 常用命令

    • create:创建节点。
    • get:获取节点值。
    • delete:删除节点。
  • ZAB与Paxos算法

    • ZAB:基于Zookeeper的ABAB协议。
    • Paxos:基于共识算法实现高可用性共识。
  • ZooKeeper的优势

    • 高可用性:主节点故障后自动故障转移。
    • 灵活性:支持动态扩展和缩减。
  • ZooKeeper的缺点

    • 安全性:节点权限管理较为复杂。
    • 性能:在高并发下可能成为瓶颈。
  • ZooKeeper客户端

    • Java客户端:org.apache.zookeeper.client包。
  • ZooKeeper的典型应用场景

    • 服务发现与负载均衡。
    • 分布式锁实现。
  • ZAB与Paxos的联系与区别

    • ZAB基于Zookeeper实现,Paxos基于共识算法。
  • Chubby与ZooKeeper对比

    • Chubby:基于RAID存储,提供高可用性服务。
    • ZooKeeper:基于ZAB协议,提供分布式键值存储。
  • ZooKeeper的负载均衡与Nginx的区别

    • ZooKeeper:基于ZAB协议,适合静态数据存储。
    • Nginx:基于反向代理,适合动态请求转发。
  • 数据库相关面试题

  • 索引优化

    • 限制索引数目,避免过多索引。
    • 避免索引大对象和过长的索引。
  • 数据库引擎

    • MyISAM:适合读大写优化。
    • InnoDB:支持事务,适合写大。
  • 排序算法

    • 二叉搜索树、红黑树、B+树。
  • 并发控制

    • 乐观锁:使用版本号控制。
    • 悲观锁:锁竞争,使用时间戳。
  • 分布式锁

    • 基于Redis:通过Redisson实现。
    • 基于ZooKeeper:基于ZXID实现。
  • 两阶段提交协议

    • 准备阶段:记录操作日志。
    • 提交阶段:写入数据库。
  • Java并发编程相关面试题

  • 上下文切换

    • 调用线程方法时,由调度器切换上下文。
  • 死锁与活锁

    • 死锁:互相等待资源。
    • 活锁:资源被占用但无法释放。
  • 线程调度算法

    • Java使用优先级队列。
  • 线程组的使用

    • 不推荐使用,推荐使用ExecutorService。
  • Executor框架的作用

    • 提供任务执行和管理,简化并发编程。
  • 阻塞队列实现

    • 基于链接列表,支持生产者-消费者模型。
  • Callable与Future

    • Callable返回结果,Future异步获取。
  • FutureTask

    • 用于执行可中断的Callable任务。
  • 线程池实现

    • 使用Executor框架,提供任务执行的方式。
  • 线程同步方法

    • synchronized、lock、atomicReference、countDownLatch。
  • 线程唤醒

    • notify()和notifyAll()方法。
  • 线程的终止方式

    • 使用stop()或exit()方法。
  • 线程组与线程池对比

    • 线程组适合短任务,线程池适合长任务。
  • 线程池的工作流程

    • 接收任务:提交到任务队列。
    • 执行任务:由线程池中的线程处理。
    • 处理结果:将结果返回或存储。
  • 线程池的实现方式

    • 使用线程池框架(如ThreadPoolExecutor)。
  • 线程同步与互斥方法

    • synchronized关键字、ReentrantLock、atomic变量。
  • 线程生命周期

    • 新:创建线程。
    • 运行:执行任务。
    • 等待:等待条件满足。
    • 停止:线程终止。
  • 线程组的优缺点

    • 优点:简单易用。
    • 缺点:不支持优先级和中断操作。
  • 线程池的优缺点

    • 优点:支持并发、负载均衡、任务优先级。
    • 缺点:配置复杂,资源耗尽。
  • 线程的状态与终止方式

    • 状态:新、运行、等待、终止。
    • 终止方式:stop()、exit()、等待超时。
  • 转载地址:http://suwc.baihongyu.com/

    你可能感兴趣的文章
    numpy 或 scipy 有哪些可能的计算可以返回 NaN?
    查看>>
    numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
    查看>>
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    Numpy.VisibleDeproationWarning:从不整齐的嵌套序列创建ndarray
    查看>>
    Numpy:按多个条件过滤行?
    查看>>
    Numpy:条件总和
    查看>>
    numpy、cv2等操作图片基本操作
    查看>>
    numpy中的argsort的用法
    查看>>
    NumPy中的精度:比较数字时的问题
    查看>>
    numpy判断对应位置是否相等,all、any的使用
    查看>>
    Numpy多项式.Polynomial.fit()给出的系数与多项式.Polyfit()不同
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    numpy学习笔记3-array切片
    查看>>
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>