Java面试题汇总(持续更新.....)

Java面试题

1. JVM & JDK & JRE

Java虚拟机(JVM)是运行Java字节码的虚拟机,JVM有针对不同系统的特定实现,目的是使用相同的字节码,他们都会给出相同的结果。字节码和不同系统的JVM实现是Java语言“一次编译、随处可以运行”的关键。

在这里插入图片描述

JDK和JRE

JDK是功能齐全的Java SDK,提供给开发者使用,能够创建和编译Java程序的开发套件。包含了JRE,同时还包含了编译java源码的编译器javac、调试器jdb、等一系列工具。

JRE是Java运行时环境,他是运行已编译Java程序所需的所有内容的集合,主要包括Java虚拟机(JVM)、Java基础类库(Class Library)。

JRE是Java运行时环境,仅包含Java应用程序运行时环境和必要的类库。JDK包含JRE

在这里插入图片描述

2. 什么是字节码?采用字节码有什么好处?

字节码就是(.class文件),他不面向任何特定的处理器,只面向虚拟机。Java语言通过字节码的形式,在一定程度上解决了传统解释型语言执行效率低的问题。同时保留了解释型语言可移植特性。所以,Java程序运行时相对高效(但是和C、C++、Go相比仍有差距)。而且,由于字节码并不针对一种特定的机器,因此Java程序无需重新编译便可在多种 不同操作系统上运行。

3. JIT(just-in-time compliation)编译器

Java程序从源代码到运行的过程
在这里插入图片描述
在 .class->机器码这一步。JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会比较慢,而且,有些方法和代码块是经常需要被调用的(即热点代码),所以引进了JIT编译器,JIT属于运行时编译,当JIT编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。 机器码的运行效率肯定是高于Java编译器的,因此Java是编译与解释共存的语言
在这里插入图片描述

HotSpot采用了惰性评估的做饭,根据二八定律,消耗大部分系统资源的只有一小部分代码(热点代码),而这正是JIT所需要编译的部分 。

4. JDK、JRE、JVM、JIT的关系

在这里插入图片描述

5. Java位运算符

Java提供了一系列位运算符,这些运算符主要用于操作整数类型(int、long、short、byte),使用位运算符转换成的指令码运行起来更加高效。

  • << : 左移运算符,高位丢弃,低位补零。x<<1 相当于x*2(不溢出的情况下)。
int value = 0b0001;  // 1
int result = value << 2;  // 左移2位,结果为 0b0100,即4
  • .>>:带符号右移,向右移动若干位,高位补符号位,低位丢弃。正数高位补0,负数高位补1.x>>1 相当于 x/2
int value = 0b0100;  // 4
int result = value >> 2;  // 结果为 0b0001,即1
  • .>>>:无符号右移,将位向右移动指定位数,左边空出的位用0填充,无论正负。
int value = -1;  // 所有位为1
int result = value >>> 1;  // 结果为将最高位的1转换为0,其余位保持1
  • & :按位与:对两个位进行运算,只有在两个相应位都是1时,结果位1.
int flags = 0b11010;  // 二进制表示 0b表示二进制数
int mask = 0b11000;   // 要保留的位
int result = flags & mask;  // 结果为 0b11000
  • ^ : 按位异或 :对两个位进行运算,如果两个相应位一个位1一个为0,则结果为1.
int flags = 0b11010;
int toggle = 0b10101;
int result = flags ^ toggle;  // 结果为 0b01111
  • |:按位或:对两个位进行运算,如果两个位至少有一个为1,则结果位1.
int flags = 0b11010;
int mask = 0b00101;
int result = flags | mask;  // 结果为 0b11111
  • ~:按位取反:对位进行单操作,将1变成0,将0变成1.
int flags = 0b11010;
int result = ~flags;  // 结果为二进制的反码 0b00101

6. 如果移位的位数超过数值所占有的位数会怎么样

当 int 类型 左移/右移 大于等于32位时,会先求余(%)后在进行相应操作。也就是说 左移/右移32位相当于不进行移位操作(32%32=0), 左移/右移 42位相当于 左移/右移10位。当long类型进行 左移/右移操作时,由于long对应的二进制是64位,因此求余操作的基数也变成了64.

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

在这里插入图片描述

  • 用途:除了定义一些常量和局部变量之外,我们在其他地方比如方法参数、对象属性中很少会使用基本类型来定义变量。并且,包装类型可用于泛型,而基本类型不可以

  • 存储方式:基本数据类型的局部变量存放在Java虚拟机栈中的局部变量表,基本数据类型的成员变量(未被static修饰)存放在Java虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有对象实例都存在于堆中。

  • 占用空间: 相比于包装类型,基本数据类型占用的空间往往非常小。

  • 默认值:成员变量包装类型不赋值就是null,而基本类型有默认值且不是null。

  • 比较方式:基本数据类型采用 == 比较的是值,对于包装类型 == 比较的是内存地址。所有整型包装类对象之间值的比较,全部使用equals()方法。

!注意基本数据类型存放在栈中是一个常见的误区!基本数据类型的存储位置取决于他们的作用域和声明方式,如果他们是局部变量,那么他们会存放在栈中,如果他们是成员变量,那么他们会存放在堆中

public class Test {// 成员变量,存放在堆中int a = 10;// 被 static 修饰,也存放在堆中,但属于类,不属于对象// JDK1.7 静态变量从永久代移动了 Java 堆中static int b = 20;public void method() {// 局部变量,存放在栈中int c = 30;static int d = 40; // 编译错误,不能在方法中使用 static 修饰局部变量}
}

8. 包装类型的缓存机制

Java基本数据类型的包装类型大部分都利用到了缓存机制来提升性能

Byte、Short、Integer、Long这4种包装类型默认创建了数值 [-128,127]的相应类型的缓存数据,Character创建了数值在[0,127]范围的缓存数据,Boolean直接返回True or False。

Integer 缓存源码

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}
private static class IntegerCache {static final int low = -128;static final int high;static {// high value may be configured by propertyint h = 127;}
}

Character缓存源码

public static Character valueOf(char c) {if (c <= 127) { // must cachereturn CharacterCache.cache[(int)c];}return new Character(c);
}private static class CharacterCache {private CharacterCache(){}static final Character cache[] = new Character[127 + 1];static {for (int i = 0; i < cache.length; i++)cache[i] = new Character((char)i);}}

Boolean 缓存源码

public static Boolean valueOf(boolean b) {return (b ? TRUE : FALSE);
}

例:

Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);  //输出结果为false

Integer i1 = 40;这一行代码会发生装箱,等价于Integer.valueOf(40), 因此 i1直接使用的是缓存中的对象,而Integer i2 = new Integer(40);会直接创建对象,因此两者地址比较为false。

强制:所有整型包装类对象之间值的比较,全部使用equals方法比较。
说明:对于Integer var = ? 在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以使用 == 进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,因此,推荐所有的整形包装类对象都使用equals方法进行判断。

9. 自动装箱和拆箱的原理

什么是自动装箱拆箱

  • 装箱:将基本类型用他们对应的引用类型包装起来。
  • 拆箱:将包装类型转换为基本数据类型。

举例

Integer i = 10;  //装箱
int n = i;   //拆箱

原理

  • Integer i = 10; 等价于 Integer i = Integer.valueOf(10)
  • int n = i; 等价于 int n = i.intValue();

注意:如果频繁拆装箱的话,也会严重影响系统性能。我们应该尽量避免不必要的拆装箱操作。

private static long sum() {// 应该使用 long 而不是 LongLong sum = 0L;for (long i = 0; i <= Integer.MAX_VALUE; i++)sum += i;return sum;
}

这里 sum是引用类型,i是基本类型,每次执行sum+i会将sum转换为基本类型进行操作,操作完成后在将sum转换为引用类型,因此需要将sum修改为long类型

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

浮点数精度丢失演示:

float a = 2.0f - 1.9f;
float b = 1.8f - 1.7f;
System.out.println(a);// 0.100000024
System.out.println(b);// 0.099999905
System.out.println(a == b);// false

问题的原因和计算机保存浮点数的机制有很大关系,计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机中,只能被截断,所以会导致小数精度损失的情况。

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

BigDecimal可以实现对浮点数的运算,不会造成精度丢失。

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");BigDecimal x = a.subtract(b);
BigDecimal y = b.subtract(c);System.out.println(x.compareTo(y));// 0

强制:禁止使用构造方法BigDecimal(double) 的方式把double值转化为BigDecimal对象。
说明:BigDecimal(double) 存在精度丢失风险,在精确计算或者值比较的场景中可能会导致业务逻辑异常。正例 new BigDecimal(“0.1”)

12. 超过long整形的数据应该如何表示

BigInteger内部使用 int[] 数组来存储任意大小的整型数据。

13. 成员变量和局部变量有什么区别

在这里插入图片描述

  • 语法形式:成员变量是属于类的,局部变量是属于方法的。成员变量可以被private、static等修饰,局部变量不可以。
  • 存储方式:从变量在内存中的存储方式看,如果成员变量被static修饰,那么这个成员变量属于类。如果没有,那么这个成员变量属于实例。成员变量存在于堆内存,而局部变量中的基本数据类型存储于栈内存。
  • 生存时间:成员变量是对象的一部分,随着对象的创建而存在。而成员变量如果被static修饰更是随着类的存在而存在,而局部变量随着方法的调用产生,调用的结束消亡。
  • 默认值:成员变量如果没有赋初值,则会自动以类型的默认值而赋值(除非final修饰的成员变量必须显示的赋值),而局部变量不会自动赋值。

14. 静态变量有什么作用

静态变量也就是被static修饰的变量,他可以被类的所有实例共享,无论一个类创建了多少个对象,他们都共享同一份静态变量。也就是说,静态变量只会分配一次内存,即使创建多个对象,这样可以节省内存。

15. 静态方法为什么不能调用非静态成员

  • 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象创建的时候才会存在,需要通过类的实例对象访问。
  • 在类的非静态成员不存在的时候静态方法就已经存在了,此时调用在内存中不存在的静态成员,属于非法操作

16. 静态方法和实例方法有何不同

  • 调用方式:调用静态方法无需创建对象。
  • 访问类成员是否存在限制:静态方法在访问类的成员变量时只能访问静态成员,不允许访问实例成员。而实例方法不存在

17. 重载和重写的区别

  • 重载是同一个方法根据输入参数的不同,做出不同的处理。
  • 重写是子类继承父类,重写父类的方法。

计算机网络面试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】类与类的关系及其总结

类和类的关系 代码 总结&#xff1a; 【1】面向对象的思维&#xff1a;找参与者&#xff0c;找女孩类&#xff0c;找男孩类 【2】体会了什么叫方法的性擦&#xff0c;什么叫方法的实参&#xff1a; 具体传入的内容 实参&#xff1a; 【3】类和类可以产生关系&#xff1a; …

GenICam标准(六)

系列文章目录 GenICam标准&#xff08;一&#xff09; GenICam标准&#xff08;二&#xff09; GenICam标准&#xff08;三&#xff09; GenICam标准&#xff08;四&#xff09; GenICam标准&#xff08;五&#xff09; GenICam标准&#xff08;六&#xff09; 文章目录 系列文…

【会议征稿,IEEE出版】第六届物联网、自动化和人工智能国际学术会议(IoTAAI 2024,7月26-28)

第六届物联网、自动化和人工智能国际会议&#xff08;IoTAAI 2024&#xff09;将于2024年07月26-28日在中国广州召开。 会议旨在拓展国际科技学术交流渠道&#xff0c;搭建学术资源共享平台&#xff0c;促进全球范围内的科技创新&#xff0c;提升中外学术合作。会议还鼓励不同领…

剃头师傅不担心AI大模型 到底谁该担心?

到底学什么&#xff0c;不会被AI替代&#xff1f; 我家附近有一家美容店&#xff0c;已经开了20多年&#xff0c;店里的一位伙计硬是靠着自己的坚持从学徒熬成了门店的合伙人&#xff0c;所以现在去理发时&#xff0c;我都叫他“周董”。 这天&#xff0c;我问他&#xff0c;…

力扣hot100:75. 颜色分类(双指针)

75.颜色分类 本题是经典的「荷兰国旗问题」&#xff0c;由计算机科学家 Edsger W. Dijkstra 首先提出。 75. 颜色分类 1、遍历两遍 遍历两遍&#xff0c;第一遍放置0的位置&#xff0c;第二遍放置1的位置&#xff0c;我们只需要维护一个当前放置位置即可。 class Solution…

pytorch学习笔记6

想要找一些官方的小工具数据集&#xff0c;可以进入pytorch官网&#xff0c;DOCS-》pytorch下拉至libraries&#xff0c;点击torchversion&#xff0c;调整版本至0.9.0就可以找到相应的一些数据集&#xff0c;训练集 ctrlp可以看一个函数中需要设置哪些参数 下载数据集可以参考…

【设计模式深度剖析】【6】【行为型】【中介者模式】

&#x1f448;️上一篇:迭代器模式 | 下一篇:观察者模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 中介者模式定义英文原文直译如何理解&#xff1f; 中介者模式的角色1. 中介者&#xff08;Mediator&#xff09;2. 具体中介者&#xff08;ConcreteMediato…

C语言小例程20/100

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 #include<stdio.h> #define N 1000 int main() {int i,j,k,n,sum;int a[256];for(i2;i<N;i){suma[0]1;k…

工业网关在智能制造中的具体应用和效果-天拓四方

随着工业4.0时代的到来&#xff0c;智能制造正逐渐成为工业领域的发展趋势。作为连接物理世界与数字世界的桥梁&#xff0c;工业网关在智能制造中发挥着至关重要的作用。本案例将详细阐述工业网关在某一制造企业中的具体应用&#xff0c;展示其如何助力企业实现数字化转型&…

汽车IVI中控开发入门及进阶(二十八):视频SERDES芯片

前言: SerDes不是很常见,SerDes是将Ser和Des两种产品组合在一起的名称。Ser是Serializer或“并串转换器”的缩写,Des是Deserializer或“串并转换器”的简写。 Serdes是不是必须的?上一节介绍了camera,上上节也研究了video decoder,那么带摄像头的应用应该具体选哪个方案…

固态u盘长期不用会丢数据吗?u盘数据丢失怎么恢复需要多久

在数字化时代&#xff0c;U盘作为便携存储设备&#xff0c;广泛应用于我们的日常生活和工作中。然而&#xff0c;关于固态U盘长期不使用是否会导致数据丢失的问题&#xff0c;以及数据丢失后如何恢复和所需的时间&#xff0c;常常让人感到困惑。本文将针对这些问题进行深入探讨…

Java—文件拷贝

将指定的文件或目录拷贝到指定目录夹下 import java.io.*; import java.util.Scanner;/*** 实现一个文件拷贝*/ public class FileCopy {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.println("请输入要拷贝的源文件路径…

申请国外访问学者面签技巧有哪些?

申请国外访问学者面签是一项重要的步骤&#xff0c;关系到能否成功获得访问学者身份。以下是一些实用的面签技巧&#xff0c;帮助您顺利通过面试。 1.充分准备材料 成功的面签始于准备充分的材料。确保您的申请材料齐全&#xff0c;包括&#xff1a; 个人简历&#xff1a;突出…

3D 图片悬停效果

3D 图片悬停效果 效果展示 CSS 知识点 background 属性的综合运用transform 属性的综合运用 页面整体布局 <div class"box"><span style"--i: 0"></span><span style"--i: 1"></span><span style"--i…

python-基础篇-函数-是什么

文章目录 定义一&#xff1a;如果在开发程序时&#xff0c;需要某块代码多次执行。为了提高编写的效率以及更好的维护代码&#xff0c;需要把具有独立功能的代码块组织为一个小模块&#xff0c;这就是函数。定义一&#xff1a;我们把一些数据喂给函数&#xff0c;让他内部消化&…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 文件对话框QFileDialog 文章编号&#xff1a;Q…

搭建知识付费APP平台教学:在线教育系统源码详解

如何搭建一个高效的知识付费APP平台呢&#xff1f;今天&#xff0c;笔者将详细解析在线教育系统的源码&#xff0c;帮助您快速搭建自己的知识付费APP平台。 一、平台的核心功能 一个完整的知识付费APP平台通常需要具备以下核心功能&#xff1a; 用户管理 内容管理 支付 课…

业务动态校验框架应用实现

目录 一、业务背景 二、配置内容展示 三、商品动态配置内容展示 &#xff08;一&#xff09;商品spu校验信息数据 &#xff08;二&#xff09;商品sku校验信息数据 &#xff08;三&#xff09;组包商品校验信息数据 &#xff08;四&#xff09;商品数据校验数据持有者 &…

蚓链数字化营销教你寻找快准直达市场路径小绝招

在当今数字化的商业世界中&#xff0c;蚓链数字化营销成为了企业开拓市场、实现增长的有力工具。它犹如一盏明灯&#xff0c;为您照亮寻找快速直达市场路径的方向。 绝招一&#xff1a;深入的市场调研。利用蚓链数字化营销的大数据分析能力&#xff0c;全面了解目标市场的规模、…

Spring Cloud Stream整合RocketMQ

Spring Cloud Stream整合RocketMQ 这里书接上回&#xff0c;默认你已经搭建好了RocketMQ主从异步集群&#xff0c;前面文章已经介绍过搭建方法。 1、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架&#xff0c;用于构建与共享消息系统连接的高度可扩展的事件驱动微服…