当前位置: 首页 > news >正文

List 接口的实现类

在 Java 中,List 是一个非常常用的接口,提供了有序、可重复的元素集合。List 接口有多个实现类,每个实现类都有其特定的特性和适用场景。以下是 Java 中主要实现了 List 接口的类及其详细介绍。

1. 常见的 List 实现类

1.1 ArrayList

  • 简介

    • 基于动态数组实现。
    • 提供快速的随机访问(getset 操作时间复杂度为 O(1))。
    • 适合频繁的读取操作,但在插入和删除时可能较慢,尤其是在列表中间位置。
  • 特点

    • 动态扩容:当数组容量不足时,会自动扩展(通常是当前容量的 1.5 倍)。
    • 允许 null 元素
    • 非同步:不适合多线程环境下的并发访问,除非外部同步。
  • 示例

    import java.util.ArrayList;
    import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> arrayList = new ArrayList<>();arrayList.add("Apple");arrayList.add("Banana");arrayList.add("Cherry");arrayList.add("Apple"); // 允许重复元素System.out.println("ArrayList: " + arrayList);}
    }
    

    输出

    ArrayList: [Apple, Banana, Cherry, Apple]
    

1.2 LinkedList

  • 简介

    • 基于双向链表实现。
    • 适合频繁的插入和删除操作,特别是在列表的开头和中间位置。
    • 支持作为队列(FIFO)和双端队列(Deque)的实现。
  • 特点

    • 插入和删除效率高:在已知位置的插入和删除操作时间复杂度为 O(1)。
    • 随机访问较慢getset 操作时间复杂度为 O(n),因为需要遍历链表。
    • 允许 null 元素
  • 示例

    import java.util.LinkedList;
    import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> linkedList = new LinkedList<>();linkedList.add("Apple");linkedList.add("Banana");linkedList.add("Cherry");linkedList.add("Apple"); // 允许重复元素System.out.println("LinkedList: " + linkedList);}
    }
    

    输出

    LinkedList: [Apple, Banana, Cherry, Apple]
    

1.3 Vector

  • 简介

    • 类似于 ArrayList,也是基于动态数组实现。
    • 是同步的,线程安全的。
    • 适合需要线程安全的场景,但由于同步开销,性能略低于 ArrayList
  • 特点

    • 同步:所有的公开方法都是同步的,适用于多线程环境。
    • 动态扩容:默认扩容策略与 ArrayList 略有不同(通常是当前容量的两倍)。
    • 允许 null 元素
  • 示例

    import java.util.List;
    import java.util.Vector;public class VectorExample {public static void main(String[] args) {List<String> vector = new Vector<>();vector.add("Apple");vector.add("Banana");vector.add("Cherry");vector.add("Apple"); // 允许重复元素System.out.println("Vector: " + vector);}
    }
    

    输出

    Vector: [Apple, Banana, Cherry, Apple]
    

1.4 Stack

  • 简介

    • 继承自 Vector,表示后进先出(LIFO)的堆栈。
    • 提供了额外的方法,如 pushpoppeek
  • 特点

    • 继承自 Vector:具备线程安全性。
    • LIFO 结构:适用于需要堆栈行为的场景。
    • 已过时:由于继承自 Vector,不推荐使用。Java 推荐使用 Deque 接口及其实现类(如 ArrayDeque)来实现堆栈。
  • 示例

    import java.util.Stack;public class StackExample {public static void main(String[] args) {Stack<String> stack = new Stack<>();stack.push("Apple");stack.push("Banana");stack.push("Cherry");System.out.println("Stack: " + stack);String top = stack.pop();System.out.println("Popped element: " + top);System.out.println("Stack after pop: " + stack);}
    }
    

    输出

    Stack: [Apple, Banana, Cherry]
    Popped element: Cherry
    Stack after pop: [Apple, Banana]
    

1.5 CopyOnWriteArrayList

  • 简介

    • 线程安全的 List 实现,适用于读多写少的并发场景。
    • 基于“写时复制”机制,每次修改操作都会创建一个新的数组副本。
  • 特点

    • 线程安全:无需外部同步。
    • 高效的迭代:迭代时不会抛出 ConcurrentModificationException,适合并发读取。
    • 写操作开销大:每次写操作都会复制整个数组,适合读多写少的场景。
  • 示例

    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;public class CopyOnWriteArrayListExample {public static void main(String[] args) {List<String> cowList = new CopyOnWriteArrayList<>();cowList.add("Apple");cowList.add("Banana");cowList.add("Cherry");System.out.println("CopyOnWriteArrayList: " + cowList);}
    }
    

    输出

    CopyOnWriteArrayList: [Apple, Banana, Cherry]
    

1.6 StackDeque 的对比

尽管 StackList 的一个实现类,但 Java 推荐使用 Deque 接口及其实现类(如 ArrayDeque)来替代 Stack,因为它们提供了更全面和灵活的堆栈和队列操作。

  • 示例(使用 ArrayDeque 作为堆栈)

    import java.util.ArrayDeque;
    import java.util.Deque;public class ArrayDequeExample {public static void main(String[] args) {Deque<String> stack = new ArrayDeque<>();stack.push("Apple");stack.push("Banana");stack.push("Cherry");System.out.println("ArrayDeque as Stack: " + stack);String top = stack.pop();System.out.println("Popped element: " + top);System.out.println("Stack after pop: " + stack);}
    }
    

    输出

    ArrayDeque as Stack: [Cherry, Banana, Apple]
    Popped element: Cherry
    Stack after pop: [Banana, Apple]
    

2. List 实现类的选择依据

选择合适的 List 实现类取决于具体的使用场景和性能需求。以下是一些常见的选择依据:

  • 需要快速的随机访问

    • 选择ArrayList
    • 理由ArrayList 基于动态数组,实现了 O(1) 时间复杂度的随机访问。
  • 需要频繁的插入和删除操作,特别是在列表中间

    • 选择LinkedList
    • 理由LinkedList 基于双向链表,在已知位置的插入和删除操作时间复杂度为 O(1)。
  • 需要线程安全的列表

    • 选择VectorCopyOnWriteArrayList
    • 理由
      • Vector:适用于需要同步访问且写操作较多的场景。
      • CopyOnWriteArrayList:适用于读多写少的并发场景。
  • 需要作为堆栈或队列使用

    • 选择Deque 的实现类(如 ArrayDeque
    • 理由Deque 提供了比 Stack 更灵活和高效的堆栈和队列操作。

3. List 实现类的性能对比

3.1 ArrayListLinkedList

特性ArrayListLinkedList
随机访问快速(O(1))较慢(O(n))
插入和删除末尾插入和删除较快(O(1)),中间位置较慢(O(n))快速(O(1))
内存使用较低(仅存储元素)较高(存储元素及前后节点的引用)
迭代性能良好良好
适用场景需要频繁随机访问的场景需要频繁插入和删除的场景

3.2 VectorCopyOnWriteArrayList

特性VectorCopyOnWriteArrayList
同步性方法级别同步基于写时复制的同步机制
性能较低(由于同步开销)适用于读多写少的场景
迭代安全性在迭代期间修改会抛出 ConcurrentModificationException迭代期间修改不会影响当前迭代
适用场景需要线程安全且写操作频繁的场景需要线程安全且读操作频繁的场景

4. List 接口的常用方法

以下是 List 接口的一些常用方法及其说明:

方法描述
add(E e)在列表末尾添加一个元素。
add(int index, E element)在指定位置插入一个元素。
get(int index)返回指定位置的元素。
set(int index, E element)替换指定位置的元素。
remove(int index)移除指定位置的元素。
remove(Object o)移除第一个匹配的元素。
size()返回列表中的元素个数。
isEmpty()检查列表是否为空。
contains(Object o)检查列表是否包含指定元素。
clear()移除列表中的所有元素。
indexOf(Object o)返回首次出现指定元素的索引,如果不存在则返回 -1。
lastIndexOf(Object o)返回最后一次出现指定元素的索引,如果不存在则返回 -1。
subList(int fromIndex, int toIndex)返回列表的一个子视图,包含从 fromIndex(包含)到 toIndex(不包含)的元素。

4.1 示例:List 的常用操作

import java.util.List;
import java.util.ArrayList;public class ListMethodsExample {public static void main(String[] args) {List<String> fruits = new ArrayList<>();// 添加元素fruits.add("Apple");fruits.add("Banana");fruits.add("Cherry");fruits.add("Date");fruits.add("Elderberry");System.out.println("Initial List: " + fruits);// 插入元素fruits.add(2, "Coconut");System.out.println("After inserting Coconut at index 2: " + fruits);// 获取元素String fruitAt3 = fruits.get(3);System.out.println("Element at index 3: " + fruitAt3);// 修改元素fruits.set(1, "Blueberry");System.out.println("After setting index 1 to Blueberry: " + fruits);// 删除元素(按索引)fruits.remove(4);System.out.println("After removing element at index 4: " + fruits);// 删除元素(按对象)fruits.remove("Date");System.out.println("After removing 'Date': " + fruits);// 查询操作System.out.println("List size: " + fruits.size());System.out.println("List contains 'Apple': " + fruits.contains("Apple"));System.out.println("List contains 'Date': " + fruits.contains("Date"));// 获取子列表List<String> subFruits = fruits.subList(1, 3);System.out.println("Sublist from index 1 to 3: " + subFruits);// 清空列表fruits.clear();System.out.println("After clearing, is list empty? " + fruits.isEmpty());}
}

输出

Initial List: [Apple, Banana, Cherry, Date, Elderberry]
After inserting Coconut at index 2: [Apple, Banana, Coconut, Cherry, Date, Elderberry]
Element at index 3: Cherry
After setting index 1 to Blueberry: [Apple, Blueberry, Coconut, Cherry, Date, Elderberry]
After removing element at index 4: [Apple, Blueberry, Coconut, Cherry, Elderberry]
After removing 'Date': [Apple, Blueberry, Coconut, Cherry, Elderberry]
List size: 5
List contains 'Apple': true
List contains 'Date': false
Sublist from index 1 to 3: [Blueberry, Coconut]
After clearing, is list empty? true

5. List 与其他集合的对比

5.1 List vs Set

特性ListSet
元素重复性允许重复元素不允许重复元素
元素顺序保持元素的插入顺序,并支持按索引访问一般不保证元素的顺序(某些实现如 LinkedHashSet 保持插入顺序,TreeSet 按自然顺序或自定义顺序排序)
实现类ArrayListLinkedListVectorHashSetLinkedHashSetTreeSet
适用场景需要有序且可重复的元素集合需要确保元素唯一性且不关心顺序(或有特定顺序要求)

5.2 List vs Queue

特性ListQueue
元素访问方式支持按索引访问元素主要支持FIFO(先进先出)或其他特定的访问顺序
常用实现类ArrayListLinkedListLinkedListPriorityQueueArrayDeque
适用场景需要按任意顺序访问和操作元素需要按特定顺序处理元素,如任务调度、消息队列等

6. 线程安全的 List 实现

在多线程环境下,选择合适的 List 实现类和同步机制非常重要,以确保数据的一致性和避免并发问题。

6.1 使用 Collections.synchronizedList

通过 Collections.synchronizedList 方法可以将任何 List 实现类包装为线程安全的列表。

  • 示例

    import java.util.List;
    import java.util.ArrayList;
    import java.util.Collections;public class SynchronizedListExample {public static void main(String[] args) {List<String> syncList = Collections.synchronizedList(new ArrayList<>());syncList.add("Apple");syncList.add("Banana");syncList.add("Cherry");// 迭代时需要手动同步synchronized (syncList) {for (String fruit : syncList) {System.out.println(fruit);}}}
    }
    

6.2 使用 CopyOnWriteArrayList

CopyOnWriteArrayList 是一个线程安全的 List 实现,适用于读多写少的并发场景。

  • 示例

    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;public class CopyOnWriteArrayListThreadSafeExample {public static void main(String[] args) {List<String> cowList = new CopyOnWriteArrayList<>();cowList.add("Apple");cowList.add("Banana");cowList.add("Cherry");// 迭代时无需额外同步for (String fruit : cowList) {System.out.println(fruit);}}
    }
    

6.3 性能考虑

  • Collections.synchronizedList

    • 优点:适用于需要全面同步的场景。
    • 缺点:需要手动同步迭代操作,可能导致性能瓶颈。
  • CopyOnWriteArrayList

    • 优点:读操作无需同步,迭代时不会抛出 ConcurrentModificationException
    • 缺点:写操作开销较大,每次写操作都会复制整个数组。

7. List 的泛型与类型安全

List 接口是泛型接口,可以指定存储的元素类型,从而在编译时提供类型安全,避免类型转换错误。

7.1 使用泛型的优势

  • 类型安全:在编译时检查元素类型,避免运行时类型错误。

  • 无需类型转换:获取元素时无需进行显式的类型转换。

  • 示例

    import java.util.List;
    import java.util.ArrayList;public class GenericListExample {public static void main(String[] args) {List<String> stringList = new ArrayList<>();stringList.add("Hello");stringList.add("World");// stringList.add(123); // 编译错误for (String str : stringList) {System.out.println(str.toUpperCase());}}
    }
    

7.2 未使用泛型的风险

如果不使用泛型,List 将存储 Object 类型,可能导致运行时类型错误,需要进行类型转换。

  • 示例

    import java.util.List;
    import java.util.ArrayList;public class RawListExample {public static void main(String[] args) {List list = new ArrayList();list.add("Hello");list.add(123); // 允许添加不同类型的元素for (Object obj : list) {String str = (String) obj; // 可能抛出 ClassCastExceptionSystem.out.println(str.toUpperCase());}}
    }
    

    输出

    HELLO
    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringat RawListExample.main(RawListExample.java:10)
    

8. 综合示例:List 的各种操作

以下是一个综合示例,展示了 List 的常用操作,包括添加、插入、删除、修改、查询和遍历等。

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;public class ComprehensiveListExample {public static void main(String[] args) {// 创建一个 ArrayListList<String> fruits = new ArrayList<>();// 添加元素fruits.add("Apple");fruits.add("Banana");fruits.add("Cherry");fruits.add("Date");fruits.add("Elderberry");System.out.println("Initial List: " + fruits);// 插入元素fruits.add(2, "Coconut");System.out.println("After inserting Coconut at index 2: " + fruits);// 获取元素String fruitAt3 = fruits.get(3);System.out.println("Element at index 3: " + fruitAt3);// 修改元素fruits.set(1, "Blueberry");System.out.println("After setting index 1 to Blueberry: " + fruits);// 删除元素(按索引)fruits.remove(4);System.out.println("After removing element at index 4: " + fruits);// 删除元素(按对象)fruits.remove("Date");System.out.println("After removing 'Date': " + fruits);// 查询操作System.out.println("List size: " + fruits.size());System.out.println("List contains 'Apple': " + fruits.contains("Apple"));System.out.println("List contains 'Date': " + fruits.contains("Date"));// 获取子列表List<String> subFruits = fruits.subList(1, 3);System.out.println("Sublist from index 1 to 3: " + subFruits);// 遍历列表(使用增强的 for 循环)System.out.println("Iterating using enhanced for loop:");for (String fruit : fruits) {System.out.println(fruit);}// 遍历列表(使用 Iterator)System.out.println("Iterating using Iterator:");Iterator<String> iterator = fruits.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}// 使用 Lambda 表达式和 forEach 方法遍历System.out.println("Iterating using forEach and Lambda:");fruits.forEach(fruit -> System.out.println(fruit));// 清空列表fruits.clear();System.out.println("After clearing, is list empty? " + fruits.isEmpty());}
}

输出

Initial List: [Apple, Banana, Cherry, Date, Elderberry]
After inserting Coconut at index 2: [Apple, Banana, Coconut, Cherry, Date, Elderberry]
Element at index 3: Cherry
After setting index 1 to Blueberry: [Apple, Blueberry, Coconut, Cherry, Date, Elderberry]
After removing element at index 4: [Apple, Blueberry, Coconut, Cherry, Elderberry]
After removing 'Date': [Apple, Blueberry, Coconut, Cherry, Elderberry]
List size: 5
List contains 'Apple': true
List contains 'Date': false
Sublist from index 1 to 3: [Blueberry, Coconut]
Iterating using enhanced for loop:
Apple
Blueberry
Coconut
Cherry
Elderberry
Iterating using Iterator:
Apple
Blueberry
Coconut
Cherry
Elderberry
Iterating using forEach and Lambda:
Apple
Blueberry
Coconut
Cherry
Elderberry
After clearing, is list empty? true

9. 性能优化与最佳实践

9.1 预设容量

在已知大致元素数量时,可以在创建 ArrayList 时预设初始容量,以减少扩容次数,提升性能。

  • 示例

    List<String> largeList = new ArrayList<>(1000); // 预设初始容量为 1000
    

9.2 使用接口类型声明

在声明变量时,使用接口类型(如 List)而不是具体实现类(如 ArrayList),提高代码的灵活性和可维护性。

  • 示例

    List<String> list = new ArrayList<>();
    // 未来可以轻松切换为其他实现类,如 LinkedList
    list = new LinkedList<>();
    

9.3 避免频繁的自动装箱与拆箱

对于存储基本数据类型的 List,使用其包装类(如 IntegerDouble)时,应注意避免频繁的自动装箱与拆箱,以提升性能。

  • 示例

    List<Integer> numbers = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {numbers.add(i); // 自动装箱
    }
    

    优化:如果需要大量的数值数据处理,考虑使用 IntStream 或其他专用的数据结构。

10. 总结

List 接口在 Java 集合框架中占据重要地位,提供了有序、可重复的元素集合。通过了解不同 List 实现类的特性、性能和适用场景,可以在项目中选择最合适的实现类,从而优化代码的性能和可维护性。以下是关键要点:

  • 选择合适的实现类

    • ArrayList:适用于需要快速随机访问和较少插入删除操作的场景。
    • LinkedList:适用于需要频繁插入和删除操作,尤其是在列表中间位置的场景。
    • Vector:适用于需要线程安全的场景,但由于同步开销,性能较低。
    • CopyOnWriteArrayList:适用于读多写少的并发场景。
  • 使用泛型:提高类型安全,避免运行时类型错误。

  • 遵循接口编程:使用接口类型声明变量,增强代码的灵活性和可维护性。

  • 性能优化:根据具体需求预设容量,避免不必要的装箱与拆箱。

相关文章:

List 接口的实现类

在 Java 中&#xff0c;List 是一个非常常用的接口&#xff0c;提供了有序、可重复的元素集合。List 接口有多个实现类&#xff0c;每个实现类都有其特定的特性和适用场景。以下是 Java 中主要实现了 List 接口的类及其详细介绍。 1. 常见的 List 实现类 1.1 ArrayList 简介&…...

SpringCloud-基于Docker和Docker-Compose的项目部署

一、初始化环境 1. 卸载旧版本 首先&#xff0c;卸载可能已存在的旧版本 Docker。如果您不确定是否安装过&#xff0c;可以直接执行以下命令&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logro…...

【人工智能】Python中的自动化机器学习(AutoML):如何使用TPOT优化模型选择

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 随着机器学习在各行业的广泛应用&#xff0c;模型选择和优化成为了数据科学家面临的主要挑战之一。自动化机器学习&am…...

Kafka 超级简述

Kafka 就是一个 分布式的消息系统&#xff0c;它帮助不同的系统和应用之间传递信息。可以把它想象成一个超级高效的 “邮局”&#xff1a; 生产者&#xff08;Producer&#xff09; 就是把信息&#xff08;消息&#xff09;送到这个 “邮局” 的人。消费者&#xff08;Consume…...

tomcat项目运行后报500

HTTP状态 500 - 内部服务器错误 类型 异常报告消息 实例化Servlet类[com.mdy.servlet_02.LifeDemoServlet]异常描述 服务器遇到一个意外的情况&#xff0c;阻止它完成请求。例外情况jakarta.servlet.ServletException: 实例化Servlet类[com.mdy.servlet_02.LifeDemoServlet]异常…...

Chapter1:初见C#

参考书籍&#xff1a;《C#边做边学》&#xff1b; 1.初见C# 1.1 C#简介 C # {\rm C\#} C#编写了许多完成常用功能的程序放在系统中&#xff0c;把系统中包含的内容按功能分成多个部分&#xff0c;每部分放在一个命名空间中&#xff0c;导入命名空间语法格式如下&#xff1a; /…...

SQL-leetcode—620. 有趣的电影

620. 有趣的电影 表&#xff1a;cinema ------------------------ | Column Name | Type | ------------------------ | id | int | | movie | varchar | | description | varchar | | rating | float | ------------------------ id 是该表的主键(具有唯一值的列)。 每行包含…...

《鸿蒙Next平台:决策树面对噪声数据的鲁棒性逆袭》

在机器学习领域&#xff0c;决策树是一种强大的模型&#xff0c;但训练数据中的噪声往往会影响其性能和鲁棒性。在鸿蒙Next平台上&#xff0c;我们可以采用多种策略来增强决策树模型在面对噪声数据时的鲁棒性。 数据预处理层面 数据清洗&#xff1a;利用鸿蒙Next平台的数据处理…...

minio https配置

如果使用了官网的教程 使用minio-user作为启动用户 准备好&#xff1a;文件名要定死&#xff0c;因为minio只认识key和crt文件 将xxxxx.key重命名为private.key 将xxxxx.pem重命名为public.crt 将这两个文件放到/home/minio-user/.minio/certs/ 目录下 chown -r minio…...

Windows重装后NI板卡LabVIEW恢复正常

在重新安装Windows系统后&#xff0c;NI&#xff08;National Instruments&#xff09;板卡能够恢复正常工作&#xff0c;通常是由于操作系统的重新配置解决了之前存在的硬件驱动、兼容性或配置问题。操作系统重装后&#xff0c;系统重新加载驱动程序、清理了潜在的冲突或损坏的…...

Spring Initializr创建springboot项目 “java: 错误: 无效的源发行版:19”

我用的1.8的jdk&#xff0c;排查发现这是jdk和springboot版本冲突导致的。 1、File->Project Structure->Module->source和dependancies改成相应的版本 2、File->Setting->Build,Execution,Deployment->Compiler->Java Compiler->target bytecode ver…...

Vue computed属性原理及其惰性求值特点

1&#xff0c;computed属性 在 Vue.js 中&#xff0c; computed 属性是 Vue 响应式系统的一个核心特性&#xff0c;它允许开发者声明式地描述一个依赖其他响应式属性的计算值。 computed 属性是基于它们的依赖进行缓存的&#xff0c;只有当依赖发生变化时&#xff0c;它们才会…...

关于在 Kotlin DSL 中,ndk 的配置方式

在 Kotlin DSL 中&#xff0c;ndk 的配置方式有所不同&#xff0c;取决于 Android Gradle 插件版本。ndk { abiFilters(…) } 在 Kotlin DSL 中实际上是 externalNativeBuild 的一部分&#xff0c;需要通过正确的上下文调用。 错误代码&#xff1a; ndk {abiFilters("ar…...

机器学习(一)

一, Supervised Machine Learning (监督机器学习) 1,定义:学习X到Y或输入到输出的映射的算法&#xff0c;学习算法从正确答案中学习。即教机器 如何做事情(数据集学习算法模型)&#xff0c;根据已有的数据集&#xff0c;知道输入和输出结果 之间的关系&#xff0c;并根据这…...

得物App再迎开放日,全流程体验正品查验鉴别

近日&#xff0c;得物App超级品质保障中心再度迎来了开放日活动。近60位得物App的用户与粉丝齐聚超级品质保障中心&#xff0c;全流程体验正品查验鉴别。开放日当天&#xff0c;参与者有机会近距离观察得物App的商品质检区、鉴别区、收发流转区、实验室和正品库等关键功能区&am…...

《leetcode-runner》【图解】【源码】如何手搓一个debug调试器——表达式计算

前文&#xff1a; 《leetcode-runner》如何手搓一个debug调试器——引言 《leetcode-runner》如何手搓一个debug调试器——架构 《leetcode-runner》如何手搓一个debug调试器——指令系统 《leetcode-runner》【图解】如何手搓一个debug调试器——调试程序【JDI开发】【万字详解…...

Flink概述

一、Flink是什么 二、Flink特点 三、Flink vs SparkStreaming 表 Flink 和 Streaming对比 Flink Streaming 计算模型 流计算 微批处理 时间语义 事件时间、处理时间 处理时间 窗口 多、灵活 少、不灵活&#xff08;窗口必须是批次的整数倍&#xff09; 状态 有 …...

【Linux】信号

目录 一、信号的概念二、信号的产生2.1 通过键盘进行信号的产生2.2 通过系统调用进行信号的产生2.2.1 kill函数2.2.2 raise函数2.2.3 abort函数 2.3 通过异常的方式进行信号的产生2.4 通过软件条件的方式进行信号的产生2.4.1 关闭管道读端2.4.2 alarm函数 2.5 Core Dump&#x…...

【漏洞分析】DDOS攻防分析

0x00 UDP攻击实例 2013年12月30日&#xff0c;网游界发生了一起“追杀”事件。事件的主角是PhantmL0rd&#xff08;这名字一看就是个玩家&#xff09;和黑客组织DERP Trolling。 PhantomL0rd&#xff0c;人称“鬼王”&#xff0c;本名James Varga&#xff0c;某专业游戏小组的…...

【js进阶】设计模式之单例模式的几种声明方式

单例模式&#xff0c;简言之就是一个类无论实例化多少次&#xff0c;最终都是同一个对象 原生js的几个辅助方式的实现 手写forEch,map,filter Array.prototype.MyForEach function (callback) {for (let i 0; i < this.length; i) {callback(this[i], i, this);} };con…...

【VUE】计算属性+动态样式方法封装

【VUE】父子组件联动实现动态样式控制 【VUE】页面跳转实现动态样式控制 在utils下创建文件夹styleController 编写通用的方法 /*** 样式控制* 本文件主要提供一些动态控制样式的方法*//*** 控制表格表头中的 某些列 是否显示星号** param showStarActions boolean 当值为True时…...

Mac玩Steam游戏秘籍!

Mac玩Steam游戏秘籍&#xff01; 大家好&#xff01;最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心&#xff0c;我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏&#xff0c;简单又实用&#xff01; 第一步&#xff1a;下载Crossover 首先&…...

【后端面试总结】tls中.crt和.key的关系

tls中.crt和.key的关系 引言 在现代网络通信中&#xff0c;特别是基于SSL/TLS协议的加密通信中&#xff0c;.crt和.key文件扮演着至关重要的角色。这两个文件分别代表了数字证书和私钥&#xff0c;是确保通信双方身份认证和数据传输安全性的基石。本文旨在深入探讨TLS中.crt和…...

【Axure】配色库

配色库是一个专为设计师和创意工作者打造的在线资源平台&#xff0c;旨在提供丰富的色彩解决方案&#xff0c;帮助用户轻松找到或创造美观和谐的色彩搭配。其中&#xff0c;一个典型的配色库包含了以下几个核心元素&#xff1a; 渐变色&#xff1a;提供多样化的渐变色方案&…...

PL/SQL语言的语法糖

PL/SQL语言的语法糖 引言 PL/SQL&#xff08;Procedural Language/Structured Query Language&#xff09;是Oracle公司为其数据库管理系统&#xff08;DBMS&#xff09;设计的一种过程化语言。作为一种扩展SQL的语言&#xff0c;PL/SQL不仅支持数据的查询和操作&#xff0c;…...

Pytorch|YOLO

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms im…...

doc、pdf转markdown

国外的一个网站可以&#xff1a; Convert A File Word, PDF, JPG Online 这个网站免费的&#xff0c;算是非常厚道了&#xff0c;但是大文件上传多了之后会扛不住 国内的一个网站也不错&#xff1a; TextIn-AI智能文档处理-图像处理技术-大模型加速器-在线免费体验 https://…...

ZooKeeper 常见问题与核心机制解析

Zookeeper集群本身不直接支持动态添加机器。在Zookeeper中&#xff0c;集群的配置是在启动时静态定义的&#xff0c;并且集群中的每个成员都需要知道其他所有成员。当你想要增加一个新的Zookeeper服务器到现有的集群中时&#xff0c;你需要更新所有现有服务器的配置文件&#x…...

期权懂|场内期权合约行权价格是如何设定制度的?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 场内期权合约行权价格是如何设定制度的&#xff1f; 场内期权合约的行权价格是期权合约中的一个关键要素&#xff0c;它决定了期权买方在期权到期日或之前买入&#xff08;对于…...

处理 SQL Server 中的表锁问题

在 SQL Server 中&#xff0c;表锁是一个常见的问题&#xff0c;尤其是在并发访问和数据更新频繁的环境中。表锁会导致查询性能下降&#xff0c;甚至导致死锁和系统停滞。本文将详细介绍如何识别、分析和解决 SQL Server 中的表锁问题。 什么是表锁&#xff1f; 表锁是 SQL S…...

【Mysql进阶知识】Mysql 程序的介绍、选项在命令行配置文件的使用、选项在配置文件中的语法

目录 一、程序介绍 二、mysqld--mysql服务器介绍 三、mysql - MySQL 命令行客户端 3.1 客户端介绍 3.2 mysql 客户端选项 指定选项的方式 mysql 客户端命令常用选项 在命令行中使用选项 选项(配置)文件 使用方法 选项文件位置及加载顺序 选项文件语法 使用举例&am…...

代码随想录算法训练营总结

本人是一名普普通通的计算机专业的毕业生&#xff0c;在大学学数据结构和算法就感觉非常难&#xff0c;到毕业也没刷过几道题&#xff0c;所幸后来入职的公司也没有考察算法相关的内容。到现在已经工作两年多了&#xff0c;看到过许多聊面试聊算法的文章&#xff0c;也接触到一…...

二进制/源码编译安装mysql 8.0

二进制方式&#xff1a; 1.下载或上传安装包至设备&#xff1a; 2.创建组与用户&#xff1a; [rootopenEuler-1 ~]# groupadd mysql [rootopenEuler-1 ~]# useradd -r -g mysql -s /bin/false mysql 3.解压安装包&#xff1a; tar xf mysql-8.0.36-linux-glibc2.12-x86_64.ta…...

AI 编程工具—Cursor进阶使用 阅读开源项目

AI 编程工具—Cursor进阶使用 阅读开源项目 首先我们打开一个最近很火的项目browser-use ,直接从github 上克隆即可 索引整个代码库 这里我们使用@Codebase 这个选项会索引这个代码库,然后我们再选上这个项目的README.md 文件开始提问 @Codebase @README.md 这个项目是用…...

掌握C语言内存布局:数据存储的智慧之旅

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 引言正文一、数据类型介绍1.内置类型2.自定义…...

一键化配置java环境

一键化配置java环境 下载javaPathConfig 打开&#xff0c;将java的jdk路径写进去 例如我的路径就是 C:\Program Files\Java\jdk-1.8点击确认设置即可...

【I/O编程】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用&#xff08;运行中的程序&#xff09;的角度。外部特指文件。 这里的文件是泛指&#xff0c;并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…...

leetcode 面试经典 150 题:汇总区间

链接汇总区间题序号228题型数组解法一次遍历法难度简单熟练度✅✅✅ 题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属…...

联想Android面试题及参考答案

请介绍一下 Android 的架构,并谈谈对 Linux 的了解。 Android 架构主要分为四层,从下往上依次是 Linux 内核层、系统运行库层、应用框架层和应用层。 Linux 内核层是 Android 系统的基础。它提供了底层的硬件驱动程序,包括显示驱动、摄像头驱动、音频驱动等多种硬件设备的驱…...

redux 结合 @reduxjs/toolkit 的使用

1&#xff0c;使用步骤 使用React Toolkit 创建 counterStore&#xff08;store目录下&#xff09; --> 为React注入store&#xff08;src下面的index&#xff09; --> React组件使用store中的数据&#xff08;组件&#xff09; 2&#xff0c;例如下面有一个简单加减的…...

【鱼皮大佬API开放平台项目】Spring Cloud Gateway HTTPS 配置问题解决方案总结

问题背景 项目架构为前后端分离的微服务架构&#xff1a; 前端部署在 8000 端口API 网关部署在 9000 端口后端服务包括&#xff1a; api-backend (9001端口)api-interface (9002端口) 初始状态&#xff1a; 前端已配置 HTTPS&#xff08;端口 8000&#xff09;后端服务未配…...

PHP反序列化

一、PHP面向对象的基础知识 基本概念 1、面向过程VS面向对象 以做饭为例&#xff0c;面向过程是自己从原材料到成品全部自己做&#xff0c;面向对象相当于去饭店&#xff0c;点菜&#xff0c;等待结果&#xff08;上菜&#xff09;。 2、类的定义 类是定义了一件事物的抽象…...

6、原来可以这样理解C语言_函数(7/8)嵌套调⽤和链式访问

目录 七、嵌套调⽤和链式访问 七、&#xff08;1&#xff09;、嵌套调⽤ 七、&#xff08;2&#xff09;、链式访问 七、嵌套调⽤和链式访问 七、&#xff08;1&#xff09;、嵌套调⽤ 嵌套调⽤就是函数之间的互相调⽤&#xff0c;每个函数就⾏⼀个乐⾼零件&#xff0c;正是因…...

安装 Jenkins 后无法访问用户名或密码且忘记这些凭证怎么办?

Jenkins 是一款功能强大的自动化服务器&#xff0c;在持续集成与交付&#xff08;CI/CD&#xff09;领域应用广泛。不过&#xff0c;用户在使用过程中&#xff0c;尤其是首次接触该系统或系统重启后&#xff0c;常常会遇到登录方面的问题。要是 Jenkins 突然要求输入用户名和密…...

VIVADO FIFO (同步和异步) IP 核详细使用配置步骤

VIVADO FIFO (同步和异步) IP 核详细使用配置步骤 目录 前言 一、同步FIFO的使用 1、配置 2、仿真 二、异步FIFO的使用 1、配置 2、仿真 前言 在系统设计中&#xff0c;利用FIFO&#xff08;first in first out&#xff09;进行数据处理是再普遍不过的应用了&#xff0c…...

49_Lua调试

Lua提供了debug库用于创建自定义调试器,尽管Lua本身没有内置的调试器1。这个库允许开发者在程序运行时检查和控制执行流程,这对于开发过程中的错误查找和修复非常有用。 1.Debug库概述 debug库提供的函数可以分为两类:自省函数(introspection functions)和钩子函数(hoo…...

SR-BE 笔记和实验

一、笔记&#xff1a; SR不需要mpls&#xff0c;但要配置 mpls lsr-id 不需要MPLS LDP分标签&#xff0c;但仍然需要依赖IGP来分标签 fish—TE问题 SPF&#xff1a;Shortest Path First 最短路径算法 CSPF&#xff1a;Constrained SPF 受约束的SPF算法 BGP-LS&#xff1a; SR…...

实力认证 | 海云安入选《信创安全产品及服务购买决策参考》

近日&#xff0c;国内知名安全调研机构GoUpSec发布了2024年中国网络安全行业《信创安全产品及服务购买决策参考》&#xff0c;报告从产品特点、产品优势、成功案例、安全策略等维度对各厂商信创安全产品及服务进行调研了解。 海云安凭借AI大模型技术在信创安全领域中的创新应用…...

pytorch张量分块投影示例代码

张量的投影操作 背景 张量投影 是深度学习中常见的操作,将输入张量通过线性变换映射到另一个空间。例如: Y=W⋅X+b 其中: X: 输入张量(形状可能为 (B,M,K),即批量维度、序列维度、特征维度)。W: 权重矩阵((K,N),将 K 维投影到 N 维)。b: 偏置向量(可选,(N,))。Y:…...

Elasticsearch二次开发:实现实时定时同步同义词、近义词与停用词

Elasticsearch二次开发&#xff1a;实现实时定时同步同义词、近义词与停用词 引言 Elasticsearch&#xff08;ES&#xff09;作为开源搜索引擎的典范&#xff0c;以其强大的全文搜索、结构化搜索以及分析能力&#xff0c;在各个领域得到了广泛应用。在复杂的搜索场景中&#…...