Java基础面试题

Java为什么是跨平台的?

Java能支持跨平台,主要和jvm(java虚拟机)关系比较大。jvm也是一个软件,不同的平台就有不同的jvm版本。我们所编写的java源码,首先会被编译成.class文件,也就是字节码文件,然后才会通过jvm翻译成特定平台的机器码文件运行。也就是说,只要在不同平台上安装对应版本的jvm虚拟机,就能让没有进行改变的java程序实现不同平台的运行,达成"一次编译,到处运行"。

JVM、JDK、JRE三者关系?

1、JVM是java虚拟机,负责将Java程序字节码转换成机器码文件运行,jvm还提供了垃圾回收,内存管理等功能,是Java跨平台特性的关键。

2、JDK是Java开发工具包,是开发Java程序所需的工具集合,其提供了jvm、编译器、调试器等开发工具,以及一系列的类库。JDK提供了开发、编译、调试和运行Java程序全部工具和环境。

3、JRE是Java运行环境,其提供了Java程序最小运行环境。包含了jvm和一系列java程序开发的类库,用于支持Java程序的运行。

为什么Java同时包含解释和编译?

Java同时采用编译和解释,是为了兼顾跨平台性、启动速度和运行性能。Java先将源码编译成平台无关的字节码,运行时通过jvm将字节码解释为机器码保证快速启动。对于频繁执行的热点代码,JIT会将这部分热点代码编译成本地机器码,以后直接执行机器码。

JVM是什么?

jvm是Java虚拟机,负责将字节码文件映射到本地CPU指令集和操作系统的系统调用。并且jvm屏蔽了操作系统相关信息,使得Java程序仅仅需要生成在jvm上运行的字节码文件即可在不同平台上运行。

编译性语言和解释性语言的区别?

编译性语言是类如C和C++语言,整个源代码会被编译成机器码或字节码,生成可执行文件。执行时直接运行编译后的代码,速度快,但跨平台性较差。

解释性语言是类如python和JavaScript语言,运行时会将代码一行一行的解释运行,不生成可执行文件。通常由解释器动态解释并执行代码,跨平台性较好,但是执行速度较慢。

Java和python的区别是什么?

Java是一种半编译性半解释性语言,运行时会将源代码编译成字节码文件,再由jvm运行字节码文件,热点代码则会通过JIT编译成本地机器码。

而python是一种解释型语言,运行时会将代码逐行解释运行,开发效率较高,但是执行速度较慢。

八种基本数据类型?

数值型:整数 类型(byte 、short 、int 、long)和浮点类型(float 、double)

字符型:char

布尔型:boolean

int和long是多少位的,多少字节的?

int是32位4字节的,int 是有符号整数 类型,其取值范围是从 -2^31 到 2^31-1 。long是64位8字节的,long 类型也是有符号整数 类型,它的取值范围是从 -2^63 到 2^63 -1。

int和long类型能够相互转化吗?

int类型为32位的,long类型为64位的,所以int转long类型可以顺利转化,但是long转int会造成精度丢失。

数据类型转换方式都有哪些?

自动类型转换(隐式转换):当目标类型的范围大于源类型时,Java 会自动将源类型转换为目标类型,不需要显式的类型转换。例如,将 int 转换为 long 、将 float 转换为 double 等。

强制类型转换(显式转换):当目标类型的范围小于源类型时,需要使用强制类型转换将源类型转换为目标类型。这可能导致数据丢失或溢出。例如,将 long 转换为 int 、将 double 转换为 int 等。

类型互转会出现什么问题?

当把小范围数据类型赋值给大范围数据类型时,Java 会自动进行类型转换,这种转换一般是安全的。但是大范围数据类型赋值给小范围数据类型时,会发生数据数据溢出或者精度损失的问题。

数据溢出:如果大范围数据类型赋值给小范围数据类型时,当目标类型无法容纳原数据时,就会发生数据溢出。

精度损失:在进行浮点数类型的转换时,可能会发生精度损失。由于浮点数的表示方式不同,将一个单精度浮点数( float )转换为双精度浮点数( double )时,精度可能会损失,如 double 转换为 int 也会发生精度损失的问题。

为什么用bigDecimal而不同double?

double 会出现精度丢失的问题,double 执行的是二进制浮点运算,二进制有些情况下不能准确的表示一个小数。那么我们如果在进行商品价格计算的时候,就会出现问题。很有可能造成我们手中有0.06元,却无法购买一个0.05元和一个0.01元的商品。这无疑是一个很严重的问题,尤其是当电商网站的并发量上去的时候,出现的问题将是巨大的,可能会导致无法下单,或者对账出现问题。

而 Decimal 是精确计算 , 所以一般牵扯到金钱的计算 , 都使用 Decimal。Decimal为十进制精确计算,避免了double出现的舍入误差。

装箱和拆箱的区别?

装箱是把基本数据类型转化成对应的包装类对象,拆箱是把包装类对象转化成基本数据类型。Java5之后支持自动装箱和自动拆箱,本质是编译器在编译期自动调用 valueOf()xxxValue() 方法。

Integer相比int有什么优点?

int是基本数据类型,而Integer是一种引用数据类型,并且是int的包装类。Integer能实现自动装箱和自动拆箱,这使得Java程序员能更加方便地进行数据类型转换。

那为什么还要保存int类型?

因为int类型是基本数据类型,变量对应的内存块直接存储数据本身。而Integer是引用数据类型,对象本身和引用是分开存储的。因此,基本数据类型再读写效率方面比引用数据类型更加高效。除此之外,在64 位JVM 上,在开启引用压缩的情况下,一个Integer 对象占用16 个字节的内存空间,而一个int 类型数据只占用4字节的内存空间,前者对空间的占用是后者的4倍。这说明存储效率也是基本数据类型更优。

Integer缓存

Java中的Integer类内部实现了一个静态缓存池,用于存储特定范围值内的Integer对象,范围是-128到127,当通过Integer.valueOf(int) 方法创建一个在这个范围内的整数对象时,并不会每次 都生成新的对象实例,而是复用缓存中的现有对象,会直接从内存中取出,不需要新建一个对象。

相关推荐
indexsunny1 小时前
互联网大厂Java求职面试实战:基于电商场景的技术问答及解析
java·spring boot·redis·kafka·security·microservices·面试指导
Forget_85502 小时前
RHEL——LVS模式
java·开发语言·lvs
渣瓦攻城狮2 小时前
互联网大厂Java面试:从数据库连接池到分布式缓存及微服务
java·redis·spring cloud·微服务·hikaricp·数据库连接池·分布式缓存
罗超驿2 小时前
13.1 万字长文,深入解析--抽象类和接口
java·开发语言
A懿轩A2 小时前
【Java 基础编程】Java 面向对象进阶:static/final、抽象类、接口、单例模式
java·开发语言·单例模式
lifallen2 小时前
后缀数组 (Suffix Array)
java·数据结构·算法
EmbedLinX3 小时前
C语言标准库stdlib.h
c语言·开发语言·笔记
逆境不可逃3 小时前
LeetCode 热题 100 之 76.最小覆盖子串
java·算法·leetcode·职场和发展·滑动窗口
I_LPL3 小时前
day35 代码随想录算法训练营 动态规划专题3
java·算法·动态规划·hot100·求职面试