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中运行,所以可以对字节码进行安全检查,以确保程序不会对系统造成威胁
- 性能:由于字节码是⼀种紧凑的⼆进制格式,相⽐于直接编译为机器码,可以更快地加载和传输,同时也可以 在运⾏时进⾏动态优化,提⾼程序的执⾏效率。
- 可读性:相⽐于直接编译为机器码,字节码具有更好的可读性,可以⽅便地进⾏反汇编和调试。
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 的,不能被⼦类重写。
2. final 修饰⽅法,表示该⽅法不能被⼦类重写。
3. final 修饰变量,表示该变量只能被赋值⼀次。final 修饰的变量必须在声明时或构造函数中初始化,且不能再 被修改。常⽤于定义常量。
4.确保对象引⽤不可变,在对象引⽤声明前加上 final 关键字,可以确保该引⽤指向的对象不能被改变,但是该对象的内容可以被改变。例如,final MyClass obj = new MyClass(); 将 obj 声明为⼀个不可变引⽤,指向⼀个可变的 MyClass 对象。
何为"不可变的对象引用"呢?
final只保证引用类型变量所引用的地址不会改变,即一直引用同一个对象,但是这个对象的内容(对象的非final成员变量的值可以改变)完全可以发生改变(比如final int[] intArray;,intArray不允许再引用其他对象,但是intArray内的int值却可以被修改)
使⽤ final 修饰的变量在编译时就已经确定了其值,因此在运⾏时访问时⽐⾮ final 变量更快。