八股文第一天:Java基础常见面试题总结1

本文详细探讨了Java语言的主要特点,包括面向对象、平台无关性、多线程支持、安全性以及网络编程友好性。同时,阐述了Java的字节码机制,解释了JVM、JDK和JRE之间的关系,以及编译与解释并存的执行方式。文章还对比了Java与C++的区别,并介绍了Java中的关键字、注释、变量、方法、数据类型、内存管理和运算符等方面的知识。此外,讨论了浮点数精度问题、静态方法与非静态成员的调用限制,以及自动装箱和拆箱的概念。最后,提到了BigInteger和BigDecimal在处理大整数时的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java语言有哪些特点

1.简单易学
2.面向对象(继承、封装、多态)
3.平台无关性(Java虚拟机实现平台无关性)
4.支持多线程(C++没有自己内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,但Java语言提供多线程支持)
5.可靠性
6.安全性
7.支持网络编程并且很方便(Java语言诞生本身就是为了简化网络编程设计的,因此Java不仅支持网络编程,而且很方便)
8.编译和解释共存

JVM vs JDK vs JRE

JVM是运行Java的虚拟机,根据不同系统都有实现,目的是使用相同的字节码运行会给出相同的结果,JVM是实现“一次编译,随处可以运行的关键所在“
JVM并不是只有一种。任何个人、企业、公司组织都可以开发自己的专属JVM

JDK是Java Development kit 的缩写,是功能齐全的JavaSDK,拥有JRE拥有的一切,他还有编译器和工具,可以创建和编译程序。
JRE是Java运行的时候需要的环境,包括JVM,Java库,Java命令和其他的一些基础构建,但是不能用于创建新程序。

如果只是要运行Java的话,那么安装JRE就可以了
不过如果你需要在应用程序服务器中应用Java程序,也需要JDK。
因为应用程序会将JSP转换为Java servlet,并且需要使用JDK来编译servlet。

什么是字节码 使用字节码的好处是什么

字节码就是.class拓展名的文件,他是JVM能理解的代码。他不面向任何特定的处理器,只面向虚拟机,Java通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,又保留了解释型语言可移植的特点。
因此Java语言运行时相对来说还是高效的(和C++ Rust Go还是有差距) 由于字节码并不针对某种特定的机器,因此Java不需要重新编译就可以在多种不同操作系统的计算机上运行。
在这里插入图片描述

为什么不全使用AOT

CGLIB动态代理使用的是ASM技术,大概就是在运行的时候直接在内存中生成并且加载修改后的字节码,也就是.class文件,如果全部使用AOT,也就不能用ASM技术了,为了支持类似的动态特性,选择使用JIT即时编译器,而不完全用AOT

说说Java语言“编译与解释并存”?

编译类: C++ C Go Rust 执行速度比较快,开发效率比较低。
会将源码一次性地翻译成可被平台执行的机器码。
解释型: Python JavaScript PHP 会通过解释器一句一句地将代码解释为机器代码后执行,开发效率比较快,执行速度比较慢。
Java语言既有编译类语言的特征, 也有解释类语言的特征,因为Java要经历先编译 后解释的两个环节,由Java编写的程序需要先编译生成字节码(.class)文件,这种字节码必须由Java解释器来解释执行。

Oracle JDK vs Open JDK

Java和C++的区别

1.Java不提供指针来直接访问内存,程序内存更加安全
2.Java的类是单继承的,C++的类是多继承的,虽然Java的类不支持多继承,但是接口可以多继承
3.Java有GC 自动内存管理垃圾回收机制,不需要程序员手动释放无用内存
4.C++同时支持方法重载和操作符重载,但是Java只支持方法重载(操作符重载增加了复杂性,这与Java最初的设计理念不符)

注释有哪几种形式

文档注释、单行注释、多行注释
但是如果代码足够简洁 代码就是最好的注释

标识符和关键字的区别是什么

在编写程序的时候,需要大量地为程序、类、变量取名字。于是就有了标识符,简单来说标识符就是一个名字。
有些标识符有了特定的含义,他就成了关键字

Java语言关键字有哪些

在这里插入图片描述

自增自减

移位运算符

double float 不支持移位运算
实际上支持的只有int 和 long,编译器在对short、byte、char类型进行移位前,都会将其转换为Int再进行操作
如果移位地位数超过占有的位数,会先取余 再移位。

continue、break、return的区别是什么

变量

语法形式:成员变量是属于类的 局部变量是代码块或方法中定义的变量或方法 成员变量可以被public,private,static等修饰符修饰,但是局部变量不能被访问控制修饰符以及static修饰。但是他们都能被final修饰。
存储方式: 如果成员变量被static修饰,那么这个成员变量属于类,如果没有static修饰,这个成员变量就属于实例。 对象存在于堆内存,局部变量存在于栈内存。
生存时间:成员变量是对象的一部分,随着对象的创建和消亡跟随,局部变量随着方法的调用和结束跟随。
默认值:成员变量如果没被赋初值,会自动以默认形式赋值(如果被final修饰必须显示赋值) 局部变量不会自动赋值。

对于静态变量来说 无论一个类创建了多少个对象,他们都共享同一份静态变量,一般情况下,静态变量会被Final修饰为常量

字符型常量和字符串常量的区别

字符型是单引号的一个字符 字符串常量是双引号引起的
字符型常量相当于一个整型值 ASCII 可以参加表达式运算,字符串常量代表一个地址值。
字符型占2字节,字符串占若干字节。

方法

为什么静态方法不能调用非静态成员?
静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问,但非静态对象属于实例对象,只有在对象实例化之后才会存在,需要通过类的实例对象去调用访问。
在类的非静态成员不存在的时候静态成员就已经存在了,因此调用内存中还不存在的非静态成员,属于非法操作。

Java中几种基本数据类型

基本类型和包装类型的区别

成员变量包装类型不赋值就是null 基本类型有默认值且不是null
包装类型可以用于泛型 但是基本类型不可以
基本数据类型的局部变量放在Java虚拟机栈中的局部变量表中,基本数据类型的成员变量放在Java虚拟机的堆中。 包装类型属于对象类型,几乎所有的对象实例都存在于堆中。
相比于对象类型,基本类型占用的空间非常小。

为什么说是几乎所有的实例对象都在堆中呢,是因为HotSpot虚拟机引入JIT优化之后,会对对象进行逃逸分析,如果发现某一个对象没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,从而避免堆上分配内存。

基本数据类型存放在栈中是一个误区! 如果没有被Static修饰,就存在于堆中。
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。

自动装箱和拆箱?

Integer i = 10 等价于 Integer i = Integer.valueOf(10)
int n = i 等价于 int n = i.intValue()
如果频繁拆装箱的话,也会严重影响系统的性能,因此应该尽量避免不必要的拆装箱操作。

为什么浮点数运算有时候会有丢失精度的风险

无限循环的小数存储在计算机的时候会被截断,这样就会导致小数精度发生损失。

如何解决浮点数运算的精度丢失问题

BigDecimal 不会造成精度损失

超过Long整形的数据应该如何表示?

BigInteger

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SCU Polars

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值