阶段性复习 迭代器, Lambda表达式, 泛型, 单例模式

news/2024/12/4 17:19:26/

    迭代器(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方法通常效率低,显然这不是最佳的实现方案。


http://www.ppmy.cn/news/544027.html

相关文章

遍历$.each()和$().each()用法

jQuery $.each(obj,function(n,value) 遍历用法 对象的遍历 js 代码部分 <script type"text/javascript">$(function() {var $tbody $("tbody");var html "";//前提必须是对象&#xff0c;一般情况下&#xff0c;后台传过来json字符串&…

$.each()和$().each(),以及forEach()的用法

1.forEach是js中遍历数组的方法&#xff0c;如下 var arr[1,2,3,4]; arr.forEach(function(val,index,arr){//val为数组中当前的值&#xff0c;index为当前值的下表&#xff0c;arr为原数组arr[index]2*val; }); console.log(arr);//结果是修改了原数组&#xff0c;为每个数乘…

forEach和$.each()以及$().each()的用法

forEach&#xff1a;即Array.prototype.forEach&#xff0c;这是ES5中对数组新增的方法&#xff0c;等同于过去的for循环遍历数组。用法&#xff1a;arr.forEach(function(value,index,array){...}),其中的function中有按个参数&#xff0c;value为数组中的值&#xff0c;index…

etags 用法

(本文参考http://www.emacs.cn/Doc/Etags&#xff0c;并根据自己的使用情况做了些微修改。) 1. etags 基本用法 在emacs里可以用etags命令生成emacs专用的tags文件&#xff0c;有了此文件之后便可以使用一些emacs tags的命令&#xff0c;比如对于编辑C/C程序的人员可以方便的定…

Easter Eggs

题目链接&#xff1a;Easter Eggs 显然可以二分。 然后怎么check呢&#xff1f;显然我们把距离小于mid的点连起来&#xff0c;那么就相当于找一个最大独立集&#xff0c;然后最大独立集的个数要大于等于n。 然后因为连边的只是蓝色和红色之间&#xff0c;所以这是一个二分图&…

$.each() 和 $(data).each()的使用

$.each() 和 $(data).each()的区别 二者都是循环的一种处理 $(data).each()主要用于DOM节点的循环&#xff0c;也可用于一个数据对象的循环&#xff0c; $.each()主要用于对数据的处理 其实两者都可以处理DOM节点和数据对象&#xff0c;只是一个使用习惯问题 $(data).each() …

each的用法

1.数组中的each 复制代码var arr [ "one", "two", "three", "four"]; $.each(arr, function(){ alert(this); }); //上面这个each输出的结果分别为&#xff1a;one,two,three,four var arr1 [[1, 4, 3], [4, 6, 6…

eggs和egg是什么意思_egg是什么

展开全部 egg 英 [eɡ] 美 [ɛɡ] 形容词: eggless 过去式: egged 过去分词: egged 现在分词: egging 第三32313133353236313431303231363533e58685e5aeb931333335313064人称单数: eggs n.蛋&#xff1b;卵&#xff1b;蛋形物 vt.用蛋覆盖&#xff1b;向 ... 扔蛋 vt.怂恿&…