主题
华顺信安 已完结
日期
2024 年 9 月 13 日
自我介绍
略
Java 基础
静态变量与实例变量有什么差别
- 语法形式:成员变量定义在类中,局部变量定义在方法中。成员变量可以使用修饰符,局部变量只能使用 final。
- 存储方式:成员变量存储在堆中,局部变量存储在栈中。
- 生存时间:成员变量跟随其对象的生存时间,局部变量跟随其所在代码块的开始和结束。
抽象是什么含义?
抽象主要通过抽象类和接口来实现。目的是隐藏复杂的实现细节,只暴露出必要的接口。
什么是接口?接口用什么去修饰?
接口是一个引用类型,用于定义类可以实现的行为集合。可以理解为一种规范。
接口通过 interface
关键字来定义。
接口的所有的方法都要实现吗?
类实现接口时必须实现接口中所有的抽象方法。默认方法和静态方法则不需要实现类来实现。
什么是继承
继承是指,允许子类继承父类的属性和方法。通过继承,子类可以复用父类的代码。
Java 支持多继承吗?
类不支持多继承,接口支持多继承。
什么是构造函数
构造函数是一个在创建对象时自动调用的方法,用于初始化对象,为对象成员变量设置初值。
Map 和 List 的区别?
- 用途:List 用于存储有序的、可重复的元素集合;Map 用于存储键值对映射,键唯一。
- 访问方式:List 通过索引访问元素;Map 通过键访问值。
- 存储结构:List 是元素的线性集合;Map 是键值对的集合。
❓Java 中有闭包吗?
形参和实参的区别是什么?
形参是函数定义时的占位符,而实参是调用函数时传递的实际数据。
静态变量什么时候初始化
当类第一次被加载到内存中时,所有的静态变量都会被初始化。
简单说一下单例模式
通过提供一个静态方法来获取该实例,客户端可以通过此方法访问唯一的实例。
Java 的基本数据类型
- short
- boolean
- long
- int
- char
- byte
- double
- float
基本数据类型和引用数据类型的区别
- 默认值:基本类型存在默认值,包装类型默认值为null
- 泛型:包装类可以用于泛型,基本类型不可以
- 存储位置:非 static 修饰的基本类型存在栈中,包装类存在堆中。
引用传递会不会改变调用方的原值
会的
MySQL
事务是什么?
事务的几大特性是什么?
- 原子性:undo log
- 一致性
- 隔离性:MVCC + 锁
- 持久性:redo log
MySQL 中索引的作用是什么?
提高查询性能
联合索引的优点是什么?
- 提高多列查询的性能
- 相比于多列索引,节省存储空间和维护成本
- 覆盖索引:如果联合索引包含了查询所需的所有列,那么查询可以直接从索引中获取数据,而不需要访问表
❓乐观锁和悲观锁有什么区别?
Redis
Redis 的优势是什么?
- 基于内存,性能高
- 多种数据结构
- 支持持久化
- 支持分布式,可以实现高可用
- 支持原子操作
Redis 可以做持久化吗?
Redis 支持 RDB 内存快照和 AOF 追加日志两种持久化方式。
数据结构
二分算法的原理是什么?
通过将已排序的数组分成两部分,逐步缩小查找范围来高效地定位目标元素。
冒泡排序的原理是什么?
通过重复遍历待排序的数组,比较相邻元素并交换它们的位置,从而逐步将最大或最小的元素“冒泡”到数组的一端。
代码题
pi - ruby
公式:Pi / 4 = 1 - (1/3) + (1/5) - (1/7) + (1/9) - (1/11) + (1/13) - ….
实现一个方法,输入为n,返回为用n项公式输出的Pi值
例子:
- n = 1, pi = 4 * 1
- n = 2, pi = 4 * [1 - (1/3)]
- n = 3, pi = 4 * [1 - (1/3) + (1/5)]
- n = 4, pi = 4 * [1 - (1/3) + (1/5) - (1/7)]
- n = 5, pi = 4 * [1 - (1/3) + (1/5) - (1/7) + (1/9)]
java
public static double piRuby(int n) {
double val = 0;
for (int i = 0; i < n; i++) {
if (i % 2 == 0) {
val += 1.0 / (i * 2 + 1);
} else {
val -= 1.0 / (i * 2 + 1);
}
}
System.out.println("val = " + val);
return val * 4;
}
冒泡排序
java
public static int[] bubbleSort(int[] nums) {
int n = nums.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
// 交换相邻的元素
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
return nums;
}