Java实现单例模式与二维数组查找

5星 · 超过95%的资源 需积分: 8 47 下载量 195 浏览量 更新于2024-07-20 收藏 501KB PDF 举报
"剑指offer--java,包含面试题2:实现单例模式和面试题3:二维数组中的查找" 在Java编程中,"剑指offer"是一系列针对程序员面试的经典问题集,旨在提升面试者对编程基础、算法和设计模式的理解。以下是这两个面试题的详细解析: 面试题2:实现单例模式 单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。题目中提到了两种常见的Java单例实现方式:饿汉式和懒汉式。 1. 饿汉式单例类: 饿汉式单例在类加载时就完成了初始化,所以类加载比较慢,但获取单例的速度快,线程安全。代码如下: ```java public class SingletonClass { private static final SingletonClass instance = new SingletonClass(); // 私有构造函数 private SingletonClass() {} public static SingletonClass getInstance() { return instance; } } ``` 这里,`instance` 在类加载时就被创建,因此多个线程同时访问 `getInstance()` 也不会有问题。 2. 懒汉式单例模式: 懒汉式单例在第一次调用 `getInstance()` 时才进行实例化,因此类加载速度快,但获取单例的速度慢。代码如下: ```java public class SingletonClass { private static SingletonClass instance = null; // 私有构造函数 private SingletonClass() {} public synchronized static SingletonClass getInstance() { if (instance == null) { instance = new SingletonClass(); } return instance; } } ``` 这里的懒汉式单例使用了同步关键字 `synchronized`,确保了线程安全,但可能导致性能下降,因为每次调用 `getInstance()` 都会进行同步。 面试题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; } // 主方法用于测试 public static void main(String[] args) { int[][] testarray = new int[4][4]; // 初始化测试数组... } } ``` 在这个算法中,如果当前元素大于目标值,说明目标值可能在当前行的左侧或下方;如果当前元素小于目标值,说明目标值可能在当前列的下方或右侧。这样,每次迭代都可以缩小搜索范围,直到找到目标值或搜索完毕。 以上是"剑指offer"中关于单例模式和二维数组查找的Java实现,它们考察的是设计模式理解和高效算法的应用,对于准备面试的开发者来说是非常重要的知识点。