Java版《剑指offer》面试题:单例模式与二维数组查找

需积分: 50 58 下载量 90 浏览量 更新于2024-07-20 1 收藏 501KB PDF 举报
"剑指offer(java版).pdf,涵盖了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()`方法时才创建单例对象,这样可以延迟对象的初始化,节约资源。但原始的懒汉式实现是线程不安全的,如果多个线程同时进入`if (instance == null)`判断,可能导致创建多个实例。为了解决这个问题,可以使用`synchronized`关键字来同步`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; } } ``` 面试题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 method for testing public static void main(String[] args) { int[][] testArray = new int[4][4]; // initialize the testArray... } } ``` 在这个方法中,我们从数组的右上角开始,如果当前元素大于目标值,我们就向左移动一列;如果小于目标值,我们就向下移动一行。这样,每次移动都能缩小查找范围,直到找到目标值或遍历完整个数组。这种方法利用了数组的有序性,提高了查找效率。