Java基础面试题day01

一、说一下Java的特点

  1. 平台无关性:这是Java最核心的特点,也叫"一次编写,到处运行"。Java代码编译后生成字节码(.class文件),不是直接编译成机器码,而是由JVM(Java虚拟机)解释执行,只要不同平台(Windows、Linux、Mac)安装了对应版本的JVM,就能运行相同的字节码,不用修改代码。

  2. 面向对象:Java是纯面向对象编程语言(除了基本数据类型),核心是"万物皆对象",封装、继承、多态三大特性贯穿始终,能让代码更具复用性、扩展性,也更符合人类的思维逻辑。

  3. 内存管理:Java自带垃圾回收机制(GC),程序员不用手动分配和释放内存,JVM会自动识别并回收不再使用的对象,减少内存泄漏的风险,降低了开发难度,但也意味着程序员对内存的控制能力变弱。

二、Java的优势和劣势是什么

  1. 优势

<1> 平台无关性:刚才说过,这是Java的"王牌",跨平台能力强,也是企业级开发首选的重要原因(一次开发,多平台部署,降低运维成本)。

<2> 面向对象:封装、继承、多态,让代码结构清晰,易于维护和扩展,适合大型项目开发(比如电商、金融系统)。

<3> 内存管理:GC自动回收内存,减少手动操作,降低内存泄漏、野指针等问题,提升开发效率,降低入门门槛。

<4> 生态成熟:Java发展了20多年,生态极其完善,框架(Spring、SpringBoot、MyBatis)、工具(IDEA、Maven)、类库应有尽有,遇到问题能快速找到解决方案,社区支持强大。

<5> 安全模型:Java有严格的安全机制,比如字节码校验、沙箱机制,能防止恶意代码执行,适合开发企业级安全应用(比如银行系统、支付系统)。

<6> 稳定性:Java的语法严谨,异常处理机制完善,运行过程中不易崩溃,能保证系统长期稳定运行,这也是企业级应用看重的点。

<7> 多线程支持:Java内置多线程相关的类(Thread、Runnable)和锁机制,能轻松实现多任务并发,适合处理高并发场景(比如秒杀、直播)。

  1. 劣势

<1> 性能劣势:Java代码需要经过"编译成字节码+JVM解释执行",比C、C++等编译型语言慢,虽然JIT(即时编译)能优化,但在极致性能场景(比如操作系统、嵌入式开发)还是不如编译型语言。

<2> 语法繁琐:Java语法比较严格,比如必须写类、必须有main方法(入门程序),相比Python、JavaScript,代码量更多,入门门槛稍高。

<3> 内存消耗:JVM运行需要占用一定的内存,而且GC回收内存时会有一定的开销,相比C语言,Java程序的内存占用更高。

<4> 开发效率:语法繁琐+配置复杂(比如传统SSM框架),相比Python、Go,开发速度较慢,尤其是小型项目,显得有些"笨重"。

三、Java为什么是跨平台的

核心答案:依赖JVM(Java虚拟机)

  1. 其他语言(比如C语言):代码直接编译成对应平台的机器码,不同平台(Windows、Linux)的机器码格式不同,所以不能跨平台。

  2. Java:代码先通过javac编译器编译成字节码(.class文件),字节码不是任何平台的机器码,而是一种"中间代码";然后由对应平台的JVM将字节码解释(或编译)成该平台的机器码,最终执行。

  3. 关键:JVM是跨平台的核心,不同平台有不同版本的JVM(Windows版JVM、Linux版JVM),但它们都能识别相同的Java字节码,从而实现"一次编写,到处运行"。

一句话总结:Java跨平台的本质,是JVM帮我们屏蔽了不同平台的底层差异,字节码作为中间载体,实现了代码与平台的解耦。

四、JVM,JDK,JRE三者的关系

  1. JVM(Java Virtual Machine,Java虚拟机):

核心作用:执行Java字节码,是Java跨平台的核心。它不包含任何Java类库,也不能直接运行Java程序(需要依赖类库),只负责将字节码翻译成机器码并执行。

  1. JRE(Java Runtime Environment,Java运行环境):

核心作用:提供Java程序运行所需的环境。它包含JVM + Java核心类库(比如String、ArrayList等基础类),简单说:有JRE,就能运行已经编译好的Java程序(.class文件),但不能开发、编译Java代码。

  1. JDK(Java Development Kit,Java开发工具包):

核心作用:提供Java程序的开发、编译、运行环境。它包含JRE + 开发工具(比如javac编译器、java运行工具、jar打包工具等),简单说:有JDK,就能编写、编译、运行Java程序,是程序员必备的工具包。

关系总结(一句话记牢):JDK > JRE > JVM,JDK包含JRE,JRE包含JVM。

五、JVM和Java有什么区别

  1. 本质不同:Java是一种编程语言 ,有自己的语法规则、关键字、数据类型,是程序员编写代码的"语言";JVM是一种虚拟机,是一个软件,负责执行Java代码编译后的字节码。

  2. 依赖关系不同:Java代码不能直接运行,必须依赖JVM才能执行;而JVM的核心作用就是支持Java代码的运行,也可以支持其他能生成Java字节码的语言(比如Scala、Kotlin)。

简单类比:Java是"写好的剧本",JVM是"演剧本的演员",没有演员,剧本无法呈现;演员的核心工作,就是把剧本(字节码)转化为观众能看懂的内容(机器码执行结果)。

六、为什么Java解释和编译都有

核心答案:兼顾跨平台和性能

  1. 解释执行(核心目的:跨平台):Java代码编译后生成字节码,JVM默认会逐行解释字节码,将其转化为机器码执行。这种方式的好处是跨平台性强,只要有JVM,就能解释执行字节码,不用针对不同平台重新编译。

  2. 编译执行(核心目的:提升性能):解释执行的效率较低,所以Java引入了JIT(即时编译)技术。JIT会监控字节码的执行情况,将频繁执行的代码(热点代码)一次性编译成机器码,并存放在内存中,后续再执行这部分代码时,直接调用机器码,不用再逐行解释,大幅提升运行效率。

总结:Java不是纯解释型语言,也不是纯编译型语言,而是"解释+编译"的混合执行模式,既保证了跨平台性,又兼顾了运行性能,扬长避短。

七、JVM是什么

JVM(Java Virtual Machine,Java虚拟机),是一个虚构的计算机,本质是一个软件,运行在真实的操作系统上。

核心作用有3个:

  1. 执行字节码:将Java编译后的.class文件(字节码)解释或编译成对应平台的机器码,让Java程序能运行。

  2. 管理内存:负责Java程序的内存分配、回收(GC垃圾回收),避免内存泄漏。

  3. 屏蔽平台差异:不同平台的JVM能识别相同的字节码,实现Java的跨平台特性。

补充:JVM只认识字节码,不认识Java源代码,所以Java代码必须先编译成字节码,才能被JVM执行。

八、编译型语言和解释型语言有什么区别

核心区别:是否生成目标平台的机器码,用表格对比更清晰:

  1. 编译型语言(代表:C、C++)

执行流程:源代码 → 编译器 → 目标平台机器码 → 运行

特点:一次性将所有源代码编译成机器码,后续运行直接执行机器码,运行速度快 ;但编译后的机器码依赖特定平台,不能跨平台,修改代码后需要重新编译。

  1. 解释型语言(代表:Python、JavaScript)

执行流程:源代码 → 解释器 → 逐行解释成机器码 → 运行

特点:不生成机器码,逐行解释、逐行执行,跨平台性强 (不同平台有对应解释器);但逐行解释需要消耗时间,运行速度慢,修改代码后无需重新编译,直接运行。

补充:Java是混合模式,介于两者之间,既编译(生成字节码),又解释(JVM解释字节码),兼顾跨平台和性能。

九、Python和Java的区别是什么

  1. 语言类型:Java是静态类型语言 ,变量必须声明类型(比如int a = 10),编译时检查类型错误;Python是动态类型语言,变量不用声明类型(比如a = 10),运行时才检查类型错误。

  2. 执行效率:Java是"编译+解释"混合执行,运行效率远高于Python(Python是纯解释执行,逐行解释,速度慢)。

  3. 开发效率:Python语法简洁、代码量少,不用写类、不用声明变量类型,开发速度快;Java语法繁琐、代码量多,开发效率低于Python。

  4. 应用场景:Java侧重企业级后端开发 (电商、金融、分布式系统)、Android开发;Python侧重数据分析、人工智能、爬虫、自动化测试,也能做后端,但适合小型项目。

  5. 生态:Java生态侧重企业级开发,框架成熟(Spring、SpringBoot);Python生态侧重数据、AI领域,库丰富(Pandas、TensorFlow)。

十、值传递和引用传递的区别是什么

Java面试重中之重,记住:Java只有值传递,没有引用传递!

  1. 核心定义:

值传递:传递的是变量的副本(值本身),修改副本的值,不会影响原变量的值。

引用传递:传递的是变量的引用地址,修改引用指向的内容,会影响原变量的值。

  1. 区别对比:

<1> 传递内容不同:值传递传"副本",引用传递传"地址"。

<2> 对原变量影响不同:值传递修改副本,不影响原变量;引用传递修改地址指向的内容,会影响原变量。

  1. Java的特殊点:

Java中,基本数据类型(int、char、double等)是值传递;引用数据类型(对象、数组)看似是"引用传递",其实本质还是值传递------传递的是"对象的引用地址的副本"。

举个例子:用方法修改对象的属性,会影响原对象(因为副本地址和原地址指向同一个对象);但用方法修改引用本身(比如重新new一个对象),不会影响原对象(因为副本地址变了,原地址还是指向原来的对象)。

相关推荐
葫芦和十三14 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp15 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑15 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯16 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan18 小时前
多Agent之间的区别
后端
青石路20 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充20 小时前
1.面向对象设计思想
后端
IT_陈寒21 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro21 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗21 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端