Java大师成长计划之第5天:Java中的集合框架
📢 友情提示:
本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。
在 Java 编程中,集合框架是一个不可或缺的重要部分。集合框架为开发者提供了一种高效的数据存储和操作方法,使得数据的管理和处理变得更加简单和灵活。这篇博文将深入探讨 Java 中的集合框架,包括主要的集合类型:List
、Set
、Map
以及其他相关集合类型,帮助你全面理解 Java 集合的使用。
一、什么是集合框架
集合框架是 Java 编程语言的一个重要组成部分,它为开发者提供了一组标准的数据结构和操作方法,方便存储、管理和操作数据。无论是在日常开发中还是在复杂的应用程序中,集合框架都扮演着至关重要的角色。通过集合框架,开发者能够更加高效地处理数据,提高代码的可读性和可维护性。
1.1 集合框架的定义
集合框架是 Java 提供的一套用于存储和操作数据集合的接口和类的集合。集合框架定义了一组用于处理对象的标准方法,简化了不同数据结构的操作。它包括了各种各样的集合类型,如 List
、Set
、Map
等,允许开发者根据需求选择合适的数据结构。
1.2 集合框架的主要组成部分
Java 集合框架主要由以下几个部分组成:
-
接口:集合框架的核心接口定义了集合的基本操作和行为。主要的接口包括:
Collection
:所有集合的根接口,定义了基本的集合操作。List
:表示一个有序的集合,允许重复的元素。Set
:表示一个不允许重复元素的集合。Map
:表示一个将键映射到值的集合,键不重复。
-
实现类:集合框架中各种接口的具体实现类,这些类提供了各种数据结构的具体实现。例如:
ArrayList
、LinkedList
和Vector
是List
接口的实现类。HashSet
、LinkedHashSet
和TreeSet
是Set
接口的实现类。HashMap
、LinkedHashMap
和TreeMap
是Map
接口的实现类。
-
算法:集合框架还提供了一些静态方法,用于对集合进行操作,比如排序、查找、填充和反转等。这些算法通常都是在
Collections
类中实现的。
1.3 集合框架的优势
集合框架的引入为 Java 开发带来了许多好处:
-
统一的数据处理方式:通过标准接口,开发者可以以一种统一的方式处理各种数据结构,提高代码的一致性和可读性。
-
灵活性和扩展性:集合框架提供了多种数据结构的实现,开发者可以根据具体需求选择最合适的集合类型,从而提升程序的性能和效率。
-
简化开发过程:集合框架集成了常用的数据结构和算法,使得开发者不需要从头实现这些功能,可以直接使用现有的类和方法,提高开发效率。
-
性能优化:Java 集合框架中的许多实现类使用了高效的算法和数据结构,可以在大多数情况下达到较好的性能表现。
1.4 集合框架的应用场景
集合框架广泛应用于各类 Java 程序中,以下是一些常见的应用场景:
-
数据存储与管理:在需要存储和管理大量数据时,集合框架提供了强大的数据结构,如
List
、Set
和Map
,方便进行增、删、查、改操作。 -
数据分析:集合框架中的集合类可以用来存储分析数据,结合流 (Stream) API,可以对数据进行高效的处理和分析。
-
实现常见算法:许多经典算法(如排序、查找等)可以直接使用集合框架提供的实现,帮助开发者更容易地实现复杂的功能。
1.5 总结
集合框架是 Java 编程中的基本组成部分,它提供了一种高效且灵活的数据存储和操作方式。通过理解和掌握集合框架,开发者可以更加高效地处理数据,提高代码的清晰度和可维护性。在后续学习中,深入研究集合框架的各种实现及其适用场景,将为编写高质量的 Java 应用程序打下坚实的基础。
二、List 接口
在 Java 集合框架中,List
接口是一个非常重要的部分。它表示一个有序的集合,可以包含重复的元素。List
接口提供了一系列用于操作元素的方法,使得开发者可以高效地对数据进行存储、检索和管理。下面将详细介绍 List
接口的特点、常用实现类及其应用场景。
2.1 List 接口的特点
-
有序:
List
中的元素按照插入的顺序进行存储。开发者可以通过索引来访问集合中的元素,索引从0
开始。 -
允许重复:
List
允许存储重复的元素。即使集合中已经存在某个元素,仍然可以向其中添加相同的元素。 -
动态大小:大多数
List
实现类支持动态扩展,因此可以根据需要自动调整大小,开发者无需手动管理数组的大小。 -
元素访问:可以通过索引快速访问任意元素,支持随机访问操作,这在处理大量数据时非常高效。
2.2 List 接口的常用实现类
Java 提供了多种 List
接口的实现类,每种实现类都有其特定的用途和性能特点。以下是几种常用的 List
实现类:
2.2.1 ArrayList
ArrayList
是基于动态数组实现的 List
。它的优点是支持快速的随机访问,但在插入和删除操作时性能较差,尤其是在中间位置插入或删除元素时。
import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Java");list.add("Python");list.add("JavaScript");System.out.println("ArrayList: " + list);System.out.println("First element: " + list.get(0));list.remove("Python");System.out.println("After removal: " + list);}
}
-
优点:
- 支持快速随机访问。
- 硬件优化,性能良好。
-
缺点:
- 插入和删除操作的性能较低,尤其是在中间位置。
- 需要频繁扩展时可能导致性能下降。
2.2.2 LinkedList
LinkedList
是基于双向链表实现的 List
。与 ArrayList
不同,LinkedList
适合频繁进行插入和删除操作的场景。
import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();list.add("Java");list.add("Python");list.add("JavaScript");list.addFirst("C#");System.out.println("LinkedList: " + list);list.removeLast();System.out.println("After removing last: " + list);}
}
-
优点:
- 插入和删除操作性能优越,尤其是在列表的开头或结尾进行操作时。
- 动态调整内存,不需要频繁扩展。
-
缺点:
- 随机访问性能较差,访问元素时需要遍历链表。
- 额外的内存开销,存储每个元素需要额外的指针。
2.2.3 Vector
Vector
是一个线程安全的动态数组实现。虽然它的功能与 ArrayList
类似,但由于其线程安全的特性,Vector
在性能上通常不及 ArrayList
。
import java.util.Vector;public class VectorExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("Java");vector.add("Python");vector.add("JavaScript");System.out.println("Vector: " + vector);}
}
-
优点:
- 线程安全,适合在多线程环境中使用。
- 提供了一些额外的操作,如
capacity()
和ensureCapacity()
。
-
缺点:
- 性能通常低于
ArrayList
,因为每次操作都需要进行同步。 - 不推荐在新项目中使用,通常用
ArrayList
替代。
- 性能通常低于
2.3 List 接口的常用方法
List
接口定义了一些常用的方法,开发者可以通过这些方法对列表进行操作:
-
添加元素:
boolean add(E element); void add(int index, E element);
-
获取元素:
E get(int index);
-
删除元素:
E remove(int index); boolean remove(Object object);
-
查找元素:
int indexOf(Object object); int lastIndexOf(Object object);
-
遍历:
- 使用普通的 for 循环:
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i)); }
- 使用增强的 for 循环:
for (String item : list) {System.out.println(item); }
- 使用普通的 for 循环:
2.4 List 接口的应用场景
List
接口适用于以下几种场景:
-
需要存储有序的数据:例如,维护一个学生的成绩单,可以使用
List
来按顺序存储每个学生的成绩。 -
需要允许重复元素:在购物车应用中,用户可能会重复添加相同商品,此时可以通过
List
来实现。 -
随机访问需求:当应用需要频繁访问或更新特定索引位置的元素时,使用
ArrayList
来提供快速的随机访问支持。 -
频繁插入和删除操作:如果应用需要在列表开头或中间频繁添加或删除元素,使用
LinkedList
将是一个更好的选择。
2.5 总结
List
接口是 Java 集合框架中最常用的集合类型之一,提供了灵活的数据存储和操作方式。理解 List
接口的特点和常用实现类将帮助开发者在不同行业和项目中高效地管理数据。通过选择合适的 List
实现,开发者可以在性能和功能之间找到最佳的平衡点,使得代码的可读性、可维护性和运行效率得以提升。在后续的学习中,深入掌握 List
接口的使用,将为你成为一名优秀的 Java 开发者奠定坚实的基础。
三、Set 接口
在 Java 集合框架中,Set
接口是一种用于表示不允许重复元素的集合。它是 Collection
接口的一个子接口,提供了对一组唯一元素的管理方式。在许多应用场景中,使用 Set
来存储数据可以有效避免重复和冗余,确保数据的唯一性。本文将详细介绍 Set
接口的特点、常用实现类及其应用场景。
3.1 Set 接口的特点
-
不允许重复元素:
Set
集合不允许存储重复的元素,如果尝试添加一个已经存在的元素,集合将保持不变。 -
无序性:大多数
Set
实现(如HashSet
)不保证元素的顺序,即使在插入时的顺序在迭代时也可能会有所不同。 -
动态大小:
Set
的实现类通常支持动态扩展,可以根据需要自动调整大小。 -
操作效率:
Set
提供了一些高效的操作,如快速查找、插入和删除,特别是在使用HashSet
和TreeSet
时。
3.2 Set 接口的常用实现类
Java 提供了几种 Set
接口的实现类,每种实现类都有其特定的用途和性能特点。以下是几种常用的 Set
实现类:
3.2.1 HashSet
HashSet
是基于哈希表实现的 Set
。它提供了常数时间复杂度的基本操作,如添加、删除和包含元素。由于使用哈希表存储元素,HashSet
不保证元素的顺序。
import java.util.HashSet;public class HashSetExample {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("Java");set.add("Python");set.add("JavaScript");set.add("Java"); // 尝试添加重复元素System.out.println("HashSet: " + set); // 输出集合,重复元素将被忽略}
}
-
优点:
- 操作效率高,适合快速查找。
- 内存占用较少。
-
缺点:
- 不保证元素的顺序。
- 不能有
null
元素(不允许多个null
)。
3.2.2 LinkedHashSet
LinkedHashSet
继承自 HashSet
,并维护元素的插入顺序。因此,在迭代时,LinkedHashSet
可以按元素添加的顺序返回元素。
import java.util.LinkedHashSet;public class LinkedHashSetExample {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<>();set.add("Java");set.add("Python");set.add("JavaScript");System.out.println("LinkedHashSet: " + set); // 按插入顺序输出}
}
-
优点:
- 保持元素的插入顺序。
- 在遍历时提供一致的顺序。
-
缺点:
- 内存占用比
HashSet
稍高。 - 操作效率略低于
HashSet
。
- 内存占用比
3.2.3 TreeSet
TreeSet
是基于红黑树实现的 Set
,它会根据元素的自然顺序或指定的比较器对元素进行排序。因此,TreeSet
允许快速的查找、插入和删除操作,同时还能保持元素的顺序。
import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>();set.add(5);set.add(3);set.add(7);set.add(1);System.out.println("TreeSet (sorted): " + set); // 输出有序集合}
}
-
优点:
- 自动对元素进行排序。
- 支持范围操作,如获取特定范围内的元素。
-
缺点:
- 操作效率低于
HashSet
和LinkedHashSet
,特别是在插入和删除操作时。 - 内存使用较高。
- 操作效率低于
3.3 Set 接口的常用方法
Set
接口定义了一些常用的方法,开发者可以通过这些方法对集合进行操作:
-
添加元素:
boolean add(E element);
-
删除元素:
boolean remove(Object object);
-
检查元素:
boolean contains(Object object);
-
获取集合大小:
int size();
-
遍历:
- 使用增强的 for 循环:
for (String item : set) {System.out.println(item); }
- 使用增强的 for 循环:
3.4 Set 接口的应用场景
Set
接口适用于以下几种场景:
-
需要存储唯一的数据:例如,存储用户的电子邮件地址或用户名时,使用
Set
可以确保不出现重复。 -
需要快速查找:在需要频繁查找某个元素是否存在的场景下,
HashSet
提供了高效的查找性能。 -
需要保持元素顺序:当需要在集合中维护元素的插入顺序时,
LinkedHashSet
是一个理想选择。 -
需要排序的集合:在需要对元素进行自动排序的场景下,
TreeSet
可以满足需求。
3.5 总结
Set
接口是在 Java 集合框架中用于管理不允许重复元素的一种集合类型。通过使用不同的 Set
实现类,开发者可以根据具体需求选择合适的集合类型,以提高代码的可读性、可维护性和运行效率。
掌握 Set
接口及其实现类的使用,将帮助开发者更高效地管理和处理数据,确保数据的唯一性和一致性。在实际开发中,选择合适的集合类型可以显著提升应用程序的性能和用户体验。通过不断实践和深入理解 Set
接口,开发者能够在 Java 编程的道路上走得更远,成为一名优秀的 Java 开发者。
四、Map 接口
在 Java 集合框架中,Map
接口是一个重要的数据结构,它用于存储键值对(key-value pairs)。与 List
和 Set
不同,Map
主要用于实现键到值的映射关系。Map
接口的实现类允许通过键快速查找对应的值,使得在处理关联数据时非常高效。本文将深入探讨 Map
接口的特点、常用实现类及其应用场景。
4.1 Map 接口的特点
-
键值对存储:
Map
由键(key)和值(value)组成,每个键都唯一地映射到一个值。可以通过键快速访问对应的值。 -
不允许重复键:
Map
中的每个键只能映射到一个值,如果尝试使用相同的键添加新值,旧的值将被新值替换。 -
键的唯一性:对于每个键,只能对应一个值,而值则可以重复。即同一个值可以被多个键映射。
-
动态大小:
Map
的实现类通常支持动态扩展,可以根据需要自动调整大小。
4.2 Map 接口的常用实现类
Java 提供了几种 Map
接口的实现类,每种实现类都有其特定的用途和性能特点。以下是几种常用的 Map
实现类:
4.2.1 HashMap
HashMap
是基于哈希表实现的 Map
。它提供常数时间复杂度的基本操作,如添加、删除和查找。由于使用哈希表存储键值对,HashMap
不保证元素的顺序。
import java.util.HashMap;public class HashMapExample {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("Java", 90);map.put("Python", 85);map.put("JavaScript", 80);map.put("Java", 95); // 更新值System.out.println("HashMap: " + map);System.out.println("Score of Java: " + map.get("Java")); // 输出值}
}
-
优点:
- 操作效率高,适合快速查找和插入。
- 允许
null
键和null
值,最多允许一个null
键。
-
缺点:
- 不保证元素的顺序。
- 在多线程环境下,
HashMap
不是线程安全的。
4.2.2 LinkedHashMap
LinkedHashMap
继承自 HashMap
,并维护键值对的插入顺序。在迭代时,LinkedHashMap
按照键的插入顺序返回元素。
import java.util.LinkedHashMap;public class LinkedHashMapExample {public static void main(String[] args) {LinkedHashMap<String, Integer> map = new LinkedHashMap<>();map.put("Java", 90);map.put("Python", 85);map.put("JavaScript", 80);System.out.println("LinkedHashMap: " + map); // 按插入顺序输出}
}
-
优点:
- 保持元素的插入顺序,适合需要顺序遍历的场景。
- 提供了
accessOrder
选项,可以根据访问顺序进行排序。
-
缺点:
- 内存占用比
HashMap
稍高。 - 操作效率略低于
HashMap
。
- 内存占用比
4.2.3 TreeMap
TreeMap
是基于红黑树实现的 Map
,它会根据键的自然顺序或指定的比较器对键进行排序。因此,TreeMap
适合需要有序数据的场景。
import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {TreeMap<String, Integer> map = new TreeMap<>();map.put("Java", 90);map.put("Python", 85);map.put("JavaScript", 80);System.out.println("TreeMap (sorted by key): " + map); // 输出有序集合}
}
-
优点:
- 自动对键进行排序,适合需要有序访问的场景。
- 支持范围操作,可以获取特定范围内的键值对。
-
缺点:
- 操作效率较低于
HashMap
,特别是在插入和删除操作时。 - 内存使用较高。
- 操作效率较低于
4.3 Map 接口的常用方法
Map
接口定义了一些常用的方法,开发者可以通过这些方法对映射进行操作:
-
添加元素:
V put(K key, V value);
-
删除元素:
V remove(Object key);
-
检查元素:
boolean containsKey(Object key); boolean containsValue(Object value);
-
获取值:
V get(Object key);
-
获取集合大小:
int size();
-
遍历:
-
遍历键:
for (K key : map.keySet()) {System.out.println(key + ": " + map.get(key)); }
-
遍历值:
for (V value : map.values()) {System.out.println(value); }
-
遍历键值对:
for (Map.Entry<K, V> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue()); }
-
4.4 Map 接口的应用场景
Map
接口适用于以下几种场景:
-
需要存储键值对的数据:如配置文件、用户信息等,可以通过键快速检索对应的值。
-
需要快速查找:在需要频繁查找某个值是否存在的场景下,使用
HashMap
提供的高效查找性能可显著提升性能。 -
需要维护键的顺序:当需要在集合中维护键的插入顺序时,使用
LinkedHashMap
使得遍历时能够保持插入顺序。 -
需要有序的映射:在需要对键进行排序的场景下,
TreeMap
可以提供自动排序功能,适合实现范围查询等操作。
4.5 总结
Map
接口是 Java 集合框架中用于管理键值对的基本数据结构。通过使用不同的 Map
实现类,开发者可以根据具体需求选择合适的集合类型,以提高代码的可读性、可维护性和运行效率。
掌握 Map
接口及其实现类的使用,将帮助开发者更高效地管理和处理数据,确保数据的关联性和完整性。在实际开发中,选择合适的映射类型可以显著提升应用程序的性能,并为用户提供更好的体验。通过不断实践和深入理解 Map
接口,开发者能够在 Java 编程的道路上走得更远,成为一名优秀的 Java 开发者。
五、其他集合类型
在 Java 集合框架中,除了 List
、Set
和 Map
三大核心集合类型之外,还有一些其他的重要集合类型,这些类型为特定的数据处理需求提供了更灵活和高效的解决方案。本文将介绍 Queue
、Deque
和 Collection
接口的相关内容。
5.1 Queue 接口
Queue
接口用于存储按特定顺序处理的数据集合。它通常用于实现先进先出(FIFO)的数据结构,适合那些需要按顺序处理数据的场景。Queue
接口定义了一些基本操作,如添加、删除和查看队列中的元素。
5.1.1 常用实现类
-
LinkedList:
LinkedList
既实现了List
接口,也实现了Queue
接口,因而可以用作队列。它支持在队列的两端进行插入和删除操作。import java.util.LinkedList; import java.util.Queue;public class LinkedListQueueExample {public static void main(String[] args) {Queue<String> queue = new LinkedList<>();queue.add("Java");queue.add("Python");queue.add("JavaScript");System.out.println("Queue: " + queue);System.out.println("Removed element: " + queue.remove()); // FIFOSystem.out.println("Queue after removal: " + queue);} }
-
PriorityQueue:
PriorityQueue
是一个基于优先级的队列。元素会根据其自然顺序或使用比较器指定的顺序进行排序,因此在插入元素时,最高优先级的元素会被首先取出。import java.util.PriorityQueue;public class PriorityQueueExample {public static void main(String[] args) {PriorityQueue<Integer> queue = new PriorityQueue<>();queue.add(5);queue.add(1);queue.add(3);System.out.println("PriorityQueue: " + queue); // 无序输出while (!queue.isEmpty()) {System.out.println(queue.poll()); // 按优先级出队}} }
5.2 Deque 接口
Deque
接口代表双端队列(Double-Ended Queue),允许在队列的两端进行插入和删除操作。Deque
提供了与 Queue
相似的功能,但它更灵活,支持从两端操作元素。
5.2.1 常用实现类
-
ArrayDeque:
ArrayDeque
是一个基于数组实现的双端队列,性能优于LinkedList
,且不支持容量限制。import java.util.ArrayDeque;public class ArrayDequeExample {public static void main(String[] args) {ArrayDeque<String> deque = new ArrayDeque<>();deque.addFirst("Java");deque.addLast("Python");System.out.println("ArrayDeque: " + deque);System.out.println("First element removed: " + deque.removeFirst());System.out.println("Deque after removal: " + deque);} }
-
LinkedList:同样,
LinkedList
也可以被用作Deque
,提供了从两端添加和移除元素的能力。
5.3 Collection 接口
Collection
接口是所有集合类的根接口,它定义了操作集合的基本方法,如添加、移除、包含等。虽然 Collection
本身不是一个具体的集合类型,但它提供了一些通用的方法供其他集合类型继承和实现。
5.4 其他工具类
Java 集合框架还提供了一些有用的工具类,如 Collections
和 Arrays
,用于对集合和数组进行操作的静态方法。例如,可以使用 Collections.sort()
对列表进行排序,或者使用 Collections.reverse()
反转集合的顺序。
六、总结
Java 集合框架为开发者提供了一系列强大而灵活的数据结构和算法,使得数据的存储、管理和处理变得高效而简便。通过了解和掌握 List
、Set
、Map
以及其他集合类型(如 Queue
和 Deque
),开发者能够根据具体的应用需求选择合适的集合,实现高效的数据处理。
6.1 集合框架的优势
-
高效的数据存储:各种集合类型采用不同的数据结构,能够高效地处理数据的添加、删除和查找操作。
-
灵活的操作方式:集合框架提供了丰富的接口和实现类,使得开发者能够以统一的方式处理不同的数据集合。
-
增强的可读性和可维护性:通过使用集合框架的标准接口,代码的可读性和可维护性得到提升,有助于团队协作和后期维护。
-
多样的算法支持:结合
Collections
工具类,开发者可以方便地对集合进行排序、查找和其他常见操作。
6.2 实践中的应用
在实际的 Java 开发过程中,充分利用集合框架的特性,可以帮助开发者编写出更加高效、灵活和可维护的代码。无论是处理简单的数据集合,还是应对复杂的数据结构,掌握集合框架都是成为一名优秀 Java 开发者的关键。
通过对集合框架的深入学习和实践,开发者不仅能够提升自己的编程能力,还能够在解决实际问题时更加游刃有余。希望本篇文章对你理解 Java 集合框架有所帮助,鼓励你在以后的项目中灵活运用这些知识,不断探索和学习,成为一名更出色的 Java 程序员。
相关文章:
Java大师成长计划之第5天:Java中的集合框架
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在 Java 编程中,集合框架…...
rt-linux下的D状态的堆栈抓取及TASK_RTLOCK_WAIT状态
一、背景 在之前的博客 缺页异常导致的iowait打印出相关文件的绝对路径-CSDN博客 里的 2.1 一节里的代码,我们已经有了一个比较强大的抓取D状态和等IO状态超过阈值的waker和wakee的堆栈状态的内核模块。在之前的博客 增加等IO状态的唤醒堆栈打印及缺页异常导致iowa…...
数据结构【堆和链式结构】
堆和链式结构 1.堆的概念和定义1.1堆1.2二叉树的性质 2.堆的实现3.实现链式二叉树3.1链式二叉树的概念3.2前中后遍历3.3遍历(举例) 1.堆的概念和定义 1.1堆 定义:是特殊的二叉树 #mermaid-svg-vWPNPMGSLe0nGNcd {font-family:"trebuch…...
聊一聊自动化测试
目录 一、自动化测试的定义与核心价值 (一)什么是自动化测试 (二)核心价值:从人工到智能的跨越 二、自动化测试的发展阶段 (一)萌芽阶段(早期) (二&…...
vue2 开发一个实习管理系统电脑端-前端静态网站练习
为了快速的掌握vue2的所学习到的知识点,最近又使用vue2和element-ui 做了一个实习管理系统来巩固自己的前端技术,我觉得对于新手来说,多写代码,多找一些项目练习,是提供自己编程能力的一个很好的办法,这也是…...
【Hive入门】Hive基础操作与SQL语法:DML操作全面解析
目录 1 Hive DML操作概述 2 数据加载操作 2.1 LOAD DATA语句 2.2 INSERT语句 3 数据导出操作 3.1 INSERT OVERWRITE DIRECTORY 3.2 使用HDFS命令导出 4 数据更新与删除 4.1 UPDATE语句 4.2 DELETE语句 5 MERGE操作(Hive 2.2) 6 性能优化建议…...
C++类和对象(上)
目录 类的定义类定义格式访问限定符类域 实例化实例化概念对象大小 this指针C和C语言实现Stack对比 类的定义 类定义格式 在下面的代码中,class为定义类的关键字,Stack为类的名字,{}中为类的主体, 注意类定义结束时后面分号不能省…...
LS2K0300龙芯开发板——智能车竞赛
开启 LS2K0300 调车之旅(自己写的自己慢慢更,可能写的不好欢迎指教) 欢迎大家一起讨论共同进步!逐飞科技针对 LS2K0300 MCU 开发的开源库,涵盖多种实用功能,助力竞赛与产品开发。以下是快速上手指南&#…...
电子病历高质量语料库构建方法与架构项目(智能质控体系建设篇)
引言 随着人工智能技术的迅猛发展,医疗信息化建设正经历着前所未有的变革。电子病历作为医疗机构的核心数据资产,其质量直接关系到临床决策的准确性和医疗安全。传统的病历质控工作主要依赖人工审核,存在效率低下、主观性强、覆盖面有限等问题。近年来,基于人工智能技术的…...
超级创新思路:基于CBAM-Transformer的强化学习时间序列预测模型(Python\matlab实现)
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴!需要完整代码可私信或评论! 本方案可用于医疗、金融、交通、零售、光伏功率预测、估计预测、天气预测、流量预测、故障检测等领域! 目录 首先声明,该模型为原创!原创!原创!且该思…...
JVM——垃圾收集策略
GC的基本问题 什么是GC? GC 是 garbage collection 的缩写,意思是垃圾回收——把内存(特别是堆内存)中不再使用的空间释放掉;清理不再使用的对象。 为什么要GC? 堆内存是各个线程共享的空间,…...
从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征
从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征 第一部分:概率与统计基础 第2节:数字特征:期望值、方差、协方差与相关系数 一、期望值(Expected Value):…...
【MySQL】数据类型和表的操作
目录 一. 常用的数据类型 1.数值类型 1.1 整形类型 1.2 浮点型类型 2.字符串类型 char和varchar的区别 如何选择char和varchar 3.日期类型 4.二进制类型 二. 表的操作 1.查看所有表 2.表的创建 3.查看表的结构 4.表的修改 4.1 添加新的列 4.2 修改表中现有的列 4…...
Tauri打包时出现WixTools以及NSIS报错
前言 Tauri构建时会通过github下载Wix和NSIS,由于国内网络限制,所以这个过程基本都会失败,而且你无法使用挂代理的方式解决此问题,唯一的办法就是先下载对于的库,然后把库丢到对应的文件夹内来解决此问题。。。 文章目…...
Linux操作系统学习---进程地址空间
前言: 在学习c,c这些偏底层的语言时,我们常常会对一个变量取地址,一遍对他进行一系列的操作 . 可是 , 这真的是真实的物理地址吗 ? 其实并非如此 , 通过了解进程地址空间,我们就能解开这个困惑. 一、虚拟地址空间的概念: 同地址,不同值的代码示例: 下面通过创建子进程来看一个…...
docker compose -p的踩坑经验
刚才启动ragflow解析了几百个文件,再次启动登录时报错 没有这个账户,心疼token几秒。。。 再次回顾之前的启动方式和当前的启动方式,才发现有出入。 问题: 第一次启动sudo docker compose up -d 第二次启动sudo docker compose -…...
深入理解 Linux 用户管理:从基础到实践
在 Linux 操作系统中,用户管理是确保系统安全、合理分配资源的核心环节。无论是个人开发者搭建本地开发环境,还是运维人员管理企业级服务器集群,熟练掌握 Linux 用户管理都是一项必备技能。本文将从用户管理的基础概念出发,结合实…...
Go语言之路————指针、结构体、方法
Go语言之路————指针、结构体、方法 前言指针结构体声明初始化使用组合引用结构体和指针结构体的标签 方法例子结合结构体总结 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go…...
【漫话机器学习系列】227.信息检索与数据挖掘中的常用加权技术(TF-IDF)
在自然语言处理(NLP)、信息检索(IR)和数据挖掘(DM)领域中,TF-IDF 是一种非常经典且常用的加权技术。 无论是搜索引擎排序、文本挖掘,还是特征工程,TF-IDF都扮演着重要角色…...
【音视频】FFmpeg过滤器框架分析
ffmpeg的filter⽤起来是和Gstreamer的plugin是⼀样的概念,通过avfilter_link,将各个创建好的filter按⾃⼰想要的次序链接到⼀起,然后avfilter_graph_config之后,就可以正常使⽤。 ⽐较常⽤的滤镜有:scale、trim、over…...
硬盘损坏数据恢复后对python程序的影响
最近硬盘突然间坏掉了,让数据商恢复了2个月今天终于拿到了恢复后的数据。 但是一测试问题就来了: PS E:\geosystem> python manage.py runserver 0.0.0.0:5000 Unhandled exception in thread started by <function check_errors.<locals>.…...
Azure Devops - 尝试一下在Pipeline中使用Self-hosted Windows agent
1.简单介绍 Azure Devops是微软提供的辅助软件的开发,测试,部署以及计划和进度跟踪的平台,通过Azure Devops可以使开发者,项目经理,运维人员在软件的整个生命周期中更紧密地合作,同时借助Continuous Integ…...
Linux红帽:RHCSA认证知识讲解(十 四)分区管理、交换分区,创建逻辑卷与调整逻辑卷的大小
Linux红帽:RHCSA认证知识讲解(十 四)分区管理、交换分区,创建逻辑卷与调整逻辑卷的大小 前言一、分区管理,使用fdisk管理分区1.1 找到硬盘1.2 使用fdisk分区1.3 格式化分区1.4 挂载分区 二、创建逻辑卷,调整…...
详解 Unreal Engine(虚幻引擎)
详解 Unreal Engine(虚幻引擎) Unreal Engine(简称 UE)是由 Epic Games 开发的一款全球领先的实时渲染引擎,自 1998 年随首款游戏《Unreal》问世以来,已发展成为覆盖 游戏开发、影视制作、建筑可视化、汽车…...
【Linux网络】Http服务优化 - 增加请求后缀、状态码描述、重定向、自动跳转及注册多功能服务
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
Docker compose 部署微服务项目(从0-1出发纯享版无废话)
目录 一.Docker安装 (1)安装依赖 (2)安装Docker (3)启动Docker服务 (4)系统配置 (5)镜像加速配置 (6)验证安装 二.编写Docke…...
C#学习第19天:多线程
什么是多线程? 定义:多线程允许一个程序分成多个独立的执行路径来进行并发操作。用途:提高程序的执行效率,特别是在I/O操作、计算密集型任务和用户交互中。 多线程核心概念 1. 创建和管理线程 使用 Thread 类 using System; u…...
day7 python针对心脏病数据集预处理
在数据科学与机器学习领域,数据预处理与可视化是挖掘数据价值的关键前置步骤。本文以 heart1.csv 心脑血管疾病数据集为例,借助 Python 中的 pandas、matplotlib、seaborn 以及 scikit-learn 库,详细演示数据加载、缺失值处理、特征相关性分析…...
树莓派学习专题<9>:使用V4L2驱动获取摄像头数据--设定分辨率和帧率
树莓派学习专题<9>:使用V4L2驱动获取摄像头数据--设定分辨率和帧率 1. 设定分辨率2. 设定帧率3. 设定分辨率代码解析4. 获取与设定帧率代码解析5. 实测 1. 设定分辨率 使用如下代码设定摄像头的分辨率: #define CAMERA_RESOLUTI…...
模态链:利用视觉-语言模型从多模态人类视频中学习操作程序
25年4月来自谷歌 DeepMind 和斯坦福大学的论文“Chain-of-Modality: Learning Manipulation Programs from Multimodal Human Videos with Vision-Language-Models”。 从人类视频中学习执行操作任务,是一种很有前景的机器人教学方法。然而,许多操作任务…...
JAVAEE初阶01
个人主页 JavaSE专栏 JAVAEE初阶01 操作系统 1.对下(硬件)管理各种计算机设备 2.对上(软件)为各种软件提供一个稳定的运行环境 线程 运行的程序在操作系统中以进程的形式存在 进程是系统分配资源的最小单位 进程与线程的关…...
【网络安全】用 Linux 命令行 CLI 日志文件处理指南
Linux 命令行 CLI 神技回忆录:日志文件处理指南(以 Zeek Logs 为例) 1. CLI简介2. 基础操作3. 文件读取4. 查找与筛选5. 进阶操作6. Zeek 日志骚操作7. 结语 1. CLI简介 在数据分析的世界里,图形界面(GUI)…...
[C++] 高精度乘法
目录 引入: 大整数比较比较方法例题1-青蛙计数题目描述 输入描述输出描述输入输出样例AC代码 高精度乘法模版高精度运算小合集(这集乘法上集加法) 注意: 若还没有学过高精度运算的话先去看高精度加法 引入: 大整数比较 比较方法 大整数比较可以使用此方法比较(注释有讲解): …...
反事实——AI与思维模型【82】
一、定义 反事实思维模型是一种心理认知模型,它指的是人们在头脑中对已经发生的事件进行否定,然后构建出一种可能性假设的思维活动。简单来说,就是思考“如果当时……,那么就会……”的情景。这种思维方式让我们能够超越现实的限制,设想不同的可能性和结果,从而对过去的…...
Java学习手册:Java开发常用的内置工具类包
以下是常用 Java 内置工具包。 • 日期时间处理工具包 • java.time包(JSR 310):这是 Java 8 引入的一套全新的日期时间 API,旨在替代陈旧的java.util.Date和java.util.Calendar类。其中的LocalDate用于表示不带时区的日期&…...
JAVA多线程(8.0)
目录 线程池 为什么使用线程池 线程池的使用 工厂类Executors(工厂模式) submit 实现一个线程池 线程池 为什么使用线程池 在前面我们都是通过new Thread() 来创建线程的,虽然在java中对线程的创建、中断、销毁、等值等功能提供了支持…...
通过门店销售明细表用Python Pandas得到每月每个门店的销冠和按月的同比环比数据
假设我在本地有Excel销售表,包含ID主键、门店ID、日期、销售员姓名和销售额,需要用Pandas统计出每个月所有门店和各门店销售额最高的人,不一定是一个人,以及他所在的门店ID和月总销售额。 步骤1:导入数据并处理日期 …...
详解最新链路追踪skywalking框架介绍、架构、环境本地部署配置、整合微服务springcloudalibaba 、日志收集、自定义链路追踪、告警等
1.skywalking介绍 多种监控手段,可以通过语言探针和service mesh 获得监控数据支持多种语言自动探针,包含java/net/nodejs轻量高效,无需大数据平台和大量的服务器资源模块化,UI、存储、集群管理都有多种机制可选支持告警优秀的可…...
【OSG学习笔记】Day 11: 文件格式与数据交换
OSG 常用文件格式简介 在开始转换前,先了解 OSG 生态中常见的文件格式: .osg:OSG 标准二进制格式,存储场景图数据,体积小、加载快,适合实时渲染。 .ive:OSG 标准文本格式,可读性强,便于手动编辑或调试场景图结构(本质是 XML 格式的文本描述)。 .osgb:OSG 二进制格…...
2025.04.26-美团春招笔试题-第二题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 曼哈顿距离探测器 问题描述 K小姐正在研发一种城市交通探测器,该探测器能够检测城市中任意两个位置之间的曼哈顿距离是否恰好为特定值。曼哈顿距离是在直角坐标系中,两点之间…...
搭建基于火灾风险预测与防范的消防安全科普小程序
基于微信小程序的消防安全科普互动平台的设计与实现,是关于微信小程序的,知识课程学习,包括学习后答题。 技术栈主要采用微信小程序云开发,有下面的模块: 1.课程学习模块 2.资讯模块 3.答题模块 4.我的模块 还需…...
05--Altium Designer(AD)的详细安装
一、软件的下载 Altium Designer官网下载 1、临近五一的假期,想着搞个项目,且这个项目与PCB有关系,所以就下这个软件来玩玩。下面保姆级教大家安装。 2、选择适合自己的版本下载(我安装的是24的) 3、软件安装 1.下…...
药监平台上传数据报资源码不存在
问题:电子监管码上传药监平台提示“导入的资源码不存在” 现象:从生产系统导出的关联关系数据包上传到药监平台时显示: 原因:上传数据包的通道的资源码与数据包的资源码不匹配。 解决方法:检查药监平台和生产系统的药…...
DeepSeek预训练追求极致的训练效率的做法
DeepSeek在预训练阶段通过多种技术手段实现了极致的训练效率,其中包括采用FP8混合精度训练框架以降低计算和内存需求 ,创新性地引入Multi-head Latent Attention(MLA)压缩KV缓存以提升推理效率,以及基于Mixture-of-Experts(MoE)的稀疏计算架构以在保证性能的同时显著降低…...
Windows11系统中GIT下载
Windows11系统中GIT下载 0、GIT背景介绍0.0 GIT概述0.1 GIT诞生背景0.2 Linus Torvalds 的设计目标0.3 Git 的诞生(2005 年)0.4 Git 的后续发展0.5 为什么 Git 能成功? 1、资源下载地址1.1 官网资源1.2 站内资源 2、安装指导3、验证是否下载完…...
Maven的概念与初识Maven
目录 一、Maven的概念 1. 什么是Maven 2. 项目构建:从代码到部署的标准化流程 2.1 Maven构建生命周期 2.2 传统构建 vs Maven构建 3. 依赖管理:解决“JAR地狱”的利器 3.1 依赖声明 3.2 依赖传递与冲突解决 4. Maven仓库:依赖的存储…...
【Android】app调用wallpaperManager.setBitmap的隐藏权限
这是一个杞人忧天的问题,app中,可以通过wallpaperManager.setBitmap来设置壁纸, private void setWallpaper() {// 获取 WallpaperManager 实例WallpaperManager wallpaperManager WallpaperManager.getInstance(getApplicationContext());t…...
ORACLE数据库备份入门:第四部分:2-备份场景举例
下面以4个常见的场景为例,介绍如何规划备份方案。备份方案没有标准答案,需要根据实现情况来制定,也和管理员的个人使用习惯有很大相关性。 1 交易型数据库备份 以银行的交易系统为例,除了前一章节提到的关于RPO和RTO的指标外&am…...
STL中emplace实现原理是什么?
template <class... Args>void emplace_back (Args&&... args);这个是vector的emplace_back方法,用到的c11的语法有三个,分别是万能引用、完美转发、参数包。 参数包中的参数是用来构造vector<T>中的T对象。 假如我直接传的就是一个…...
血泪之arduino库文件找不到ArduinoJSON.h: No such file or directory错误原因
#include <ArduinoJson.h> 始终报这个错误, C:\techxixi_project\Arduino\test\camer\camertoserver\camertoserver.ino:6:10: fatal error: ArduinoJSON.h: No such file or directory 6 | #include <ArduinoJSON.h> | ^~~~~~~~~…...