"剑指offer java版 - 面试题包括单例模式实现和二维数组查找"
在Java编程中,面试时常会涉及到设计模式和高效算法的考察。本资源主要涵盖两个核心知识点:单例模式的实现和二维数组中的查找。
首先,让我们详细探讨单例模式。单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在Java中,常见的单例模式实现有两种:饿汉式和懒汉式。
1. 饿汉式单例类:
这种实现方式在类加载时就完成了初始化,因此线程安全。它的优点是简单且线程安全,缺点是无论是否需要,都会立即创建单例对象,占用内存。
```java
public class SingletonClass {
private static final SingletonClass instance = new SingletonClass();
private SingletonClass() {}
public static SingletonClass getInstance() {
return instance;
}
}
```
2. 懒汉式单例模式:
懒汉式在第一次调用`getInstance`方法时才创建单例对象,实现了按需加载。但原始的懒汉式代码在多线程环境下可能不安全,可能导致多个线程同时创建单例对象。通过添加`synchronized`关键字,可以解决线程安全问题,但会牺牲性能。
```java
public class SingletonClass {
private static SingletonClass instance = null;
private SingletonClass() {}
public synchronized static SingletonClass getInstance() {
if (instance == null) {
instance = new SingletonClass();
}
return instance;
}
}
```
面试题3涉及的是在二维数组中查找指定整数。给定一个按照特定规则排列的二维数组(每行从左到右递增,每列从上到下递增),目标是判断数组中是否存在给定的整数。
```java
public class Find {
public static boolean find(int[][] array, int number) {
if (array == null) {
return false;
}
int column = array[0].length - 1;
int row = 0;
while (row < array.length && column >= 0) {
if (array[row][column] == number) {
return true;
}
if (array[row][column] > number) {
column--;
} else {
row++;
}
}
return false;
}
// main方法用于测试
public static void main(String[] args) {
int[][] testArray = new int[4][4];
// 初始化二维数组...
}
}
```
这个查找算法利用了数组的特性,从右上角开始遍历,根据当前元素与目标值的关系调整行或列的位置。由于数组有序,这种做法在大多数情况下比简单的暴力遍历更高效。在实际应用中,这种优化对于处理大数据集非常重要,因为它能显著减少搜索时间。