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

Java 集合框架:数据管理的强大工具

Java集合框架:数据管理的强大工具



引言

Java集合框架提供了一套丰富的数据结构,使得我们能够轻松地存储、检索、操作和管理数据。其中,Set、Map和List作为集合框架中的重要成员,各自具备独特的特性和用途,为开发者解决不同场景下的数据处理需求提供了有力支持。接下来,我们将深入探索这三种集合类型的奥秘,同时对它们进行全面的对比,以便更好地理解和运用。

一、Set集合

1. 定义与特点

Set集合是一个不包含重复元素的集合体系,它的核心特性在于元素的唯一性。这意味着在Set集合中,每个元素都是独一无二的,不存在两个完全相同的元素。同时,Set集合在存储元素时是无序的,即元素的存储顺序与它们被添加到集合中的顺序无关。这种无序性在某些场景下,如需要快速查找元素是否存在而不关心元素顺序的情况下,具有很大的优势。

2. 常用实现类 - HashSet

创建方式

在Java中创建HashSet对象有多种方式,每种方式都有其特点和适用场景。

  • 使用Set接口声明与HashSet实现类实例化
Set<String> set1 = new HashSet<>();

这种方式通过Set接口进行声明,利用HashSet实现类来实例化对象。其中,Set接口为我们提供了一套通用的操作Set集合的方法,而HashSet实现类则负责具体的实现细节。通过这种方式创建的set1对象,可以存储String类型的元素。值得注意的是,在Java 7及以上版本中,引入了钻石运算符<>,它极大地简化了泛型的声明。开发者无需在右侧重复书写泛型类型,编译器能够根据左侧的声明自动推断出正确的类型,使代码更加简洁易读。

  • 利用var关键字推断类型
var set2 = new HashSet<String>();

自Java 10版本起,引入了var关键字。使用var关键字时,编译器会根据右侧表达式的类型来推断变量的类型。在这个例子中,set2被推断为HashSet<String>类型。这种方式在局部变量声明时非常方便,尤其在一些复杂的泛型类型声明场景下,能够显著减少代码量,提高代码的编写效率。

常用方法

HashSet提供了一系列丰富的方法,方便我们对集合进行各种操作。

  • add(E e):该方法用于向HashSet集合中添加元素。如果要添加的元素在集合中已经存在,那么添加操作将失败,并且该方法会返回false。这一特性确保了集合中元素的唯一性。例如:
Set<String> set = new HashSet<>();
boolean added = set.add("apple"); // added为true
boolean addedAgain = set.add("apple"); // addedAgain为false
  • remove(Object o):此方法用于从HashSet集合中删除指定的元素。如果成功删除了指定元素,该方法将返回true;若集合中不存在要删除的元素,则返回false。例如:
Set<String> set = new HashSet<>();
set.add("banana");
boolean removed = set.remove("banana"); // removed为true
boolean notRemoved = set.remove("cherry"); // notRemoved为false
  • contains(Object o):通过该方法可以检查HashSet集合中是否包含指定的元素。如果包含,则返回true;否则返回false。这在需要快速判断某个元素是否在集合中的场景下非常有用。例如:
Set<String> set = new HashSet<>();
set.add("date");
boolean containsDate = set.contains("date"); // containsDate为true
boolean containsGrape = set.contains("grape"); // containsGrape为false
  • size()size方法用于返回HashSet集合中元素的个数,通过这个方法我们可以方便地了解集合的规模大小。例如:
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
int size = set.size(); // size为2
遍历方式

在实际应用中,我们常常需要遍历HashSet集合来处理其中的元素。Java为我们提供了多种遍历HashSet的方式。

  • 增强for循环
Set<String> hashSet = new HashSet<>();
hashSet.add("apple");
hashSet.add("banana");
hashSet.add("cherry");
for (String element : hashSet) {System.out.println(element);
}

增强for循环是一种简洁且高效的遍历方式,它不需要我们手动管理索引,会自动遍历集合中的每一个元素。在上述代码中,element依次代表集合中的每一个元素,通过这种方式可以方便地对集合元素进行处理。

  • 迭代器
Set<String> hashSet = new HashSet<>();
hashSet.add("apple");
hashSet.add("banana");
hashSet.add("cherry");
Iterator<String> iterator = hashSet.iterator();
while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);
}

使用迭代器遍历HashSet集合时,首先需要通过hashSet.iterator()方法获取一个迭代器对象。然后,利用iterator.hasNext()方法判断集合中是否还有下一个元素,若有,则通过iterator.next()方法获取下一个元素并进行相应处理。迭代器的方式相对灵活,在某些需要更精细控制遍历过程的场景下,如在遍历过程中删除元素,迭代器是更好的选择。

二、Map集合

1. 定义与特点

Map集合是一种用于存储键值对(key - value)映射关系的数据结构。它的独特之处在于通过键来查找值,一个键最多只能映射到一个值。这种映射关系使得Map集合在需要根据特定键快速获取对应值的场景下表现出色,例如在存储用户信息时,可以将用户ID作为键,用户的详细信息作为值,通过用户ID能够迅速定位到对应的用户信息。

2. 常用实现类 - HashMap

创建方式

创建HashMap对象也有其特定的方式。

HashMap<String, Integer> map = new HashMap<>();

上述代码创建了一个HashMap对象map,它可以存储String类型的键和Integer类型的值。这里同样使用了钻石运算符<>来简化泛型声明,使代码更加简洁明了。

常用方法

HashMap提供了丰富的方法来操作键值对。

  • put(K key, V value):该方法用于向HashMap中添加键值对。如果要添加的键在集合中已经存在,那么对应的旧值将被新值所更新,并且该方法会返回旧值;若键不存在,则直接添加新的键值对,此时返回null。例如:
HashMap<String, Integer> map = new HashMap<>();
Integer oldValue = map.put("apple", 1); // oldValue为null
Integer updatedValue = map.put("apple", 2); // updatedValue为1
  • get(Object key):通过这个方法可以根据指定的键从HashMap中获取对应的值。如果在集合中找不到指定的键,该方法将返回null。例如:
HashMap<String, Integer> map = new HashMap<>();
map.put("banana", 3);
Integer value = map.get("banana"); // value为3
Integer nonExistentValue = map.get("cherry"); // nonExistentValue为null
  • remove(Object key):此方法用于根据指定的键从HashMap中删除对应的键值对。它会返回被删除的值,如果集合中不存在要删除的键,则返回null。例如:
HashMap<String, Integer> map = new HashMap<>();
map.put("date", 4);
Integer removedValue = map.remove("date"); // removedValue为4
Integer notRemovedValue = map.remove("grape"); // notRemovedValue为null
  • keySet()keySet方法返回一个包含HashMap中所有键的Set集合。通过这个Set集合,我们可以方便地对键进行遍历和操作。例如:
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
Set<String> keySet = map.keySet();
for (String key : keySet) {System.out.println(key);
}
  • values():该方法返回一个包含HashMap中所有值的Collection集合。通过这个集合,我们可以对值进行遍历和处理。例如:
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
Collection<Integer> values = map.values();
for (Integer value : values) {System.out.println(value);
}
  • entrySet()entrySet方法返回一个包含HashMap中所有键值对的Set集合,集合中的每个元素都是Map.Entry类型。通过entry.getKey()entry.getValue()方法,我们可以分别获取键和值。这种方式在需要同时处理键和值的场景下非常有用。例如:
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {System.out.println("键: " + entry.getKey() + ", 值: " + entry.getValue());
}
遍历方式

遍历HashMap集合也有多种方式可供选择。

  • 通过keySet()遍历键,再用get方法取值
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 1);
hashMap.put("banana", 2);
for (String key : hashMap.keySet()) {System.out.println("键: " + key + ", 值: " + hashMap.get(key));
}

这种方式首先通过keySet()方法获取键的Set集合,然后遍历这个集合,对于每个键,再通过get方法获取对应的值。这种方式适用于只需要对键进行操作,同时需要获取对应值的场景。

  • 通过values()遍历值
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 1);
hashMap.put("banana", 2);
for (Integer value : hashMap.values()) {System.out.println("值: " + value);
}

当我们只关心HashMap中的值,而不需要对键进行操作时,可以使用这种方式。通过values()方法直接获取值的Collection集合,然后进行遍历处理。

  • 通过entrySet()遍历键值对
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 1);
hashMap.put("banana", 2);
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {System.out.println("键: " + entry.getKey() + ", 值: " + entry.getValue());
}

这种方式是遍历HashMap最常用的方式之一,通过entrySet()方法获取包含所有键值对的Set集合,然后遍历这个集合,直接获取每个键值对的键和值,能够方便地同时对键和值进行处理。

三、List集合

1. 定义与特点

List集合是一个有序的集合体系,它允许包含重复元素。与Set集合不同,List集合中的元素按照它们被添加到集合中的顺序进行存储,并且可以通过索引来访问元素。这种有序性和允许重复元素的特点使得List集合在需要维护元素顺序、并且可能存在重复元素的场景下,如存储用户操作日志、记录订单明细等,具有广泛的应用。

2. 常用实现类 - ArrayList

创建方式

创建ArrayList对象同样有多种方式。

  • 使用List接口声明与ArrayList实现类实例化
List<String> list1 = new ArrayList<>();

这种方式通过List接口进行声明,利用ArrayList实现类来实例化对象。List接口提供了一系列通用的操作List集合的方法,而ArrayList实现类负责具体的实现细节。通过这种方式创建的list1对象,可以存储String类型的元素,钻石运算符<>的使用简化了泛型声明。

  • 利用var关键字推断类型
var list2 = new ArrayList<String>();

借助Java 10引入的var关键字,编译器会根据右侧表达式new ArrayList<String>()推断出list2的类型为ArrayList<String>。这种方式在局部变量声明时简洁高效,减少了代码量。

常用方法

ArrayList提供了丰富多样的方法来满足各种操作需求。

  • add(E e):该方法用于在ArrayList列表的末尾添加元素。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
  • add(int index, E element):此方法可以在ArrayList列表的指定索引位置插入元素。需要注意的是,插入元素后,原索引位置及之后的元素索引都会向后移动一位。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add(1, "cherry"); // 此时列表为 ["apple", "cherry", "banana"]
  • remove(int index):通过该方法可以移除ArrayList列表中指定索引位置的元素。移除元素后,后续元素的索引会向前移动一位。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.remove(0); // 此时列表为 ["banana"]
  • remove(Object o):此方法用于移除ArrayList列表中第一个匹配的元素。如果成功移除元素,则返回true;若列表中不存在要移除的元素,则返回false。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
boolean removed = list.remove("apple"); // removed为true
  • get(int index):通过指定的索引,可以从ArrayList列表中返回对应位置的元素。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
String element = list.get(1); // element为"banana"
  • contains(Object o):该方法用于检查ArrayList列表中是否包含指定的元素。如果包含,则返回true;否则返回false。例如:
List<String> list = new ArrayList<>();
list.add("apple");
boolean containsApple = list.contains("apple"); // containsApple为true
  • indexOf(Object o):通过这个方法可以返回指定元素在ArrayList列表中首次出现的索引位置。如果元素不存在于列表中,则返回-1。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("apple");
int index = list.indexOf("apple"); // index为0
  • lastIndexOf(Object o):与indexOf方法类似,lastIndexOf方法返回指定元素在ArrayList列表中最后一次出现的索引位置。若元素不存在,则返回-1。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("apple");
int lastIndex = list.lastIndexOf("apple"); // lastIndex为2
  • size()size方法用于返回ArrayList列表中元素的个数,方便我们了解列表的规模。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
int size = list.size(); // size为2
  • set(int index, E element):该方法用于替换ArrayList列表中指定索引位置的元素。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.set(0, "cherry"); // 此时列表为 ["cherry", "banana"]
  • subList(int fromIndex, int toIndex):通过这个方法可以返回ArrayList列表中指定范围的子列表,包含fromIndex索引位置的元素,但不包含toIndex索引位置的元素。例如:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
List<String> subList = list.subList(0, 2); // subList为 ["apple", "banana"]
遍历方式

遍历ArrayList集合也有多种便捷的方式。

  • 普通for循环
List<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
for (int i = 0; i < arrayList.size(); i++) {System.out.println(arrayList.get(i));
}

普通for循环通过索引来遍历ArrayList列表,这种方式可以精确控制遍历的起始和结束位置,在需要对索引进行操作的场景下非常有用,例如在遍历过程中删除特定索引位置的元素。

  • 增强for循环
List<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
for (Integer element : arrayList) {System.out.println(element);
}

增强for循环简洁明了,它自动遍历ArrayList列表中的每一个元素,无需手动管理索引,适用于只需要对列表元素进行顺序处理

  • 迭代器
List<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
Iterator<Integer> listIterator = arrayList.iterator();
while (listIterator.hasNext()) {Integer element = listIterator.next();System.out.println(element);
}

迭代器方式为遍历提供了更灵活的控制,在需要在遍历过程中动态删除或添加元素时,迭代器是首选。它通过hasNext()方法判断是否还有下一个元素,并用next()方法获取元素。

四、Set、Map和List的对比

相同点

  1. 均为Java集合框架成员:Set、Map和List都属于Java集合框架的一部分,这意味着它们共享框架提供的一些基础特性和方法规范,例如都可以使用迭代器进行遍历,在内存管理和对象存储方面也遵循集合框架的通用规则。
  2. 支持泛型:三者都支持泛型的使用。通过泛型,我们可以明确集合中存储元素的类型,从而在编译期进行类型检查,提高代码的安全性和可读性。例如Set<String>Map<String, Integer>List<Double>分别指定了Set中存储字符串、Map中键为字符串值为整数、List中存储双精度浮点数。
  3. 动态大小:它们都是动态数据结构,在运行时可以根据需要动态地添加或删除元素,无需预先指定固定的容量。这使得在处理数据量不确定的场景时具有很高的灵活性。

不同点

  1. 存储结构与元素特性
    • Set:侧重于元素的唯一性,无序存储。其内部实现通常使用哈希表(如HashSet)或树结构(如TreeSet)来保证元素不重复,并且元素存储顺序与添加顺序无关。这使得在需要快速判断元素是否存在且不关心顺序的场景下表现出色,例如检查一组数据中是否有重复值。
    • Map:以键值对的形式存储数据,通过键来唯一标识值。一个键最多映射到一个值,但多个键可以映射到同一个值。Map的常用实现类HashMap基于哈希表实现,TreeMap基于红黑树实现,这使得Map在根据键快速查找值的场景下效率极高,如用户信息管理系统中通过用户ID查找用户详细信息。
    • List:有序存储且允许元素重复。元素按照添加顺序排列,可以通过索引访问特定位置的元素。ArrayList基于数组实现,在随机访问元素时性能较好;LinkedList基于链表实现,在频繁插入和删除元素的场景下更具优势,常用于需要维护元素顺序且可能有较多插入删除操作的场景,如任务队列。
  2. 常用方法差异
    • Set:主要方法围绕元素的添加(add)、删除(remove)、包含判断(contains)以及获取元素个数(size)等操作,重点在于对单个元素的处理,以维护元素的唯一性和集合的基本状态。
    • Map:除了基本的添加(put)、删除(remove)和获取大小(size)方法外,独特之处在于通过键获取值(get),以及获取键的集合(keySet)、值的集合(values)和键值对的集合(entrySet)等方法,这些方法专门用于处理键值对数据结构特有的操作需求。
    • List:方法更为丰富多样,除了添加(add)、删除(remove)和获取大小(size)外,还包括根据索引获取元素(get)、插入元素(add(int index, E element))、替换元素(set)、查找元素首次出现的索引(indexOf)和最后一次出现的索引(lastIndexOf)以及获取子列表(subList)等方法,这些方法充分体现了List有序且可通过索引操作的特性。
  3. 遍历方式侧重
    • Set:通常使用增强for循环或迭代器进行遍历,由于其无序性,一般不需要通过索引进行遍历。增强for循环简洁方便,适用于简单的元素处理;迭代器则在需要更灵活控制遍历过程(如在遍历中删除元素)时使用。
    • Map:遍历方式较为多样,通过keySet遍历键再获取值适用于仅需处理键以及顺带获取值的情况;通过values遍历值适用于只关注值的场景;而通过entrySet遍历键值对则是最常用的全面处理键值对的方式,能够同时获取键和值进行复杂操作。
    • List:普通for循环利用索引遍历,在需要精确控制索引、进行基于索引的复杂操作(如隔行删除元素)时非常有用;增强for循环用于简单顺序处理元素,无需关注索引;迭代器则用于在遍历中动态修改列表结构(如删除当前元素)的场景。

通过深入了解Set、Map和List的相同点与不同点,开发者能够根据具体的业务需求,准确地选择合适的集合类型来优化代码性能和实现高效的数据管理。在实际项目中,合理运用这三种集合类型,能够极大地提升程序的质量和开发效率。

相关文章:

Java 集合框架:数据管理的强大工具

Java集合框架&#xff1a;数据管理的强大工具 目录 Java集合框架&#xff1a;数据管理的强大工具引言一、Set集合1. 定义与特点2. 常用实现类 - HashSet创建方式常用方法遍历方式 二、Map集合1. 定义与特点2. 常用实现类 - HashMap创建方式常用方法遍历方式 三、List集合1. 定义…...

AIM-T500绝缘监测仪:实时监测,确保IT系统绝缘安全-安科瑞 蒋静

在现代工业生产中&#xff0c;电力系统的稳定性和安全性至关重要。电力系统的绝缘状况直接关系到设备的正常运行和人员的安全。为了确保IT配电系统&#xff08;不接地系统&#xff09;的绝缘状况始终处于好的状态&#xff0c;安科瑞电气股份有限公司推出了AIM-T500绝缘监测仪&a…...

css3-学习

css 特性 选择器 基础选择器 标签选择器 ID 选择器 类选择器 CSS 的优先级是什么&#xff1f; !important > 内联样式(style“”) > ID 选择器 > 类选择器 属性选择器 伪类 > 标签选择器 伪元素选择器。 层级选择器 foo bar 后代选择器&#xff0c;元素的…...

neo4j图数据库

neo4j图数据库 学习neo4j图数据库的使用 文章目录 neo4j图数据库[toc]1-核心知识点2-思路整理3-参考网址4-上手实操1-安装neo4j-docker2-要学习CQL语句3-解决cmake问题1-可能的原因及解决办法1. cmake 未正确安装或者版本不兼容2. 依赖库缺失3. 环境变量配置问题4. 网络问题 2-…...

go下的Prototype学习笔记

本博文讲解prototype的学习笔记&#xff0c;内容包含了syntax、option go_package、message、service进行讲解&#xff0c;举例了常见写法。 文章目录 1.syntax 声明语法版本2.package 给当前的proto分配包名称3.option4.message4.1 切片数组4.2 map4.3 类型嵌套 5. 消息定义 …...

[高阶技术了解]WebRPC详解

“webrpc详解”&#xff0c;我需要根据我搜索到的资料来回答这个问题。首先&#xff0c;得弄清楚webrpc到底是什么。根据&#xff0c;Webrpc是一个模式驱动的后端服务开发工具&#xff0c;允许通过RIDL或JSON模式文件生成代码&#xff0c;支持多种语言如Go、TypeScript等。它类…...

地基注解@Controller和@RestController区别

前记&#xff1a;基础啊&#xff0c;区别点重点理解&#xff1b; 在Spring和Spring Boot框架中&#xff0c;Controller和RestController都用于处理HTTP请求&#xff0c;但它们在设计目的和用法上有显著区别。以下是它们的核心区别及示例说明&#xff1a; ​1. 核心区别 特性C…...

UI自动化:seldom框架和Selenium

以下是关于 seldom框架 和 Selenium 的对比解析及结合使用的详细说明&#xff0c;帮助理解二者的定位、功能差异和应用场景&#xff1a; 1. 核心定位 工具定位Selenium浏览器自动化工具库&#xff0c;提供直接操控浏览器的底层API&#xff08;如点击、输入、获取元素等&#x…...

机器学习项目实战——信用评分与贷款风险评估(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 信用评分与贷款风险评估是金融领域中的一个重要应用场景。随着金融科技的快速发展&#xff0c;银行、信用卡公司、P2P…...

使用 OptiSLang 和 MotorCAD 构建一个强大的电机优化元模型

介绍 在本文中&#xff0c;我们将检查这些敏感性分析的结果&#xff0c;并构建一个健壮的元模型&#xff0c;作为优化过程的基础。 本文涵盖&#xff1a; 解释敏感性分析结果了解元模型及其在优化中的重要性构建和完善最佳预后模型 &#xff08;MOP&#xff09;使用预后系数…...

【科研绘图系列】python绘制分组点图(grouped dot plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据函数`generateRectBoxDF` 函数主要作用参数解释逻辑流程`nmfDotPlot` 函数主要作用参数解释逻辑流程画图1画图2画图3画图4介绍 【科研绘图系列】python绘制…...

【Android】adb shell基本使用教程

adb shell 是 Android Debug Bridge (ADB) 工具中的一个命令&#xff0c;用于在连接的 Android 设备或模拟器上执行 shell 命令。通过 adb shell&#xff0c;你可以直接与设备的 Linux 内核交互&#xff0c;执行各种操作。 基本用法 启动 adb shell&#xff1a; 在终端或命令提…...

257. 二叉树的所有路径(递归+回溯)

257. 二叉树的所有路径 力扣题目链接(opens new window) 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 思路&#xff1a;在叶子节点收割结果&#xff0c;如果不是叶子节点&#xff0c;则依次处理左右子树&a…...

C++和标准库速成(一)——HelloWorld和名称空间

目录 1. 引言1. 简单小程序"Hello World"1.1 模块导入1.2 预处理指令1.2.1 简介1.2.2 常用的预处理指令 1.3 main()函数1.4 输入输出流1.4.1 输出流1.4.2 转义字符1.4.3 输入流 2. 名称空间2.1 定义名称空间2.2 using指令2.3 嵌套名称空间2.4 名称空间别名 参考 1. 引…...

OpenHarmony 5.0 MP4封装的H265视频播放失败的解决方案

问题现象 OpenHarmony 5.0版本使用AVPlayer播放MP4封装格式的H.265(HEVC)编码格式的视频时解码失败导致播放失败 问题原因 OpenHarmony 5.0版本AVPlayer播放器使用histreamer引擎&#xff0c;因为 libav_codec_hevc_parser.z.so 动态库未开源导致从MP4封装中分离的HVCC格式的…...

索引-最左匹配

在数据库索引中&#xff0c;最左匹配原则确实在遇到某些范围查询时会停止向右匹配&#xff0c;但对于 >、<、BETWEEN 和前缀匹配的 LIKE&#xff0c;索引匹配可以继续使用后续列。以下是详细分析&#xff1a; 1. 最左匹配原则的核心规则 最左匹配原则要求查询条件从复合…...

感觉自己邮电部诗人

中心扩散 第二次做这道题&#xff0c;求回文子串最大长度的时候&#xff0c;计算写成了j-i1&#xff0c;看了15分钟才看发现哪里出了问题&#xff0c;感觉自己邮电部诗人&#xff0c;望周知。...

Java代理方式的详细介绍,包括代码示例、注释说明及其差异对比表格

Java代理方式 Java中的代理模式是一种结构型设计模式&#xff0c;用于在不修改原始类的情况下增强其功能。Java支持两种代理方式&#xff1a; 静态代理动态代理 JDK动态代理CGLIB动态代理 1. 静态代理 静态代理通过手动编写代理类实现&#xff0c;代理类和目标类实现相同的…...

接口对外安全交互新姿势

文章目录 1.前言2.姿势2.1 AES2.2 body参数签名及验签2.3使用sm2 加ip白名单 3.总结 1.前言 由于这久做了一个乐企数电开票的项目&#xff0c;已经上线了&#xff0c;真的是一言难尽&#xff0c;再回首已经是轻舟已过万重山&#xff0c;接口通过外网暴露给业务方使用&#xff0…...

Docker基础篇——Ubuntu下Docker安装

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起进行Docker安装。 Docker的官方Ubuntu安装文档&#xff0c;如…...

《深度解析DeepSeek-M8:量子经典融合,重塑计算能效格局》

在科技飞速发展的今天&#xff0c;量子计算与经典算法的融合成为了前沿领域的焦点。DeepSeek-M8的“量子神经网络混合架构”&#xff0c;宛如一把钥匙&#xff0c;开启了经典算法与量子计算协同推理的全新大门&#xff0c;为诸多复杂问题的解决提供了前所未有的思路。 量子计算…...

关于C/C++语言的初学者在哪刷题,怎么刷题

引言&#xff1a; 这篇博客主要是针对初学者关于怎么在网上刷题&#xff0c;以及在哪里刷题。 1.介绍平台&#xff08;在哪刷题&#xff09;&#xff1a; 1.牛客牛客网https://www.nowcoder.com/ &#xff1a;有许多面试题&#xff0c;也有许多供学习者练习的题 2.洛谷洛谷 …...

【redis】string类型相关操作:SET、GET、MSET、MGET、SETNX、SETEX、PSETEX

文章目录 二进制存储编码转换SET 和 GETSETGET MSET 和 MGETSETNX、SETEX 和 PSETEX Redis 所有的 key 都是字符串&#xff0c;value 的类型是存在差异的 二进制存储 Redis 中的字符串&#xff0c;直接就是按照二进制数据的方式存储的 不仅仅可以存储文本数据&#xff0c;还可…...

el-table中嵌套了el-form-item 导致的内容不垂直居中展示的问题

el-table中嵌套了el-form-item 导致的内容不垂直居中展示的问题 这个问题原先我一直没有找到问题的关键点&#xff0c;后来看了一篇文章得知由于el-form-item的margin导致的 下面的css类告诉我们。正常的表单校验margin就是20px&#xff0c;在el-table中的只有是校验失败的才会…...

LVCMOS(Low Voltage Complementary Metal-Oxide-Semiconductor)电平详解

一、LVCMOS电平的定义与核心特性 LVCMOS&#xff08;低压互补金属氧化物半导体&#xff09;是 CMOS技术的低电压版本&#xff0c;专为现代低功耗、高集成度芯片设计&#xff0c;支持 1.2V、1.8V、2.5V、3.3V 等多种电压等级。其通过优化晶体管结构和供电电压&#xff0c;显著降…...

计算机操作系统(一) 什么是操作系统

计算机操作系统&#xff08;一&#xff09; 什么是操作系统 前言一、什么是操作系统二、操作系统的作用三、推动操作系统发展的主要动力总结&#xff08;核心概念速记&#xff09;&#xff1a; 前言 当你打开电脑、点击应用、播放音乐时&#xff0c;是谁在背后默默协调这一切&…...

《用 python、MySQL 和 Chart.js 打造炫酷数据看板》实战案例笔记

今天&#xff0c;我们要构建一个数据看板系统。在这个过程中&#xff0c;我们会利用 MySQL 来存储数据&#xff0c;使用 Python 搭建后端 API&#xff0c;还会借助 Chart.js 在前端呈现各式各样的图表。 整个流程涵盖多个环节&#xff0c;首先要进行数据库表的设计&#xff0c…...

Android ANR 监控方法与事件分发耗时优化实战

一、ANR 监控方法 &#xff08;一&#xff09;系统日志分析 系统日志始终是查找 ANR 根源的重要依据。利用日志分析&#xff0c;不仅可以锁定 ANR 发生的精确时刻&#xff0c;还能追踪到主线程、关键函数调用的阻塞细节。 日志关键词检索&#xff1a;利用 ADB 命令&#xff…...

【蓝桥杯单片机】第十一届省赛

一、真题 二、创建工程 1.在C盘以外的盘新建文件夹&#xff0c;并在文件夹里面创建两个文件夹Driver 和Project 2.打开keil软件&#xff0c;在新建工程并选择刚刚建好的project文件夹&#xff0c;以准考证号命名 3.选择对应的芯片型号 4.选择否&#xff0c;即不创建启动文件 …...

【ES6】模块化

概述 模块功能主要有两个命令&#xff0c;export和import。 一个js文件就是一个模块。 参考视频 【一小时速通JavaScript模块化&#xff0c;涵盖CommonJS与ES6模块化-哔哩哔哩】 https://b23.tv/gZ1uK7V 导出成员 在正常变量、函数前加export关键字。 导入模块 在另一个…...

C++学习——顺序表(六)

文章目录 前言一、找到数组的中间位置二、有序数组中的单一元素三、杨辉三角&#xff08;Ⅱ&#xff09;四、超过阈值的最小操作数Ⅰ五、找出峰值六、统计已测试设备七、统计和小于目标的下标对数目1.单向遍历法2.双指针法&#xff08;时间复杂度小&#xff09; 八、计算K置位下…...

python迭代器生成器

迭代器生成器区别 通俗版概念 ​迭代器&#xff08;Iterator&#xff09;​ ​像“快递员送快递”​&#xff1a; 你有一个包裹清单&#xff08;比如Excel里的测试用例&#xff09;&#xff0c;快递员&#xff08;迭代器&#xff09;会按顺序一个一个送&#xff08;遍历&#x…...

Hive SQL 精进系列:字符串拼接的三种常用方式

Hive字符串拼接&#xff1a;三种常用方式深度剖析 目录 Hive字符串拼接&#xff1a;三种常用方式深度剖析引言一、简洁直观的||操作符1. 基础语法规则2. 丰富多样的示例展示3. 优势与局限分析 二、规范通用的CONCAT函数1. 全面的语法解析2. 生动的示例说明3. 优势与局限剖析 三…...

MATLAB—从入门到精通的第二天

在第一天的学习中&#xff0c;我们掌握了 MATLAB 的安装配置、基础语法、变量管理和运算符的使用。本文将深入讲解 控制结构&#xff08;嵌套 if、switch&#xff09;、循环类型 和 向量操作&#xff0c;帮助读者进一步掌握 MATLAB 的核心编程技能。 1. 条件语句进阶 1.1 嵌套…...

韦伯望远镜的拉格朗日点计算推导过程,包含MATLAB和python运动轨迹仿真代码

研究过程 起源与提出&#xff1a;1687 年牛顿提出 “三体问题”&#xff0c;旨在研究三个可视为质点的天体在相互之间万有引力作用下的运动规律&#xff0c;但因运动方程过于复杂&#xff0c;难以得到完全解。欧拉的贡献1&#xff1a;1767 年&#xff0c;瑞士数学家莱昂哈德・…...

【 现代后端架构演进:微服务设计与云原生】

现代后端架构演进&#xff1a;微服务设计与云原生 一、架构演进历程 1. 单体架构到分布式系统 单体架构瓶颈 典型问题&#xff1a;代码耦合&#xff08;代码行超百万级&#xff09;、扩展困难&#xff08;垂直扩容成本 > 1 0 5 >10^5 >105美元/节点&#xff09;、技术…...

[JAVASE] 注解

一. 注解是什么? 注解是一种为程序元素提供元数据的方法.注解就是为程序做特殊标记的. 二. java内置的注解 分别是: 作用在代码的注解是: Override - 检查该方法是否是重写方法。如果发现其父类&#xff0c;或者是引用的接口中并没有该方法时&#xff0c;会报编译错误。 De…...

热成像仪真不错

我挂在外面的网路设备箱 室内的机柜 室外的猫 所用型号为优利德UTi160S&#xff0c;显示模式为&#xff08;可见光与热成像&#xff09;融合模式。...

Vue-Virtual-Scroller虚拟滚动

前端优化不可不避的一谈之虚拟滚动&#xff1a;众所周知&#xff0c;滚动是直挺挺的往dom树加东西&#xff0c;如果滚太多滚到万级&#xff0c;渲染过多就会卡顿&#xff0c;而vue-virtual-scroll的灵活懒渲染就能解决这个问题 1&#xff0c;下载与配置 npm install --save v…...

Matlab:矩阵运算篇——矩阵

目录 1.定义 实例——创建矩阵 实例——创建复数矩阵 2.矩阵的生成 实例——M文件矩阵 2.利用文本创建 实例——创建生活用品矩阵 3.创建特殊矩阵 实例——生成特殊矩阵 4.矩阵元素的运算 1.矩阵元素的修改 实例——新矩阵的生成 2.矩阵的变维 实例——矩阵维度修…...

[Java]使用java进行JDBC编程

首先要从中央仓库下载api(类似驱动程序)&#xff0c;为了链接java和mysql 下载jar包&#xff0c;需要注意的是jar包的版本要和mysql保持一致 下面是新建文件夹lib&#xff0c;把jar包放进去&#xff0c;并添加为库 sql固定的情况下运行 import com.mysql.cj.jdbc.MysqlDataSo…...

HippoRAG 2 原理精读

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 整体流程离线索引阶段在线检索和问答阶段 总结 整体流程 从上图可以看出&#xff0c;整个流程分为两个阶段 1、离线索引阶段 2、在线检索和问答阶段 离线索引阶段…...

HTTPS协议原理:在Linux世界里的加密冒险

大家好&#xff0c;欢迎来到这次奇妙的HTTPS协议探险之旅&#xff01;今天&#xff0c;我们将一起潜入Linux的深处&#xff0c;揭开HTTPS协议那神秘而迷人的面纱。别担心&#xff0c;即使你是技术小白&#xff0c;也能在这场冒险中找到乐趣和收获。想象一下&#xff0c;你是一位…...

Spring Boot启动流程及源码实现深度解析

Spring Boot启动流程及源码实现深度解析 一、启动流程概述 Spring Boot的启动流程围绕SpringApplication类展开&#xff0c;核心流程可分为以下几个阶段&#xff1a; 初始化阶段&#xff1a;推断应用类型&#xff0c;加载ApplicationContextInitializer和ApplicationListene…...

使用pip在Windows机器上安装Open Webui,配合Ollama调用本地大模型

之前的文章分享过在 linux 服务器上安装&#xff0c;并使用Open-webui 来实现从页面上访问本地大模型的访问。也写了文章分享了我在家里 Windows Server 台式机上安装 Ollama 部署本地大模型&#xff0c;并分别使用 Chatbox 和 CherryStudio 来访问本地的大模型。今天我来分享一…...

go map的声明和使用

1.简介 map是key-value数据结构&#xff0c;又称为字段或者关联数据。类似其他语言的集合&#xff0c;map在go中是引用类型&#xff0c;必须初始化才能使用。 2.语法 map[keytype]valuetype keytype:表示间的类型。可以是基本数据类型&#xff0c;还可以是指针、channl等。…...

word毕业论文“et al.”替换为“等”——宏

Sub 中文参考文献改等()中文参考文献改等 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "([一-龥], )et al.".Replacement.Text "\1等.".Forward True.Wrap wdFindContinue.Format False.Ma…...

23. 观察者模式

原文地址: 观察者模式 更多内容请关注&#xff1a;智想天开 1. 观察者模式简介 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;用于建立对象之间的一种一对多的依赖关系。当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都…...

go的”ambiguous import in multiple modules”

执行“go mod tidy”报如下错误&#xff1a; go mod tidy -compat1.17 go: finding module for package github.com/gomooon/goredis go: found github.com/gomooon/goredis in github.com/gomooon/goredis v0.3.5 go: github.com/gomooon/core importsgithub.com/gomooon/gor…...

【鸿蒙开发】MongoDB入门

https://www.mongodb.com/try/download/community 下载MongoDB: var mongoose require("mongoose");// localhost 域名&#xff0c;代表本机 // 127.0.0.1 ip , 代码本机 mongoose.connect("mongodb://localhost:27017/jiaju").then(() > {console.l…...