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

需积分: 10 4 下载量 115 浏览量 更新于2024-07-19 收藏 501KB PDF 举报
"剑指offer(java版) - 面试题涵盖单例模式和二维数组查找" 在《剑指offer》这本书的Java版本中,我们关注的两个知识点是单例模式的实现以及在二维数组中进行查找的方法。 首先,让我们详细讨论单例模式。单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,我们可以使用两种常见的方法来实现单例模式: 1. 饿汉式单例类: 这种方式在类加载时就创建了单例对象,因此也被称为静态初始化。在给出的代码中,`SingletonClass`类的实例`instance`在类加载时就被初始化为`new SingletonClass()`。由于`instance`是`private static final`的,因此保证了线程安全,且只会被初始化一次。获取实例的方法`getInstance()`返回这个唯一的实例。 ```java public class SingletonClass { private static final SingletonClass instance = new SingletonClass(); private SingletonClass() {} public static SingletonClass getInstance() { return instance; } } ``` 2. 懒汉式单例模式: 这种方式在第一次需要时才创建实例。在给出的代码中,`SingletonClass`的实例`instance`初值为`null`,当调用`getInstance()`方法并且`instance`为`null`时,才会通过`new SingletonClass()`创建实例。由于使用了`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; } } ``` 接下来,我们来看二维数组中的查找问题。给定一个每行每列都递增的二维数组,我们需要找到一个特定的整数是否存在。这个问题可以通过使用二分查找的思想来解决。代码中的`Find.find()`方法实现了这一功能: ```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; } } ``` 在这个方法中,我们初始化行索引`row`为0,列索引`column`为最后一列。如果当前元素不等于目标`number`,则根据当前元素与`number`的大小关系更新`row`或`column`。当`row`超出数组范围或`column`小于0时,表示未找到目标数字,返回`false`;否则,若找到`number`,返回`true`。 这两个知识点在面试中经常出现,对理解面向对象设计原则和高效算法具有重要意义。在实际开发中,单例模式常用于控制资源的唯一性,如数据库连接池、线程池等;而二维数组查找问题则涉及数组操作和优化搜索效率,对于处理数据密集型任务的程序员来说尤其重要。