(八)Java-Collection

一、Collection接口
1.特点
Collection实现子类可以存放多个元素,每个元素可以是Object;
有些Collection的实现类,可以存放重复的元素,有些不可以;
有些Collection的实现类,有些是有序的(List),有些则不是有序(Set);
Collection接口没有直接的实现子类,通过其子接口List和Set来实现的。
2.方法
add : 添加单个元素;
remove : 删除指定元素;
contains : 查找元素是否存在;
size : 获取元素个数;
isEmpty : 判断是否为空;
clear : 清空;
addAll : 添加多个元素;
containaAll :查找多个元素是否都存在;
removeAll : 删除多个元素。
3.遍历
Iterator(迭代器)(不推荐使用)
增强 for 循环
二、List
1.特点
List集合类中元素有序(即添加和取出顺序一致),且可重复;
List集合中的每个元素都有其对应的顺序索引,即支持索引;
List容器中的元素都对应一个整数型的序号记录其在容器中的位置,根据序号存取容器中的元素;
List常用接口有 ArrayList、LinkedList、Vector。
2.方法
void add (int index,Object ele) :在index位置插入ele元素;
boolean addAll (int index,Collection eles) :从index位置开始将eles集合中的所有元素添加进来;
Object get (int index) :获取指定index位置的元素;
int indexOf (Object obj) :返回obj在集合中首次出现的位置;
int lastIndexOf (Object obj) :返回obj在集合中末次出现的位置;
Object remove (int index) :移除指定index位置的元素,并返回此元素;
Object set (int index,Object ele) :设置指定index的位置的元素为ele,相当于是替换;
List subList (int fromIndex,int toIndex) :返回从fromIndex到toIndex位置的子集合。
3.遍历
Iterator(迭代器)(不推荐使用)
增强 for 循环
普通for循环
4.实现
ArrayList、LinkedList、Vector的比较:

三、ArrayList
1.概述
底层实现:实现了 List 接口,基于动态数组。
特点:有序、可重复、动态大小。
初始容量:10
扩充机制:1.5倍(内部通过 grow() 方法完成扩容)
访问速度:时间复杂度为 O(1),随机访问速度快。
增删速度:时间复杂度为 O(n),插入和删除速度较慢,尤其是在列表中间插入或删除时,因为需要移动大量元素。
线程安全性:不是线程安全的。
常用场景:适用于频繁读取而不频繁插入或删除的场景。
2.构造方法
| ArrayList() // 默认构造方法,创建一个容量为 10 的空列表 ArrayList(int initialCapacity) // 创建一个指定初始容量的空列表 ArrayList(Collection<? extends E> c) // 创建一个包含指定集合元素的列表 |
3.常用方法
add(E e):将指定元素添加到列表的末尾。
add(int index, E element):将指定元素添加到指定位置。
get(int index):返回指定索引处的元素。
set(int index, E element):用指定元素替换指定位置的元素。
remove(int index):删除指定位置的元素,并返回该元素。
remove(Object o):删除列表中第一次出现的指定元素,如果元素不存在则返回 false。
clear():删除列表中的所有元素。
size():返回列表中元素的数量。
isEmpty():如果列表为空,返回 true。
contains(Object o):判断列表中是否包含指定元素。
indexOf(Object o):返回指定元素第一次出现的索引,找不到返回 -1。
lastIndexOf(Object o):返回指定元素最后一次出现的索引。
toArray():将列表转换为一个普通数组。
toArray(T[] a):将列表转换为指定类型的数组。
4.线程安全
使用 Collections.synchronizedList() 方法:
List<String> list = Collections.synchronizedList(new ArrayList<>())
使用 CopyOnWriteArrayList()方法(是一个线程安全的变体,适合读多写少的场景):
List<String> list = new CopyOnWriteArrayList<>()
四、Vector
1.概述
底层实现:实现了 List 接口,并继承自 AbstractList 类,基于动态数组,类似于 ArrayList。
特点:有序、可重复、动态大小。
初始容量:10
扩充机制:2倍(内部通过 grow() 方法完成扩容/可指定增量)
访问速度:时间复杂度为 O(1),随机访问速度快。
增删速度:时间复杂度为 O(n),插入和删除速度较慢。
线程安全性:线程安全,因为所有的方法都是同步的。
常用场景:适用于需要线程安全且不特别关注性能的场景。由于同步的开销,相较于 ArrayList 性能会有所下降。
| // 创建一个初始容量为 5,容量增量为 3 的 Vector Vector<Integer> vector = new Vector<>(5, 3); |
2.构造方法
| Vector() // 默认构造方法,创建一个容量为 10 的空向量 Vector(int initialCapacity) // 创建一个指定初始容量的空向量 Vector(int initialCapacity, int capacityIncrement) // 创建一个指定初始容量和扩展大小的空向量 Vector(Collection<? extends E> c) // 创建一个包含指定集合元素的向量 |
3.常用方法
add(E e):将指定元素添加到向量的末尾;
add(int index, E element):将指定元素插入到指定位置;
addElement(E obj):将指定元素添加到向量的末尾( Vector特有方法);
get(int index):返回指定位置的元素;
set(int index, E element):用指定元素替换指定位置的元素;
elementAt(int index):返回指定位置的元素(Vector特有方法);
firstElement():返回向量中的第一个元素;
lastElement():返回向量中的最后一个元素;
remove(int index):删除指定位置的元素,并返回该元素;
remove(Object o):删除列表中第一次出现的指定元素;
removeElement(Object obj):删除指定的元素;
removeAllElements():删除所有元素;
size():返回向量的大小,即元素的个数;
isEmpty():如果向量为空,返回 true;
contains(Object o):判断向量中是否包含指定的元素;
indexOf(Object o):返回指定元素第一次出现的索引,找不到返回 -1;
lastIndexOf(Object o):返回指定元素最后一次出现的索引;
toArray():将向量转换为一个普通数组;
toArray(T[] a):将向量转换为指定类型的数组;
iterator():返回一个迭代器,用于遍历向量。
五、LinkedList
1.概述
底层实现:基于链表,由一系列的节点(Node)组成,每个节点包含两个部分。
数据部分:存储实际的数据。
指针部分:指向下一个节点的引用(或者在双向链表中,指向前一个节点和下一个节点的引用)。
特点:有序,可重复,动态大小,内存开销大。
访问速度:随机访问速度较慢,需要从头开始遍历。
增删速度:插入和删除速度较快,只需更改指针而不移动元素。
线程安全性:不是线程安全的。
常用场景:适用于频繁插入和删除操作的场景。
2.基本类型
单向链表:
每个节点有一个数据部分和一个指向下一个节点的指针。链表的末尾节点的指针指向 null。
双向链表:
每个节点有两个指针:一个指向下一个节点,另一个指向前一个节点。
循环链表:
单向链表或双向链表的变体,末尾节点指向头节点(而不是 null),形成一个环。
3.操作
插入:
在头部插入(头插法)、在尾部插入(尾插法)、在指定位置插入。
删除:
删除头节点、删除尾节点、删除指定位置的节点。
查找:
查找链表中的元素,可以通过遍历链表逐一比较每个节点的值。
更新:
更新链表中的某个节点的值,首先找到该节点,再修改其数据部分。
4.时间复杂度
插入和删除操作:
在链表的头部插入或删除:O(1)
在链表的尾部插入或删除:O(1)(但如果没有尾指针则需要 O(n))
在中间插入或删除:
O(n)(需要遍历到特定位置)
查找操作:
O(n)(必须遍历链表才能找到特定元素)
访问操作:
O(n)(无法直接通过索引访问,必须从头开始遍历)
六、Set
1.特点
无序(添加和取出的顺序不一致),没有索引;
不允许重复元素,所以最多包含一个null;
Set的常用实现类有:HashSet、LinkedHashSet和TreeSet。
2.遍历
Iterator(迭代器)(不推荐使用)
增强 for 循环
3.线程安全
CopyOnWriteArraySet(基于 CopyOnWriteArrayList)
4.实现
HashSet、LinkedHashSet、TreeSet和CopyOnWriteArraySet比较:

七、HashSet
1.概述
底层实现:基于哈希表(HashMap)实现,使用哈希算法来存储元素。
特点:无序、不可重复,高效。
初始容量:16
负载因子:0.75
扩充机制:条目数 > 容量 × 负载因子,哈希表将会自动增加桶的数量,一般是当前容量的两倍(rehashing),会重新计算所有现有元素的存储位置。
存储规则:存储的元素不可重复,元素在 HashSet 中没有顺序,即元素存储的顺序不一定与插入顺序相同。
增删速度:一般为时间复杂度O(1),最坏为O(n)。
线程安全性:线程不安全。
场景:适用于需要高效地添加、删除和查找元素,并且不关心元素的顺序。
2.哈希值和哈希冲突
HashSet 使用元素的 hashCode() 方法来决定元素的存储位置。如果两个不同的元素有相同的哈希值,就会发生哈希冲突。为了减少冲突,HashSet 会使用链表或红黑树等结构来存储具有相同哈希值的元素。通过 equals() 方法判断两个元素是否相等。
hashCode():返回一个整数值,表示对象的哈希值。这个哈希值用于决定对象在哈希表中的存储位置。
equals():用于比较两个对象是否相等。
3.常用方法
add(E e):将指定元素添加到集合中;
remove(Object o):从集合中移除指定元素,如果集合中包含该元素;
contains(Object o):检查集合中是否包含指定元素o;
size():返回集合中元素的数量;
isEmpty():检查集合是否为空;
clear():清空集合中的所有元素。
八、LinkedHashSet
1.概述
底层实现:继承HashSet,实现了Set接口;结合了哈希表和链表的特性。
特点:插入有序、不可重复、性能低于HashSet。
初始容量:16 负载因子:0.75
扩充机制:同HashSet。
存储规则:根据元素的 hashCode 值来决定元素的存储位置,同时使用链表维护元素的次序。
查增删速度:平均情况下为 O(1)。
线程安全性:线程不安全。
场景:维护元素的插入顺序、去重并保留顺序、性能要求不高,但需要顺序。
2.构造方法
| // 创建一个空的 LinkedHashSet,默认初始容量 16,负载因子 0.75 LinkedHashSet<E> set1 = new LinkedHashSet<>(); // 创建一个指定初始容量的 LinkedHashSet LinkedHashSet<E> set2 = new LinkedHashSet<>(int initialCapacity); // 创建一个指定初始容量和负载因子的 LinkedHashSet LinkedHashSet<E> set3 = new LinkedHashSet<>(int initialCapacity, float loadFactor); // 使用一个现有的集合创建一个 LinkedHashSet LinkedHashSet<E> set4 = new LinkedHashSet<>(Collection<? extends E> c); |
3.常见方法
add(E e):添加元素;
remove(Object o):删除指定元素;
contains(Object o):是否存在;
size():返回元素的数量;
clear():清空集合;
isEmpty():是否为空;
iterator():返回一个迭代器,遍历集合;
forEach():使用 forEach() 方法遍历集合。
九、TreeSet
1.概述
底层实现:基于红-黑树(一种自平衡的二叉查找树)实现。
特点:有序、不可重复、高效、支持 NavigableSet 接口。
存储规则:存储的元素不可重复,元素有序,按照自然顺序或者指定的比较器进行排序。如果元素是自定义对象,则需要实现 Comparable 接口或者提供 Comparator。
增删速度:时间复杂度 O(log n)。
线程安全性:线程不安全。
场景:适用于需要元素有序存储,并且支持自然顺序或者自定义排序规则。
2.底层解析
红黑树具有以下特性:
每个节点要么是红色,要么是黑色。
根节点始终是黑色的。
每个叶子节点(NIL)是黑色的。
如果一个红色节点有子节点,那么该子节点必须是黑色的。
从任何节点到其所有后代叶节点的路径上,必须包含相同数量的黑色节点。
3.常见操作和方法
add(E e):添加元素;
remove(Object o):删除指定元素;
contains(Object o):检查指定元素是否存在;
size():返回元素数量;
first():返回集合中的第一个元素,即最小的元素;
last():返回集合中的最后一个元素,即最大的元素;
headSet(E toElement):返回一个视图,小于 toElement 的所有元素;
tailSet(E fromElement):返回一个视图,大于等于 fromElement 所有元素;
subSet(E fromElement, E toElement):返回一个视图,包含在 fromElement 和 toElement 之间的元素;
pollFirst():移除并返回最小元素(即第一个元素);
pollLast():移除并返回最大元素(即最后一个元素)。
十、CopyOnWriteArrayList
是Java中一个线程安全的List实现类,属于 java.util.concurrent包。与常见的 ArrayList 相比,CopyOnWriteArrayList 的一个显著特点是写操作时会复制数组,从而保证线程安全。
1.概述
底层数据结构:动态数组,通过复制数组的方式来实现对集合的写操作。
对于写操作,会创建一个新的内部数组,然后将数据复制到这个新数组中,修改操作只会作用于这个新数组。这意味着写操作的成本较高。
主要特点:有序、可重复,读操作不受影响,写操作代价较高。
初始容量:0 (可指定)
时间复杂度:读:O(1)或O(n),其他:O(n)。
线程安全性:线程安全。
应用场景:适用于对并发读有较高需求,但写操作较少的场景,如缓存、事件监听、日志记录等。
2.构造方法
| // 创建一个空的 CopyOnWriteArrayList CopyOnWriteArrayList<E> list = new CopyOnWriteArrayList<>(); // 创建一个包含指定元素的 CopyOnWriteArrayList CopyOnWriteArrayList<E> list2 = new CopyOnWriteArrayList<>(Collection<? extends E> c); // 创建一个包含指定容量的 CopyOnWriteArrayList CopyOnWriteArrayList<E> list3 = new CopyOnWriteArrayList<>(Object[] array); |
3.常见操作和方法
add(E e):将元素添加到末尾;
remove(Object o):删除指定的元素;
get(int index):获取指定索引位置的元素;
set(int index, E element):替换指定位置的元素,实际上是通过复制数组来实现的,性能开销较大;
size():返回元素个数;
contains(Object o):是否包含指定元素;
clear():清空所有元素,实际上是通过创建一个新的空数组实现的;
iterator():返回一个迭代器,该迭代器支持并发读取;
forEach():遍历集合。
3.优缺点
优点:CopyOnWriteArrayList 提供了高效的并发读操作,适用于读多写少的场景,能保证线程安全。
缺点:由于写操作的开销较大,因此不适用于写操作频繁的场景。
十一、CopyOnWriteArraySet
是一个线程安全的集合类,基于 CopyOnWriteArrayList 实现,用于提供高效的读取操作和线程安全的写入操作。
与 HashSet 和 TreeSet 等传统集合不同,它采用 Copy-On-Write(写时复制)策略,意味着每次对集合进行修改(如添加或删除元素)时,都会复制底层的数组,并将修改应用到新数组中,而不是直接修改原数组。这使得 CopyOnWriteArraySet 特别适合于读多写少的场景。
1.概述
底层数据结构:基于CopyOnWriteArrayList,动态数组。实现了 Set 接口。
主要特点:无序、不可重复,高效的读操作,写操作代价较高
时间复杂度:读O(1)或O(n),写O(n)。
线程安全性:线程安全。
应用场景:读多写少的应用、需要线程安全的应用、高并发环境。
2.常用操作
添加元素 (add(E e));
删除元素 (remove(Object o));
检查元素是否存在 (contains(Object o));
获取集合大小 (size());
清空集合 (clear());
迭代器 (iterator())。
十二、Collections
是 Java 提供的一个工具类,位于 java.util 包中,包含了多个静态方法,旨在对集合框架中的集合对象进行操作和增强功能。它提供了对集合的排序、查找、同步化、反转、填充等操作的支持,简化了集合类的使用和操作。
1.排序
升序排序:
sort(List<T> list)
| List<Integer> list = Arrays.asList(5, 2, 8, 1, 4); Collections.sort(list); // [1, 2, 4, 5, 8] |
根据指定的比较器 Comparator 对列表进行排序:
sort(List<T> list, Comparator<? super T> c)
| List<String> list = Arrays.asList("banana", "apple", "cherry"); Collections.sort(list, Comparator.reverseOrder()); // ["cherry", "banana", "apple"] |
2.查找最大值和最小值
(1)返回集合中的最大/小元素,依据元素的自然顺序:
max(Collection<? extends T> coll)
min(Collection<? extends T> coll)
| List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); Integer max = Collections.max(list); // 5 Integer min = Collections.min(list); // 1 |
(2)根据给定的比较器返回集合中的最大/小元素:
max(Collection<? extends T> coll, Comparator<? super T> comp)
min(Collection<? extends T> coll, Comparator<? super T> comp)
| List<String> list = Arrays.asList("apple", "banana", "cherry"); String max = Collections.max(list, Comparator.reverseOrder()); // "cherry" String min = Collections.min(list, Comparator.reverseOrder()); // "apple" |
3.反转和旋转
反转列表中元素的顺序:
reverse(List<?> list)
| List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); Collections.reverse(list); // [5, 4, 3, 2, 1] |
将列表中的元素按指定距离旋转。正数表示向右旋转,负数表示向左旋转:
rotate(List<?> list, int distance)
| List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); Collections.rotate(list, 2); // [4, 5, 1, 2, 3] |
4.填充和替换
用指定的对象填充整个列表中的元素:
fill(List<? super T> list, T obj)
| List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c")); Collections.fill(list, "x"); // ["x", "x", "x"] |
替换列表中所有等于 oldVal 的元素为 newVal:
replaceAll(List<T> list, T oldVal, T newVal)
| List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "apple")); Collections.replaceAll(list, "apple", "orange"); // ["orange", "banana", "orange"] |
5.线程安全集合
返回一个线程安全的列表,所有的操作都会通过同步来确保线程安全:
synchronizedList(List<T> list)
| List<Integer> list = new ArrayList<>(); List<Integer> synchronizedList = Collections.synchronizedList(list); |
返回一个线程安全的集合,所有操作都会通过同步来确保线程安全:
synchronizedSet(Set<T> s)
| Set<Integer> set = new HashSet<>(); Set<Integer> synchronizedSet = Collections.synchronizedSet(set); |
返回一个线程安全的映射,所有操作都会通过同步来确保线程安全:
synchronizedMap(Map<K, V> m)
| Map<String, Integer> map = new HashMap<>(); Map<String, Integer> synchronizedMap = Collections.synchronizedMap(map); |
6.空集合和常量集合
(1)返回一个空列表。返回的列表是不可修改的:
emptyList() 、emptySet()
| List<String> emptyList = Collections.emptyList(); // [] Set<String> emptySet = Collections.emptySet(); // [] |
(2)返回一个空映射。返回的映射是不可修改的:
emptyMap()
| Map<String, String> emptyMap = Collections.emptyMap(); // {} |
(3)返回一个只包含指定元素的不可修改的列表:
singletonList(T o)、singleton(T o)
| List<String> singletonList = Collections.singletonList("apple"); // ["apple"] Set<String> singletonSet = Collections.singleton("apple"); // ["apple"] |
(4)返回一个只包含一个映射的不可修改的映射:
singletonMap(K key, V value)
| Map<String, String> singletonMap = Collections.singletonMap("key", "value"); // {"key"="value"} |
7. 其他常用方法
(1)shuffle(List<?> list)
随机打乱列表中的元素。
| List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); Collections.shuffle(list); // 列表顺序会随机改变 |
(2)unmodifiableList(List<? extends T> list)
返回一个不可修改的列表,修改会抛出 UnsupportedOperationException。
| List<String> list = Arrays.asList("apple", "banana", "cherry"); List<String> unmodifiableList = Collections.unmodifiableList(list); |
(3)unmodifiableSet(Set<? extends T> s)
返回一个不可修改的集合,修改会抛出 UnsupportedOperationException。
| Set<String> set = new HashSet<>(Arrays.asList("apple", "banana")); Set<String> unmodifiableSet = Collections.unmodifiableSet(set); |
(4)unmodifiableMap(Map<? extends K, ? extends V> m)
返回一个不可修改的映射,修改会抛出 UnsupportedOperationException。
| Map<String, String> map = new HashMap<>(); map.put("key1", "value1"); Map<String, String> unmodifiableMap = Collections.unmodifiableMap(map); |
十三、其他API工具
1.Guava
提供了丰富的集合框架、缓存、字符串处理、并发工具等功能。
(1)增强的集合类型
ImmutableList / ImmutableSet / ImmutableMap: 不可变集合,线程安全且不易被修改。
Multiset: 允许重复元素的集合,可以统计元素的出现次数。
Multimap: 键到多个值的映射,支持一个键对应多个值。
BiMap: 双向映射,键和值都是唯一的。
(2)缓存
Cache: 提供高效的缓存实现,支持过期策略和容量限制。
(3)字符串处理
Joiner: 简化字符串拼接的操作。
Splitter: 方便地将字符串分割成集合。
(4)并发工具
ListenableFuture: 扩展了 Future 的功能,支持回调机制。
RateLimiter: 控制方法调用频率。
(5)其他实用工具
Optional: 提供对可能为 null 的值的优雅处理,减少 null 引用带来的问题。
Preconditions: 提供参数检查工具,确保方法参数的有效性。
2.Apache Commons Collections
(1)主要特性
额外的集合类型:
Bag: 允许重复元素的集合,并支持计数功能。
MultiValuedMap: 每个键可以对应多个值的映射。
TreeSortedSet: 有序集合,基于红黑树实现。
(2)装饰器模式
通过装饰器模式增强已有集合的功能,比如创建只读集合、同步集合等。
示例:SynchronizedCollection 可以为集合提供线程安全的访问。
(3)过滤器和转换器
提供多种过滤器和转换器,可以对集合进行操作,比如只保留特定条件的元素或转换元素类型。
(4)集合工具
提供各种静态方法用于操作集合,如合并、差集、交集等。
示例:CollectionUtils 类提供了很多便利的方法。
(5)快速查找和排序
提供高效的查找和排序算法,特别是对于大量数据的处理。
相关文章:
(八)Java-Collection
一、Collection接口 1.特点 Collection实现子类可以存放多个元素,每个元素可以是Object; 有些Collection的实现类,可以存放重复的元素,有些不可以; 有些Collection的实现类,有些是有序的(Li…...
小程序高度问题背景scss
不同的机型,他的比例啥的都会不一样,同样的rpx也会有不同的效果。所以这里选择了取消高度。 <view class"box-border" :style"{padding-top: ${navHeight}px,}"><!-- 已登录 --><view v-if"userStore.userInfo&…...
HTML 日常开发常用标签
文章目录 HTML 日常开发常用标签1、基本结构标签2、内容标签3、多媒体标签4、表单标签5、列表和定义标签6、表格标签7、链接和图像8、元数据9、语义化标签(HTML5新增)10、框架和内联11、交互12、过时或不推荐使用的标签 HTML 日常开发常用标签 1、基本结…...
vue3表单验证的时候访问接口如果有值就通过否则不通过.主动去触发校验
页面有个身份证号码的校验。校验完身份证格式是否符合之后还要去访问接口查询这个用户是否存在。如果存在才通过验证。否则就校验不通过 <el-form ref"ruleFormRef" :model"form" label-width"140px" label-position"right" label…...
Cuppa CMS v1.0 任意文件读取(CVE-2022-25401)
漏洞简介: Cuppa CMS v1.0 administrator/templates/default/html/windows/right.php文件存在任意文件读取漏洞 漏洞环境: 春秋云镜中的漏洞靶标,CVE编号为CVE-2022-25401 漏洞复现 弱口令行不通 直接访问administrator/templates/defau…...
C# Dictionary 使用指南
C# Dictionary 使用指南 1. 简介 Dictionary<TKey, TValue> 是 C# 中一个非常常用的泛型集合类,用于存储键值对(Key-Value Pair)。它可以根据键快速查找对应的值,因此在需要快速查找和检索数据的场景下非常高效。 2. 基本…...
基于Spark的电商供应链系统的设计与实现
目录 1.研究背景与意义 2、国内外研究现状 3、相关理论与技术 (一)分布式计算系统Spark (二)数据仓库Hive (三)读取服务器本地磁盘的日志数据Flume (四)分布式消息队列Kafka …...
MYSQL数据备份与恢复(mysqldump)
MySQL备份之mysqldump 表级别备份还原 格式:mysqldump [OPTIONS] database [tables] 实例:把db_user数据库中的tb_student数据表进行备份 备份:#mysqldump db_user tb_student > /tmp/sqlbak/tb_student.sql -p 还原:#mysql 数…...
从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(二)
1.安装mogondb数据库 参考MongoDB安装配置教程(详细版)_mongodb安装详细步骤-CSDN博客 安装mondbcompass数据库连接工具 参考https://www.mongodb.com/zh-cn/docs/compass/current/connect/ 2.后端服务 1.创建src文件夹 并在src文件夹下创建 index…...
server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)
从你提供的配置文件(应该是 Spring Boot 的 application.yml 或 application.properties 文件)来看,以下部分与会话超时时间相关: server:servlet:session:timeout: 12h # timeout: 30cookie:name: VENDER_SID会话超时时间的…...
MySQL--聚集索引、辅助索引、回表查询和覆盖索引的原理
在MySQL中,索引是提高查询性能的核心工具。理解聚集索引、辅助索引、回表查询和覆盖索引的原理,对于优化数据性能至关重要。以下是对这些概念的详细解释以及优化方法。 一、聚集索引(Clustered Index) 聚集索引决定了表中数据的…...
使用vscode导出Markdown的PDF无法显示数学公式的问题
我的硬件环境是M2的MacBook air,在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件,数学公式都是显示的源代码。 我看了许多教程,给的是这个方法:在md文件对应的html文件中加上以下代码:…...
从“记住我”到 Web 认证:Cookie、JWT 和 Session 的故事
文章目录 1. 初识 HTTP:一场没有记忆的对话2. Cookie:网站的“记忆” 🍪3. Session:服务端的“记忆” 🎯4. JWT:让用户自己带着“身份证” 🔑5. Cookie vs Session vs JWT 总结 📊6.…...
Idea编译项目很久之后,提示 Error:java:OutOfMemoryError:insufficient memory
项目挺老的的了,平常项目启动,也要挺久的,但是最起码能启动成功,今天下午的时候,项目启动了十几分,一直在转圈,后面控制台输出了这一行异常 Error:java:OutOfMemoryError:insufficient memory …...
wordpress使用CorePress主题设置项总结
宝塔面板设置 软件商店中安装的软件有:(宝塔网站加速3.1)(Nginx 1.18.0)(MySql 5.6.50)(PHP-5.6)(phpMyAdmin 4.4)(Python项目管理器 …...
HTTP非流式请求 vs HTTP流式请求
文章目录 HTTP 非流式请求 vs 流式请求一、核心区别 服务端代码示例(Node.js/Express)非流式请求处理流式请求处理 客户端请求示例非流式请求(浏览器fetch)流式请求处理(浏览器fetch) Python客户端示例&…...
LSTM长短期记忆网络-原理分析
1 简介 概念 LSTM(Long Short-Term Memory)也称为长短期记忆网络,是一种改进的循环神经网络(RNN),专门设计用于解决传统RNN的梯度消失问题和长程依赖问题。LSTM通过引入门机制和细胞状态,能够更…...
IP------PPP协议
这只是IP的其中一块内容PPP,IP还有更多内容可以查看IP专栏,前一章内容为网络类型,可通过以下路径查看IP---网络类型-CSDN博客,欢迎指正 3.PPP协议 1.PPP优点 网络类型:p2p PPP---点到点协议 兼容性会更强凡是接口或…...
Java 实现快速排序算法:一条快速通道,分而治之
大家好,今天我们来聊聊快速排序(QuickSort)算法,这个经典的排序算法被广泛应用于各种需要高效排序的场景。作为一种分治法(Divide and Conquer)算法,快速排序的效率在平均情况下非常高ÿ…...
JWT+redis实现令牌刷新优化方案
令牌刷新优化方案的详细实现步骤: 1. 令牌服务层改造 1.1 JWT工具类增强 // JwtUtils.java 新增方法 public class JwtUtils {// 生成带动态过期时间的令牌public static String createToken(String subject, String userId, String username, long expirationMi…...
基于 C++ Qt 的 Fluent Design 组件库 QFluentWidgets
简介 QFluentWidgets 是一个基于 Qt 的 Fluent Designer 组件库,内置超过 150 个开箱即用的 Fluent Designer 组件,支持亮暗主题无缝切换和自定义主题色。 编译示例 以 Qt5 为例(Qt6 也支持),将 libQFluentWidgets.d…...
ClkLog里程碑:荣获2024上海开源技术应用创新竞赛三等奖
2024年10月,ClkLog团队参加了由上海计算机软件技术开发中心、上海开源信息技术协会联合承办的2024上海数智融合“智慧工匠”选树、“领军先锋”评选活动——开源技术应用创新竞赛。我们不仅成功晋级决赛,还荣获了三等奖!这一成就不仅是对ClkL…...
边缘计算收益低的三大指标
边缘计算收益低的三大指标主要包括以下方面: 1. 资源贡献不足: 边缘计算的收益通常基于所提供的带宽、存储和计算资源来计算。如果设备的网络带宽有限、在线时间短或提供的存储容量较小,可能无法满足平台设定的最低贡献标准,从而导…...
C# 确保程序只有一个实例运行
常规需求 C#程序只能运行一次,不能多开: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Threading; using System.Runtime.InteropServices; using System.Security.Principal; namespace BallLocation {sta…...
有没有什么免费的AI工具可以帮忙做简单的ppt?
互联网各领域资料分享专区(不定期更新): Sheet 正文 1. 博思AIPPT 特点:专为中文用户设计,支持文本/文件导入生成PPT,内置海量模板和智能排版功能,涵盖商务、教育等多种场景。可一键优化布局、配色,并集成AI绘图功能(文生图/图生图)。适用场景:职场汇报、教育培训、商…...
TCP基本入门-简单认识一下什么是TCP
部分内容来源:小林Coding TCP的特点 1.面向连接 一定是“一对一”才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的 2.可靠的 无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个…...
ollama提问命令行程序demo(python)
import requests import json# 定义请求的 URL 和数据 url http://localhost:11434/api/generate data {"model": "deepseek-r1:1.5b","prompt": "写一首关于春天的诗" }# 发送 POST 请求并以流式方式接收响应 response requests.p…...
校园快递助手小程序毕业系统设计
系统功能介绍 管理员端 1)登录:输入账号密码进行登录 2)用户管理:查看编辑添加删除 学生信息 3)寄件包裹管理:查看所有的包裹信息,及物流信息 4)待取件信息:查看已到达的…...
基于MATLAB红外弱小目标检测MPCM算法复现
摘要:本文详细介绍了一种基于人类视觉系统特性的红外弱小目标检测算法——Multiscale patch-based contrast measure (MPCM)。该算法通过增强目标与背景的对比度,有效检测红外图像中的弱小目标,并在MATLAB环境中进行了复现与实验验证。 关键…...
MySQL 的存储引擎有哪些?它们之间有什么区别?
MySQL 支持多种存储引擎,每种存储引擎都有其独特的特性和适用场景。以下是 MySQL 中常见的存储引擎及其主要区别: 1.常见存储引擎及其特点 (1)InnoDB • 事务支持:支持完整的 ACID 特性,适用于需要事务处理的场景。 • 锁机制&…...
