- 1.Java 程序设计概述
- 1.1.Java 跨平台运行的原理是什么?
- 1.2.Java 的安全性体现在哪些方面?
- 1.3.Java 语言有哪些特点?
- 1.4.Java 与 C++ 有什么区别?
- 1.5.✨Java 8 有哪些新特性?
- 2.Java 程序设计环境
- 2.1.JDK 和 JRE 有什么区别?JDK 中有哪些常用的工具?
- 2.2.JVM 是什么?
- 2.3.编译性语言和解释性语言有什么区别?
- 2.4.什么是字节码?采用字节码的好处是什么?
- 2.5.为什么说 Java 语言“编译与解释并存”?
- 3.Java 的基本程序设计结构
- 3.1.谈谈 Java 中的关键字和标识符。
- 3.2.✨谈谈 Java 中的基本数据类型与包装类。
- 3.3.谈谈 Java 中的运算符。
- 3.4.介绍一下 Java 中的可变参数。
- 3.5.return 与 finally 的执行顺序对返回值有什么影响?
- 3.6.== 和 equals 的相同点和不同点是什么?
- 3.7.hashCode() 与 equals() 的区别是什么?
- 3.8.✨有一个用户类,字段有用户 id、名称、邮箱、手机等,如果要去重的话,hashCode() 和 equals() 方法怎么重写?你会用哪些字段去拼接 hashCode?
- 4.✨面向对象
- 5.反射与注解
- 5.1.什么是反射?
- 5.2.什么是注解?
- 5.3.什么是 Lambda 表达式?
- 6.4.什么是动态代理?其应用场景有哪些?
- 6.异常
- 7.泛型程序设计
- 8.1.什么是泛型?为什么要使用泛型程序设计?其优点是什么?
- 8.2.泛型的使用方式有哪几种?
- 8.2.1.泛型类
- 8.2.2.泛型接口
- 8.2.3.泛型方法
- 8.3.什么是类型擦除?
- 8.4.介绍一下常用的通配符。
- 8.5.泛型的桥方法是指什么?
- 8.6.项目中哪里用到了泛型?
- 8.✨集合
- 9.I/O
- 10.其它常用类
① 以下 Java 基础面试题均基于Java 8,并且大部分题目来自网络。 ② 由于本人水平有限,所以本文难免会出现一些错误或者不准确的地方,恳请读者在评论区指正。
1.Java 程序设计概述 1.1.Java 跨平台运行的原理是什么?(1)Java 源文件要先编译成与操作系统无关的 .class 字节码文件,然后字节码文件再通过 Java 虚拟机解释成机器码运行。 (2).class 字节码文件面向虚拟机,不面向任何具体操作系统。 (3)不同平台的虚拟机是不同的,但它们给 JDK 提供了相同的接口。 (4)Java 的跨平台依赖于不同系统的 Java 虚拟机。
1.2.Java 的安全性体现在哪些方面?(1)Java 使用引用取代了指针,指针的功能虽然强大,但是也容易造成错误,如数组越界问题。 (2)拥有一套异常处理机制,使用关键字 throw、throws、try、catch、finally。 (3)强制类型转换需要符合一定规则。 (4)字节码传输使用了加密机制。 (5)运行环境提供保障机制:字节码校验器 → 类装载器 → 运行时内存布局→ 文件访问限制。 (6)不用程序员显示控制内存释放,JVM 有垃圾回收机制。
1.3.Java 语言有哪些特点? 简单性Java 语法是 C++ 语法的一个"纯净"版本,这里没有头文件、 指针运算(甚至指针语法)、结构、 联合、 操作符重载、 虚基类等。面向对象开发 Java 时面向对象技术已经相当成熟。 Java 的面向对象特性与 C++ 旗鼓相当。Java 与 C++ 的主要不同点在于多重继承,在 Java 中,取而代之的是更简单的接口概念。与 C++相比,Java 提供了更丰富的运行时自省功能。分布式Java 有一个丰富的例程库,用于处理像 HTTP 和 FIT 之类的 TCP/IP 协议。Java 应用程序能够通过 URL 打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。健壮性Java 的设计目标之一在于使得 Java 编写的程序具有多方面的可靠性。Java 投入了大量的精力进行早期的问题检测、 后期动态的 (运行时)检测,并消除了容易出错的情况。Java 和 C++ 最大的不同在于 Java 采用的指针模型可以消除重写内存和损坏数据的可能性。Java 编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。安全性Java 适用于网络 / 分布式环境。 为了达到这个目标,在安全方面投入了很大精力。使用 Java 可以构建防病毒、 防篡改的系统。从一开始,Java 就设计成能够防范各种攻击,其中包括:运行时堆栈溢出(如蠕虫和病毒常用的攻击手段)、破坏自己的进程空间之外的内存、未经授权读写文件等。体系结构中立编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码, 只要有 Java 运行时系统, 这些编译后的代码可以在许多处理器上运行。Java 编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。 精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。可移植性与 C 和 C++ 不同,Java 规范中没有“ 依赖具体实现” 的地方基本教据类型的大小以及有关运算都做了明确的说明。作为系统组成部分的类库, 定义了可移植的接口例如,有一个抽象的 Window类, 并给出了在 UNIX、 Windows 和 Macintosh 环境下的不同实现。解释性Java 解释器可以在任何移植了解释器的机器上执行 Java 字节码。由于链接是一个增量式且轻量级的过程, 所以, 开发过程也变得更加快捷,更加具有探索性。高性能尽管对解释后的字节码性能已经比较满意,但在有些场合下还需要更加高效的性能。字节码可以(在运行时刻)动态地翻译成对应运行这个应用的特定 CPU 的机器码。多线程多线程可以带来更好的交互响应和实时行为。动态性从各种角度看, Java 与 C 或 C++ 相比更加具有动态性。它能够适应不断发展的环境库中可以自由地添加新方法和实例变量, 而对客户端却没有任何影响。在 Java 中找出运行时类型信息十分简单。 1.4.Java 与 C++ 有什么区别?(1)Java 的类是单继承的,C++ 支持多重继承(Java 的接口可以多继承)。 (2)Java 不提供指针来直接访问内存,程序内存更加安全。 (3)Java 有自动内存管理垃圾回收机制 (GC),不需要程序员手动释放无用内存。 (4)C++ 同时支持方法重载和操作符重载,但是 Java 只支持方法重载(操作符重载增加了复杂性,这与 Java 最初的设计思想不符)。
1.5.✨Java 8 有哪些新特性?参考文章: Java8(JDK1.8)新特性 Java 8 新特性实战
Java 8 是 Java 编程语言的一个版本,它引入了许多新特性。以下是 Java 8 的一些新特性:
- 默认方法:在 Java 8 中,接口中的方法可以用
default
或static
修饰,这样就可以有方法体,实现类也不必重写此方法。 - 函数式接口:Java 8 引入了函数式接口的概念,函数式接口是指只有一个抽象方法,但可以有多个非抽象方法的接口。
- Lambda 表达式:Lambda 表达式是一个匿名函数,它可以作为参数传递给其他函数。Lambda 表达式使得编写简洁、易读的代码变得更加容易。
- Stream API:Stream API 提供了一种新的方式来处理集合数据。使用 Stream API,可以更加轻松地进行筛选、映射、过滤、排序等操作。
- 方法引用:方法引用是一种新的语言特性,它使得代码更加简洁。方法引用可以替代一些常用的 Lambda 表达式,例如使用方法的引用来替代实现接口中的方法。
- 新的日期和时间 API:Java 8 引入了一个新的日期和时间 API,
java.time.LocalDate
,它提供了更加简单、易用的方式来处理日期和时间。 - Optional:用来解决 NPE (java.lang.NullPointerException) 问题;
- 类型注解:Java 8 引入了类型注解的概念,类型注解可以帮助开发人员更好地理解代码中的类型信息。
在回答这个问题之前,先看下面这张图:
(1)JDK 和 JRE 的具体区别如下:
JDKJRE英文全称Java Development Kit,即 Java 开发工具包Java Runtime Environment,即 Java 运行时环境组成部分包含 JRE、同时还包括 Java 源码的编译器 javac、监控工具 JConsole、分析工具 Java VisualVM 等JRE 包含 Java 虚拟机,Java 基础类库等面向人群程序员想运行 Java 程序的用户使用场景需要编写并运行 Java 程序只需要运行 .class 文件注意:JRE 只能运行已经编译的字节码文件,而不能直接运行 Java 源文件。为了编译 Java 源文件,你需要使用 JDK 中的 javac
命令将源代码编译为字节码文件,然后再使用 JRE 运行生成的字节码文件。
(2)JDK 中常用的工具如下:
- javac:Java 编译器,用于将 Java 源代码编译成字节码文件。
- java:Java 虚拟机,用于执行 Java 程序。
- javadoc:Java 文档生成器,用于根据 Java 源代码生成文档。
- jar:Java 归档工具,用于创建和管理 Java 库。
- jdb:Java 调试器,用于调试 Java 程序。
- jps:Java 进程状态工具,用于显示 Java 进程的状态信息。
- jstack:Java 堆栈跟踪工具,用于显示 Java 线程的堆栈信息。
- jmap:Java 内存映射工具,用于生成 Java 进程和垃圾回收器的内存快照。
- jstat:Java 统计信息监视工具,用于监视 Java 进程的性能指标。
- jconsole:Java 监视和管理控制台,用于监视和管理 Java 进程。
Java 虚拟机 (Java Virtual Machine, JVM) 是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现 (Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
注意:JVM 并不是只有一种!只要满足 JVM 规范,每个公司、组织或者个人都可以开发自己的专属 JVM。 也就是说我们平时接触到的 HotSpot VM 仅仅是是 JVM 规范的一种实现而已。除了我们平时最常用的 HotSpot VM 外,还有 J9 VM、Zing VM、JRockit VM 等 JVM。
2.3.编译性语言和解释性语言有什么区别? 编译性语言解释性语言概述需要通过编译器,将源代码编译成机器码之后才能执行的语言。一般是有编译和链接两个步骤,编译是将我们的程序编译成机器码,链接是程序和依赖库等串联起来解释型语言不需要编译,相比于编译型语言省了一道工序,在运行程序的时候才逐行进行翻译优点编译器一般会通过预编译的过程对代码进行优化,因为编译只做了一次,运行时不会再编译,所以效率较高有良好的平台兼容性(只要安装了虚拟机就可以),易于维护,方便快速部署缺点编译之后如果想要修改某一个功能,就需要整个模块重新编译。编译的时候根据对应的运行环境生成不同的机器码。不同的操作系统之间,可能会出现问题。需要根据环境的不同,生成不同的可执行文件每次运行的时候都要解释一遍,性能上不如编译型语言代表语言C、C++、PascalJavaScript、Python、Erlang、PHP、Perl、Ruby 2.4.什么是字节码?采用字节码的好处是什么?(1)Java 中 JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向 JVM。 (2)Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
2.5.为什么说 Java 语言“编译与解释并存”?(1)我们可以将高级编程语言按照程序的执行方式分为两种:编译性语言和解释性语言(具体细节见2.3)。
(2)因为 Java 程序要经过先编译,后解释两个步骤,即:
- 由 Java 编写的程序需要先经过编译步骤,生成字节码(.class 文件);
- 这种字节码必须由 Java 解释器来解释执行。
所以 Java 语言既具有编译型语言的特征,也具有解释型语言的特征,即 Java 语言“编译与解释并存”。
3.Java 的基本程序设计结构 3.1.谈谈 Java 中的关键字和标识符。与关键字和标识符有关的知识可以参考 Java 基础面试题——关键字与标识符这篇文章。
3.2.✨谈谈 Java 中的基本数据类型与包装类。与基本数据类型与包装类有关的知识可以参考 Java 基础面试题——基本数据类型与包装类这篇文章。
3.3.谈谈 Java 中的运算符。与运算符有关的知识可以参考 Java 基础面试题——运算符这篇文章。
3.4.介绍一下 Java 中的可变参数。(1)可变参数的作用是在不确定参数的个数时,可以使用可变参数。即 Java 允许将同一个类中多个同名同功能但参数个数不同的方法封装成一个方法。其基本语法如下:
访问修饰符 返回类型 方法名(数据类型... 形参名){
//方法体
}
(2)案例 ① 利用方法的重载,实现三个方法 sum,用于求2 ~ 4个数的和。
class Solution{
// 两数之和
public void sum(int a, int b){
System.out.println("2数之和: " + (a + b));
}
// 三数之和
public void sum(int a, int b, int c){
System.out.println("3数之和: " + (a + b + c));
}
// 四数之和
public void sum(int a, int b, int c, int d){
System.out.println("4数之和: " + (a + b + c + d));
}
public static void main(String[] args) {
Solution my = new Solution();
my.sum(1,2);
my.sum(1,2,3);
my.sum(1,2,3,4);
}
}
② 使用可变参数进行优化
class Solution{
//n数之和
public void sum(int... nums){
// 可变参数可以当作数组使用
int sum = 0;
for (int i = 0; i 0) {
char val[] = value;
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?