本文参考《剑指Offer》一书,代码采用Java实现。题目一:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 题目二:在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。 本文的两道题解题思路是不一样的,具体事项见正文。
剑指Offer(2) 实现Singleton模式
饿汉模式不会出现产生多个实例的情况,见单例模式的通用代码。懒汉模式在volatile关键字修饰后,使用双重锁机制,可以解决多个实例被构建的情况,以及由于指令重排而导致的返回一个没有初始化完成的singleton对象。 实现单例模式的手段非常多,还有通过静态内部类实现的方法。 但是上述方法存在共同的问题: 无法防止利用反射来重复构建对象。 阻止反射的构建方式是使用枚举类型,有了enum语法糖,JVM会阻止反射获取枚举类的私有构造方法。 最后还有使用工厂方法模式替代单例模式,当然,其他类也可以通过反射的方式构建一个单例模式。 本文还简单的总结了volatile的两种语义的使用。