博客
关于我
Java初级开发技术面试题
阅读量:105 次
发布时间:2019-02-26

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

Java初级开发技术面试题

1. String与StringBuffer、StringBuilder的区别

线程安全性

  • String:对象不可变,线程安全。
  • StringBuffer:对方法和操作加了同步锁,线程安全。
  • StringBuilder:未加同步锁,非线程安全。

性能

  • String:每次修改生成新对象,性能较差。
  • StringBuffer:基于数组操作,效率高。
  • StringBuilder:相比StringBuffer性能稍优,但风险更高。

综上所述

  • 少量数据:使用String。
  • 单线程操作大量数据:使用StringBuilder。
  • 多线程操作大量数据:使用StringBuffer。

2. Java堆、栈、方法区的理解

  • 存放新对象(如String、Object等)和数组。
  • 可由所有线程共享,不存放其他对象引用。

  • 存放基本变量和对象引用地址。
  • 基本变量存储具体值,对象引用存储堆中的地址。

方法区

  • 包含类信息和静态变量。
  • 可由所有线程共享。

3. Java中的==equals方法区别

==

  • 比较对象的引用地址。
  • 基本类型按值比较,对象类型需指向同一对象。

equals

  • 默认基于==比较,重写后如String可按值比较。
  • 不重写时,equals==效果一致。

toString

  • 方法用于将对象转换为字符串。
  • 需重写toString方法实现内容输出。

4. ArrayList与LinkedList的区别

数据结构

  • ArrayList:基于动态数组,线程不安全。
  • LinkedList:基于双向链表,线程不安全。

性能

  • 随机访问:ArrayList优于LinkedList。
  • 插入删除:LinkedList优于ArrayList,但后期效率差。

适用场景

  • 数据量小:两者差异不大。
  • 特定需求:如栈、队列或双端队列时选LinkedList。
  • 数据量大:优先选择ArrayList。

5. HTTP与TCP协议理解

核心区别

  • 协议层级:HTTP在应用层,TCP在传输层。
  • 连接类型:HTTP为短连接,TCP为长连接。
  • 状态性:HTTP无状态,TCP可保持连接。

TCP连接特点

  • 可靠性:保证数据完整无误。
  • 流水线传输:无序序列化传输。
  • 流量控制:通过窗口大小机制。

HTTP/1.1的改进

  • 持久连接:通过Keep-Alive维持连接。
  • 多路复用:HTTP/2支持同时发送多个请求。

6. 内部类访问外部类成员的原因

编译器机制

  • 成员变量:编译器自动创建指向外部类对象的引用。
  • 构造方法:参数传递外部类引用,初始化成员变量。
  • 调用构造方法:默认传入外部类引用。

7. Ioc的理解

定义

  • 控制反转技术,减少硬编码依赖。
  • 使用容器管理对象生命周期和依赖关系。

工作流程

  • 依赖注入:通过容器获取实现类。
  • 装配:将类、接口和实现注册到容器。
  • 配置:通过配置文件或注解定义关联规则。

8. 接口不能实例化的原因

实例化含义

  • 在堆中分配内存,并存储对象属性。

接口特点

  • 静态属性和方法声明,实际值存储在数据区。
  • 没有实例化意义,占用内存空间。

9. 异常处理理解

定义

-捕捉和处理程序运行中出现的异常情况。

异常类型

  • 编译时异常:如FileNotFoundException
  • 运行时异常:如NullPointerException

处理方式

  • 编译时异常:必须声明处理,调用者需处理。
  • 运行时异常:不需声明,调用者可自由处理。

10. Spring Boot启动流程

步骤

  • 创建SpringApplication:初始化后续步骤。
  • 创建ApplicationContext:根据配置文件或注解选择类型。
  • 加载applicationListener:执行启动步骤。
  • 创建IOC容器:配置环境和注册Bean。
  • refresh()方法:完成IOC容器初始化。
  • 执行CommandLineRunner:启动应用。
  • 11. Spring Boot常用注解

    核心注解

    • @RestController@ResponseBody@Controller的结合。
    • @RequestMapping:定义请求映射,可结合@GetMapping
    • @Autowired:自动注入依赖Bean。
    • @Component:用于组件扫描。

    安注解

    • @SpringBootApplication:包含@Configuration@EnableAutoConfiguration等。
    • @Value:注入属性文件值。

    12. Spring MVC实现原理

    流程

  • DispatcherServlet:处理请求。
  • HandlerMapping:映射请求到处理器。
  • HandlerAdapter:适配处理器调用。
  • 处理器:执行业务逻辑,返回ModelAndView
  • ViewResolver:查找实际View。
  • DispaterServlet:渲染并返回结果。
  • 13. JVM类加载机制

    类加载器

    • 负责查找和装入类文件。
    • 类的装载分为验证、准备、解析、初始化阶段。

    14. sleep()wait()方法区别

    sleep()

    • 休眠指定时间,线程释放锁。
    • CPU空闲,其他线程继续执行。

    wait()

    • 放弃当前线程的对象锁,进入等待池。
    • 唤醒需notify()notifyAll().

    15. 性能测试CPU占用分析

    方法

  • 进程查看top命令。
  • 线程查看top -H -p
  • 堆栈查看jstackjconsole.
  • 16. 事务隔离级别

    级别

  • 未提交读:最低隔离,可能脏读。
  • 已提交读:修改未提交时不可读,可重复读。
  • 可重复读:解决不可重复读,防幻读。
  • 序列化:最高隔离,可能死锁。
  • 17. 脏读、不可重复读、幻读

    脏读

    • 修改未提交时,另一事务读取导致脏读。

    不可重复读

    • 修改后读取不同版本,数据不一致。

    幻读

    • 修改后插入新数据,读取到修改前数据。

    18. SQL书写顺序与执行顺序

    书写顺序

  • SELECT
  • FROM
  • JOIN
  • ON
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY
  • LIMIT
  • 执行顺序

  • FROM
  • JOIN
  • ON
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • ORDER BY
  • LIMIT
  • 19. MyISAM与InnoDB区别与作用

    MyISAM

    • 只支持表锁,不支持行锁。
    • 不支持事务、外键、崩溃恢复。

    InnoDB

    • 支持行锁和MVCC。
    • 支持事务、外键、崩溃恢复。

    适用场景

    • 读密集表:MyISAM优于InnoDB。
    • 写密集表:InnoDB优于MyISAM。

    20. SQL优化建议

    1. 建立索引

    • 索引字段参与WHEREORDER BY等。

    2. 避免全表扫描

    • 避免WHERE条件中的null!=<>等。

    3. 避免OR连接

    • 可能导致索引失效。

    4. 函数运算

    • 避免在索引字段上进行。

    5. 避免INNOT IN

    • 可能导致索引失效。

    6. 避免表达式操作

    • 避免在WHERE中使用表达式。

    7. 不使用SELECT *

    • 只返回需要的字段。

    21. 动态代理实现方式

    JDK动态代理

    • 基于反射,需目标对象实现接口。
    • 代理对象动态生成。

    CGLIB动态代理

    • 修改目标类字节码,生成子类代理。
    • 不需目标对象实现接口。

    区别

    • 依赖:JDK无需第三方库,CGLIB需。

    22. 事务传播行为

    支持级别

    • propagation_required:需传播,新事务或加入。
    • propagation_supports:支持传播,非事务模式下执行。
    • propagation_mandatory:强制传播,否则抛出异常。
    • propagation_nested:嵌套事务执行。
    • propagation_never:不支持传播。
    • propagation_requires_new:新建事务,挂起现有。

    23. Redis持久化

    RDB

    • 按快照方式异步持久化。
    • 二进制文件,恢复快。

    AOF

    • 记录每次命令,持久化方式。
    • 恢复时数据安全性高,但速度慢。

    同时使用

    • 可同时使用RDB和AOF。

    配置

    • appendonly配置文件设置。

    24. 缓存穿透与雪崩

    穿透

    • 缓存中无数据,数据库压力大。
    • 解决方案:校验、Bitmap、短期空值缓存。

    雪崩

    • 多线程同时失效,数据库压力大。
    • 解决方案:加锁、队列、预加载、双缓存。

    25. Cookie与Session分布式存储

    • 客户端存储,易于伪造,安全性差。

    Session

    • 服务器存储,存在内存或数据库。
    • 大型站点需专用Session服务器。

    分布式存储

    • 粘性Session:通过负载均衡器锁定服务器。
    • 持久化Session:存储在数据库或其他持久化存储。

    26. Spring循环依赖解决

    三级缓存机制

    • singletonObjects:一级缓存,已创建完成的单例。
    • earlySingletonObjects:二级缓存,未创建完成的单例。
    • singletonFactories:三级缓存,用于获取单例。

    工作原理

    • getEarlyBeanReference:支持 AwareBeanPostProcessor。
    • 三级缓存协调:确保循环依赖解决。

    27. Spring Boot跨域配置

    方法级别

    • @CrossOrigin注解,指定允许域名和有效期。

    全局配置

    • 定义 WebMvcConfigurer bean,注册全局CORS配置。

    示例

    • 自定义配置类,添加CORS映射。

    28. JVM垃圾回收算法

    基本算法

    • 引用计数:不可解决循环引用。
    • 标记-清除:内存碎片问题。
    • 复制算法:双倍内存占用。
    • 标记-整理:优化空间利用。

    分区算法

    • 增量收集:实时垃圾回收。
    • 分代收集:基于对象生命周期。

    并行收集

    • 多线程执行,提升效率。

    29. JVM内存管理

    ###垃圾回收线程与内存分配

    • 垃圾回收线程负责回收内存,内存分配线程负责分配。
    • 两者并发执行,提升性能。

    ###垃圾回收策略

    • 不同引用类型采用不同算法。
    • 结合内存管理策略优化性能。

    通过以上内容,希望能够全面覆盖技术面试中的核心问题,帮助应对面试挑战。

    转载地址:http://excu.baihongyu.com/

    你可能感兴趣的文章
    mysql 的存储引擎介绍
    查看>>
    MySQL 的存储引擎有哪些?为什么常用InnoDB?
    查看>>
    Mysql 知识回顾总结-索引
    查看>>
    Mysql 笔记
    查看>>
    MySQL 精选 60 道面试题(含答案)
    查看>>
    mysql 索引
    查看>>
    MySQL 索引失效的 15 种场景!
    查看>>
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>