Java基础面试题

基础

JDK、JRE、JVM是什么?

JDK 即为 Java 开发工具包,包含编写 Java 程序所必须的编译、运行等开发工具以及 JRE。开发工具如:

  • 用于编译 Java 程序的 javac 命令。
  • 用于启动 JVM 运行 Java 程序的 Java 命令。
  • 用于生成文档的 Javadoc 命令。
  • 用于打包的 jar 命令等等。

JRE 即为 Java 运行环境,提供了运行 Java 应用程序所必须的软件环境,包含有 Java 虚拟机(JVM)和丰富的系统类库。系统类库即为 Java 提前封装好的功能类,只需拿来直接使用即可,可以大大的提高开发效率。

JVM 即为 Java 虚拟机,提供了字节码文件(.class)的运行环境支持。

机器码与字节码的区别

字节码是一种包含执行程序、由一系列操作码和数据对组成的二进制文件。

字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能称为机器码。

数据类型与程序结构

String、StringBuffer、StringBuilder的区别?

  • String ,是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。
  • StringBuffer/StringBuilder 类,表示的字符串对象可以直接进行修改。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被 synchronized 修饰,因此它的效率也比 StringBuffer 要高。

什么是自动拆箱装箱?

自动装箱和拆箱,就是基本类型和引用类型之间的转换。

自动装箱拆箱可以让我们的代码更简练:在Java5之前,集合中不能存入原始类型的值,因为集合只接收对象。

final、finally、finalize 的区别?

  • final:final ,是修饰符关键字。 如果一个类被声明为 final ,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为 final 的。将变量或方法声明为 final ,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重写。
  • finally:在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。但是在以下特殊情况中,finally块不会被执行: 在前面的代码中用了 System.exit() 退出程序。程序所在的线程死亡。
  • finalize:finalize是方法名。Java 允许使用 #finalize() 方法,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。

java程序的结构?

  • 顺序结构
  • 选择结构:if else
  • 循环结构: while、do while、for

值传递与引用传递的区别?

在方法调用时,通常需要传递一些参数来完成特定的功能。Java语言提供了两种参数传递的方式:值传递与引用传递。

  • 值传递:在方法调用中,实参会把它的值传递给形参,形参只是实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此对形参的改变不会影响实参的值。
  • 引用传递:在方法调用中,传递的是对象,这时形参与实参的对象指向同一块存储单元,因此对形参的修改就会影响实参的值。

如何实现main()方法执行前执行代码块

在Java语言中,由于静态块在类被加载时就会被调用,因此可以在main()方法执行前,利用静态块实现输出"hello world"的功能。

由于静态块不管顺序如何,都会在main()方法之前执行,因此,即使static代码块写在main()方法之后,它都依然在main()方法之前执行。

面向对象

什么是面向对象?

面向对象是一种思想,世间万物都可以看做一个对象。面向对象软件开发具有以下优点:

  • 代码开发模块化,更易维护和修改。
  • 代码复用性强。
  • 增强代码的可靠性和灵活性。
  • 增加代码的可读性。

面向对象的特征?

封装、继承、多态、抽象。

java类的定义/组成?

  • 类的定义由访问级别、类型、类名、是否抽象、是否静态、泛型标识、继承或实现关键字、父类或接口名称等组成。
  • 类的访问级别有public和无访问控制符。
  • 类的类型为class、interface、enum。

相关demo:System.out.println();语句不写在方法内会报错。

public class Test{
    public static void main(String[] args){
        System.out.println("Hello World");
    }
        System.out.println("Hello World");//此处编译器报错
}

== equals()

  • ==比较 基本类型:比较的就是值是否相同。引用类型:比较的就是地址值是否相同。
  • equals: 引用类型:默认情况下,比较的是地址值。两个对象的hashCode相同,equals方法不一定为true。

更多Java后端面试题

#八股文##java##面试题#
Java后端专栏 文章被收录于专栏

[持续更新中,有问题可以私信我] Java、Spring、数据库、缓存、消息队列、微服务

全部评论

相关推荐

后端开发实习生 - 技术一面(oc已拒)面试问题速览1. 自我介绍一下。2. 大学课程和专业背景是什么?3. 为什么在学习了C++之后,选择Java和Python作为主攻方向?4. 你的学习方法是怎样的?如何保证学习的系统性?5. 具体谈谈你是如何学习Java的?6. 详细介绍一下你的AI Agent项目,它是如何实现的?7. 你使用的Spring AI框架和常见的开源基座有什么区别?8. 你的知识库是如何构建的?为什么选择自定义数据处理流程?9. 如果需要开发一个能扮演特定游戏角色的定制化Agent,你会如何设计?10. 在这个定制化Agent项目中,数据的重要性如何?如何获取和处理这些数据?11. Docker和K8s有什么区别?12. 微服务架构和单体架构的区别与优势是什么?13. 如何设计一个高并发系统的架构?14. 常见的负载均衡算法有哪些?15. Java中遇到死锁该如何分析和解决?16. 如何处理前端的跨域问题?17. MySQL查询性能如何优化?18. 你对前端技术了解多少?我的回答策略与核心亮点针对问题:开场自我介绍,展示个人技术全貌回答策略/框架:我采用了“技术栈 → 项目经验 → 学习理念 → 全栈能力”的结构化叙述方式,旨在快速建立一个技术扎实、有实践、爱钻研的立体形象。核心案例与亮点:项目经验具体化:通过“库存管理系统”引出性能优化能力(ES提升检索、RocketMQ削峰、Redis缓存热点)。突出前沿技术:通过“智慧农业项目”展示AI应用开发能力(Spring AI, RAG问答引擎),并用“大创国家级”奖项来量化成果。展现学习深度:主动提及学习MIT课程并实现Raft算法,强调自己对底层原理的追求和强大的自驱力。针对问题:考察学习能力、技术视野和决策逻辑回答策略/框架:我提出了一个“实践驱动”的学习模型:“先概览框架 → 快速上手实战 → 深入底层查漏补缺”。对于技术选型问题,我从“场景适用性”(如C++底层 vs. Java业务)和“技术趋势”(如Python for AI)两个维度进行阐述,展示了我的决策逻辑。核心案例与亮点:这个回答的亮点不在于某个具体案例,而在于其方法论本身。它向面试官清晰地传递了我的核心优势:拥有高效、系统化的自学能力,能够快速掌握并应用新技术,同时具备清晰的技术判断力。针对问题:深入考察AI应用项目的技术实现细节和原理理解回答策略/框架:我采用了“What-How-Why”的解释框架。What:这是一个基于Spring AI的RAG Agent。How:通过添加外部知识库、使用Redis持久化对话记忆等方式实现。Why:着重解释了为何自定义数据处理流程(PDF转Markdown、语义分块、向量化),而不是直接使用框架自带功能。核心案例与亮点:本环节最大的亮点在于对“PDF按页切分会破坏语义完整性,从而影响检索精度”这一细节的深入分析。这不仅展示了我对RAG原理的深刻理解,更体现了我在工程实践中追求细节、主动优化、解决问题的能力。此外,在回答定制化Agent问题时,我提出了从提示工程 → RAG → 模型微调 (LoRA) 的分层解决方案,展现了全面的技术视野和对成本效益的考量。针对问题:考察后端核心架构与概念(分布式、高并发、数据库等)回答策略/框架:对于架构设计类问题(如高并发),我采用“多维度拆解法”,从多级缓存、熔断机制、高可用架构(主从/集群)等多个角度系统性地展开。对于概念类问题(如死锁),我采用“原理+解决方案”的模式,先清晰阐述其形成的四个必要条件,再讲解如何通过破坏其中条件来解决。核心案例与亮点:回答的系统性和深度是关键。例如,在谈论负载均衡时,不仅能罗列出轮询、哈希等算法,还能进一步分析“最少连接/空闲实例算法”相比于简单轮询的优势,这体现了对技术背后原理的深入思考,而非简单背诵。针对问题:考察技术广度和知识边界(前端/容器)回答策略/框架:对于熟悉的部分(前端跨域),同样采用“原理+解决方案”模式,并提供了前端(反向代理)和后端(CORS配置)两种维度的解法,展示了全栈视野。对于不熟悉的部分(K8s),采取“诚实承认+阐述已知基础”的策略,先表明自己主要使用Docker Compose,然后从理论层面尽力对比二者。核心案例与亮点:对跨域问题的双端解决方案是加分项。同时,坦诚自己对K8s实践经验不足,并尝试进行理论分析,展现了诚实和积极思考的态度。这也提醒大家,面试中遇到知识盲区,诚实是最好的策略,如果能补充一些理论理解会更好。
查看18道真题和解析
点赞 评论 收藏
分享
评论
9
31
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务