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; // 可能抛出 ClassCastException
                System.out.println(str.toUpperCase());
            }
        }
    }
    

    输出

    HELLO
    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
        at 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) {
        // 创建一个 ArrayList
        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);
        
        // 遍历列表(使用增强的 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:适用于读多写少的并发场景。
  • 使用泛型:提高类型安全,避免运行时类型错误。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954190.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows系统“acadres.dll”文件丢失或错误导致游戏运行异常如何解决?windows系统DLL文件修复方法

acadres.dll是存放在windows系统中的一个重要dll文件&#xff0c;缺少它可能会造成部分游戏不能正常运行。当你的电脑弹出提示“无法找到acadres.dll”或“计算机缺少acadres.dll”等错误问题&#xff0c;请不用担心&#xff0c;我们将深入解析DLL文件错误的成因&#xff0c;并…

小程序如何引入腾讯位置服务

小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意&#xff1a;小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务&#xff0c;如果没有就在插件管理中添加插件 2.腾讯位置服务…

【AIGC-ChatGPT进阶提示词指令】心灵修复师:一个基于情感共鸣的智慧对话系统设计

引言 在当今快节奏的生活中&#xff0c;心理健康问题日益凸显。如何借助人工智能技术&#xff0c;构建一个既富有温度又专业可靠的心理支持系统&#xff0c;成为了一个值得深入探讨的课题。本文将详细介绍一个名为"心灵修复师"的对话系统设计&#xff0c;这个系统通…

计算机网络 (44)电子邮件

一、概述 电子邮件&#xff08;Electronic Mail&#xff0c;简称E-mail&#xff09;是因特网上最早流行的应用之一&#xff0c;并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网&#xff0c;实现了信息的快速、便捷传递。与传统的邮政系统相比&#…

《leetcode-runner》【图解】如何手搓一个debug调试器——调试程序【JDI开发】【万字详解】

前文&#xff1a; 《leetcode-runner》如何手搓一个debug调试器——引言 《leetcode-runner》如何手搓一个debug调试器——架构 《leetcode-runner》如何手搓一个debug调试器——指令系统 本文主要聚焦于如何编写调试程序 背景 在leetcode算法背景下&#xff0c;用户只编写了…

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…

【 PID 算法 】PID 算法基础

一、简介 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#xff09;、Differential&#xff08;微分&#xff09;的缩写。也就是说&#xff0c;PID算法是结合这三种环节在一起的。粘一下百度百科中的东西吧。 顾名思义&#xff0c;…

使用 WPF 和 C# 绘制覆盖网格的 3D 表面

此示例展示了如何使用 C# 代码和 XAML 绘制覆盖有网格的 3D 表面。示例使用 WPF 和 C# 将纹理应用于三角形展示了如何将纹理应用于三角形。此示例只是使用该技术将包含大网格的位图应用于表面。 在类级别&#xff0c;程序使用以下代码来定义将点的 X 和 Z 坐标映射到 0.0 - 1.…

为深度学习创建PyTorch张量 - 最佳选项

为深度学习创建PyTorch张量 - 最佳选项 正如我们所看到的&#xff0c;PyTorch张量是torch.Tensor​ PyTorch类的实例。张量的抽象概念与PyTorch张量之间的区别在于&#xff0c;PyTorch张量为我们提供了一个可以在代码中操作的具体实现。 在上一篇文章中&#xff0c;我们看到了…

Linux下源码编译安装Nginx1.24及服务脚本实战

1、下载Nginx [rootlocalhost ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz2、解压 [rootlocalhost ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/3、安装依赖 [rootlocalhost ~]# yum install gcc gcc-c make pcre-devel openssl-devel -y4、 准备 N…

4、dockerfile实现lnmp和elk

dockerfile实现lnmp 使用dockerfile n&#xff1a;nginx&#xff0c;172.111.0.10 m&#xff1a;mysql&#xff0c;172.111.0.20 p&#xff1a;php&#xff0c;172.111.0.30 安装配置nginx 1、准备好nginx和wordpress安装包 2、配置dockerfile 3、配置nginx主配置文件ngin…

一文通透OpenVLA及其源码剖析——基于Prismatic VLM(SigLIP、DinoV2、Llama 2)及离散化动作预测

前言 当对机器人动作策略的预测越来越成熟稳定之后(比如ACT、比如扩散策略diffusion policy)&#xff0c;为了让机器人可以拥有更好的泛化能力&#xff0c;比较典型的途径之一便是基于预训练过的大语言模型中的广泛知识&#xff0c;然后加一个policy head(当然&#xff0c;一开…

《操作系统真象还原》第十三章——磁盘驱动程序

文件系统磁盘创建 创建磁盘 进入bochs安装目录&#xff0c;输入以下命令 ./bin/bximage 然后按照以下步骤创建硬盘 修改硬盘配置 vim boot.disk 添加以下代码行 ata0-slave: typedisk, path"hd80M.img", modeflat,cylinders162,heads16,spt63 完整配置如下 …

快速、可靠且高性价比的定制IP模式提升芯片设计公司竞争力

作者&#xff1a;Karthik Gopal&#xff0c;SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 无论是在出货量巨大的消费电子市场&#xff0c;还是针对特定应用的细分芯片市场&#xff0c;差异化芯片设计带来的定制化需求也在芯片…

v-bind操作class

v-bind操作class 参考文献&#xff1a; Vue的快速上手 Vue指令上 Vue指令下 Vue指令的综合案例 指令的修饰符 文章目录 v-bind操作classv-bind对于样式控制的增强操作class案例(tab导航高亮)操作style操作style案例 结语 博客主页: He guolin-CSDN博客 关注我一起学习&#…

Kubernetes1.28 编译 kubeadm修改证书有效期到 100年.并更新k8s集群证书

文章目录 前言一、资源准备1. 下载对应源码2.安装编译工具3.安装并设置golang 二、修改证书有效期1.修改证书有效期2.修改 CA 证书有效期 三、编译kubeadm四、使用新kubeadm方式1.当部署新集群时,使用该kubeadm进行初始化2.替换现有集群kubeadm操作 前言 kubeadm 默认证书为一…

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)

在HarmonyOS NEXT开发环境中&#xff0c;我们可以使用nutpi/axios库来简化网络请求的操作。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库&#xff0c;从零开始实现一个简单的影视APP&#xff0c;主要关注影视搜索页的功能实现。 为什么选择nutpi/axios&#xff1f; n…

高级运维:shell练习2

1、需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 vim check.sh #!/bin/bash# 定义网络前缀 network_prefix"192.168.1"# 循环遍历1-254的IP for i in {1..254}; do# 构造完整的IP地址ip"$network_…

好用的php商城源码有哪些?

选择一个优秀的商城工具&#xff0c;能更好地帮助大家建立一个好用的商城系统。目前比较流行的都是开源PHP商城系统&#xff0c;那么现实中都有哪些好用的PHP商城源码值得推荐呢&#xff1f;下面就带大家一起来了解一下。 1.TigShop 【推荐指数】&#xff1a;★★★★★☆ 【推…

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像&#xff0c;前几天我使用Docker Desktop环境重新构建了一个…