Java实现剑指Offer中的单例模式与二维数组查找

需积分: 10 13 下载量 98 浏览量 更新于2024-07-20 收藏 501KB PDF 举报
"提供《剑指offer》书中面试题的Java实现,包括单例模式和二维数组中的查找问题。" 在Java编程中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。《剑指offer》中提到了两种单例模式的实现方式,分别是“饿汉式”和“懒汉式”。 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; } } ``` 懒汉式解决了饿汉式的内存浪费问题,但同步锁会带来性能影响,因为每次调用`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]; // 初始化数组... System.out.println(find(testArray, 5)); // 输出:false } } ``` 这个算法的时间复杂度为O(m+n),其中m和n分别是数组的行数和列数,因为它最多只需要遍历整个数组一次。在实际应用中,这种算法适用于已排序或部分有序的数据结构,可以快速定位目标值。