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

5星 · 超过95%的资源 需积分: 12 54 下载量 52 浏览量 更新于2024-07-20 收藏 501KB PDF 举报
"本文介绍了《剑指offer》中两个Java实现的编程题目,分别是单例模式的实现和二维数组中的查找算法。" 在编程面试中,掌握常见设计模式和高效算法是至关重要的。《剑指offer》是一本针对面试准备的经典书籍,其中包含了许多常见的编程题目。以下是两个题目及其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; } } ``` 这个实现中,`getInstance()` 方法使用了 `synchronized` 关键字,确保在多线程环境下只有一个线程能够进入创建实例的过程,从而保证了线程安全。但是,由于每次调用都需要同步,这可能会影响性能。 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]; // 初始化测试数据... } } ``` 此算法的思路是:如果当前元素大于目标值,说明目标值可能在当前元素的下方;如果当前元素小于目标值,说明目标值可能在当前元素的左边。通过不断调整行和列的指针,可以快速找到目标值或确定其不存在。 总结,这两个题目考察了Java程序员对设计模式(单例模式)的理解和应用,以及在数据结构(二维数组)中进行高效查找的能力。对于面试者来说,熟练掌握这些基础概念和技巧是提升竞争力的关键。