迭代器(Iterator)是一种设计模式,用于顺序访问集合中的元素,而不需要了解集合内部的结构。
迭代器模式将元素的遍历行为和集合类解耦,使得可以在不修改集合类的情况下遍历集合。
具体来说,一个迭代器对象包含了遍历集合所需的状态信息,如当前遍历的元素位置等。
迭代器提供了一些方法,如 next() 方法,用于返回当前元素并移动到下一个元素。
通过这些方法,遍历者可以顺序访问集合中的元素,而不需知道如何访问集合内部的数据结构。
在Java中,标准库中提供了迭代器接口(java.util.Iterator),可以在遍历集合时使用。
通常使用 for-each 循环来遍历集合,实际上 for-each 循环内部就是通过迭代器来遍历集合的。
除了 Iterator 接口外,还有 ListIterator 接口、Enumeration 接口等,都可以用于遍历不同类型的集合。
Lambda 表达式,简称 Lambda,是 Java 8 中引入的一种新的函数式编程特性。
它允许以更简洁、更直观的方式定义一个函数,即可以将一个函数作为参数传递给另一个函数,也可以直接返回一个函数。
Lambda 表达式的语法形式为:(arguments) -> expression 或 (arguments) -> { statements; },
其中 arguments 是函数参数列表,expression 或 statements 是函数体。
Lambda 表达式的优点如下:
1. 更加简洁:和传统的匿名内部类相比,Lambda 表达式可以让代码更加简洁,更容易理解。
2. 代码更易读:通过Lambda表达式,可以让代码更加直观,更加易读。
3. 更加灵活:Lambda表达式可以赋值给函数式接口类型,可以在很多地方使用,从而大大提高了编写代码的灵活性。
在实际使用中,Lambda 表达式通常应用于函数式接口、集合的遍历、线程的创建等方面,这些场景都需要传入一个函数作为参数。
泛型(Generics)是在 Java 5 中引入的一种编程技术。它允许在定义类、
接口和方法时使用类型参数(Type Parameter),以便在代码中增加类型安全性和灵活性。
使用泛型的好处有以下几个方面:
1. 提高代码的可读性和可维护性:泛型使代码更加清晰和易于理解,
同时也减少了类型转换和错误的可能性,进而提高了代码的可维护性。
2. 增强了代码的重用性:泛型可以用于任何类型,从而提高了代码的灵活性和重用性。
3. 类型安全:泛型在编译时就能检查类型错误,从而在运行时就能避免类型转换的错误。
4. 减少代码的冗余:泛型可以省去冗余的代码,减少了代码的量。
在 Java 中,泛型由尖括号里面的参数指定,它可以用于类、接口和方法之中。
类和接口的泛型参数可以用于定义实例变量、方法形式参数和方法返回类型等位置,
从而实现类型的约束和灵活性的提升。泛型还支持类型通配符、类型参数的约束等,这些技术都可以提高泛型编程的效率和适用性。
**饿汉式:**
```java
public class Singleton {
// 将自身实例化对象设置为一个属性,并用static、final修饰
private static final Singleton instance = new Singleton();
// 构造方法私有化
private Singleton() {}
// 静态方法返回该实例
public static Singleton getInstance() {
return instance;
}
}
```
“饿汉模式”的优缺点:
优点:实现起来简单,没有多线程同步问题。
缺点:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,
从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,
静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。
**懒汉式(延迟加载):**
延迟加载就是调用get()方法时实例才被创建(先不急着实例化出对象,等要用的时候才给你创建出来。
不着急,故又称为“懒汉模式”),常见的实现方法就是在get方法中进行new实例化。
```java
public class Singleton {
// 将自身实例化对象设置为一个属性,并用static修饰
private static Singleton instance;
// 构造方法私有化
private Singleton() {}
// 静态方法返回该实例
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
“懒汉模式”的优缺点:
优点:实现起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance没有创建对象,
当getInstance方法第一次被调用时,才创建对象为其赋值,因此在某些特定条件下会节约了内存。
缺点:在多线程环境中,这种实现方法是完全错误的,根本不能保证单例的状态。
**线程安全的“懒汉模式”**
```java
public class Singleton {
// 将自身实例化对象设置为一个属性,并用static修饰
private static Singleton instance;
// 构造方法私有化
private Singleton() {}
// 静态方法返回该实例,加synchronized关键字实现同步
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
优点:在多线程情形下,保证了“懒汉模式”的线程安全。
缺点:众所周知在多线程情形下,synchronized方法通常效率低,显然这不是最佳的实现方案。