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

需积分: 10 8 下载量 23 浏览量 更新于2024-07-19 收藏 501KB PDF 举报
"剑指Offer(Java版)是针对IT求职者的一系列面试题解析,包含设计模式、数据结构和算法等内容。" 在Java编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在给定的面试题中,提到了两种常见的单例模式实现方法:饿汉式和懒汉式。 1. 饿汉式单例类: 饿汉式单例的特点是在类加载时就完成了实例化,确保了线程安全,但可能会造成内存浪费。如代码所示,SingletonClass类的静态成员变量`instance`在类加载时即被初始化,因此无论何时调用`getInstance()`方法,返回的都是同一个实例。这种实现方式简单且线程安全,但因为类加载时即创建实例,如果实例化过程比较耗时,可能导致不必要的等待。 ```java public class SingletonClass { private static final SingletonClass instance = new SingletonClass(); private SingletonClass() {} public static SingletonClass getInstance() { return instance; } } ``` 2. 懒汉式单例模式: 懒汉式单例在第一次被使用时才进行实例化,因此延迟了实例化时间,避免了内存浪费。但是,如果没有适当的同步控制,多线程环境下可能会创建多个实例。如代码所示,使用`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; } // ...其他代码... } ``` 在这个实现中,我们初始化指针`row`为0,`column`为数组最后一列的索引。然后,我们在循环中比较目标值`number`和当前元素`array[row][column]`。如果当前元素等于目标值,返回`true`;如果当前元素大于目标值,说明目标值可能在当前列的下方,所以我们把`column`减一;如果当前元素小于目标值,说明目标值可能在当前行的右侧,所以我们把`row`加一。如果遍历完数组仍没有找到目标值,则返回`false`。 这个题目考察了对数据结构的理解以及如何利用特殊条件来优化搜索效率。而单例模式则体现了面向对象设计原则中的封装和控制实例数量的需求。这些知识点在实际开发中非常常见,对于准备IT面试或提升编程技能都至关重要。