1、JDK 和 JRE 和 JVM 分别是什么,有什么区别?

JDK(Java Development Kit,Java 软件开发工具包)

JDK(Java Development Kit):JDK 是 Java 开发⼯具包,包含了编写、编译、调试和运⾏ Java 程序所需的所有⼯具和组件(包含了JRE和一些java开发工具),⽐如编译器(javac)、Java API、调试⼯具等。JDK 是针对 Java 开发⼈员的,它包含了 JRE,还有编译器和其他⼯具,可以⽤来编写和调试 Java 程序。

JRE(Java Runtime Environment,Java 运行环境)

JRE 是 Java 运⾏时环境,包括了 Java 虚拟机(JVM)和 Java 标准类 库(Java API)。JRE 是针对 Java 应⽤程序的,它提供了在计算机上运⾏ Java 应⽤程序所需的最⼩环境。

JVM(Java Virtual Machine,Java 虚拟机)

JVM 是 Java 虚拟机,JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。在Java虚拟机上⽣成可运⾏的字 节码,移植到在其他平台上时可不加修改地运⾏

三者之间区别:

​ 1.JDK是Java开发工具包含了java运行环境和java开发工具

​ 2.JRE是Java运行时环境,包括了java核心类库。

​ 3.JVM是java环境(jre)的一部分,是跨平台核心部分,可运行java核心代码

Java开发⼯具包=Java 运⾏环境+Java开发⼯具

Java 运⾏环境=Java虚拟机+Java核⼼类库

2、什么是字节码?采用字节码的最大好处是什么?

字节码是JVM可以理解的代码就叫做字节码(即源程序(.java文件)通过编译产生的产物(.class文件)),它不面向任何特定的处理器,只面向JVM,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行

好处:

  • 可移植性:由于字节码是中间代码,并不针对一种特定的机器,因此Java程序无须重新编译就可以在多种操作系统的计算机上运行(不同的操作系统和硬件平台可能需要不同的JVM实现,但是它们都可以执行相同的字节码程序)。
  • 安全性:由于字节码需要在JVM中运行,所以可以对字节码进行安全检查,以确保程序不会对系统造成威胁
  • 性能:由于字节码是⼀种紧凑的⼆进制格式,相⽐于直接编译为机器码,可以更快地加载和传输,同时也可以 在运⾏时进⾏动态优化,提⾼程序的执⾏效率。
  • 可读性:相⽐于直接编译为机器码,字节码具有更好的可读性,可以⽅便地进⾏反汇编和调试。

img点击并拖拽以移动编辑

3、什么是数据库事务?讲一下事务的 ACID 特性?

事务是若干个SQL语句构成的一个操作序列,这些操作表示一个完整的功能,并且需要保证功能的完整性,因此要求在该事务中要求所有的sql要么都执行,要么都不执行,是一个不可分割的整体单位。(简单来说就是由多个小任务的组成的任务)

事务的ACID特性

  • 原子性(Atomicity):事务是一个不可分割的整体,所有操作要么全做,要么全不做;只要事务中有一个操作出错,回滚到事务开始前的状态的话,那么之前已经执行的所有操作都是无效的,都应该回滚到开始前的状态。
  • 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
  • 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱结束前,B不能向这张卡转账。
  • 持久性(Durability):事务一旦被提交后,事务对数据库的所有更新将被永远保存到数据库,不能回滚。

4、Java 和 C++、Go 语⾔的区别,各⾃的优缺点?

Java优点:

  • 平台性强(跨平台):Java 虚拟机(JVM)可以在不同的操作系统上运⾏ Java 程序,使得开发者可以编写⼀次代 码并在多个平台上运⾏
  • 安全性⾼:Java 有很多安全特性,例如⾃动内存管理、类的访问权限控制、异常处理等,可以有效避免⼀些 常⻅的安全漏洞;
  • ⽣态系统完备:Java 的⽣态系统⾮常完善,有很多成熟的框架和⼯具可以帮助开发者快速构建复杂的应⽤。

缺点:

  • 由于JVM的存在,运⾏速度相对较慢
  • 对于实时性要求较⾼的场景,Java的表现可能不如C++和Go

go语言优点:

  • ⾼并发,天⽣⽀持协程,能够轻松编写⾼效的并发程序
  • 简单易学,语法简洁,上⼿容易
  • 静态类型语⾔,可以避免⼀些潜在的运⾏时错误
  • 快速编译,可以快速构建和部署应⽤程序

缺点:

  • 缺乏丰富的类库,与 Java 和 C++ 相⽐有些不⾜
  • 在⼀些性能要求极⾼的场景中可能不如 C++ 表现
  • 语⾔本身还⽐较年轻,相关⽣态和⼯具还需要进⼀步完善

C++优点:

  • 速度快,适合编写需要⾼性能的应⽤程序
  • 应⽤⼴泛,特别是在游戏开发、操作系统和嵌⼊式系统开发⽅⾯
  • 灵活性⾼,可以直接访问硬件和内存

缺点:

  • 学习难度较⾼,需要掌握指针、内存管理等底层知识
  • 容易出现内存泄漏和指针错误等问题
  • 编写代码过程中需要更多的⼿动管理,相⽐ Java 更容易出错

5、Java 中 final 关键字有什么用?

1.final 修饰类,表示该类不能被继承。final 类中的⽅法默认都是 final 的,不能被⼦类重写。

  1. final 修饰⽅法,表示该⽅法不能被⼦类重写。
  2. final 修饰变量,表示该变量只能被赋值⼀次。final 修饰的变量必须在声明时或构造函数中初始化,且不能再 被修改。常⽤于定义常量。

4.确保对象引⽤不可变,在对象引⽤声明前加上 final 关键字,可以确保该引⽤指向的对象不能被改变,但是该对象的内容可以被改变。例如,final MyClass obj = new MyClass(); 将 obj 声明为⼀个不可变引⽤,指向⼀个可变的 MyClass 对象。

何为”不可变的对象引用”呢?

​ final只保证引用类型变量所引用的地址不会改变,即一直引用同一个对象,但是这个对象的内容(对象的非final成员变量的值可以改变)完全可以发生改变(比如final int[] intArray;,intArray不允许再引用其他对象,但是intArray内的int值却可以被修改)

使⽤ final 修饰的变量在编译时就已经确定了其值,因此在运⾏时访问时⽐⾮ final 变量更快。