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

Java 集合框架面经

1、说说有哪些常见的集合框架?

在这里插入图片描述
集合框架可以分为两条大的支线:

  1. Map 接口:表示键值对的集合,一个键映射到一个值。键不能重复,每个键只能对应一个值。Map 接口的实现类包括 HashMap、LinkedHashMap、TreeMap 等。
  2. Collection 接口:最基本的集合框架表示方式,提供了添加、删除、清空等基本操作,它主要有三个子接口:
  • List 代表有序、可重复的集合,典型代表就是封装了动态数组的 ArrayList 和封装了链表的 LinkedList。
  • Set 代表无序、不可重复的集合,典型代表就是 HashSet 和 TreeSet。
  • Queue 代表队列,典型代表就是双端队列 ArrayDeque,以及优先级队列 PriorityQueue。

1.1 集合框架有哪几个常用工具类?

集合框架位于 java.util 包下,提供了两个常用的工具类:

  1. Collections:提供了一些对集合进行排序、二分查找、同步的静态方法。
  2. Arrays:提供了一些对数组进行排序、打印、和 List 进行转换的静态方法。

1.2 简单介绍一下队列?

Java 中的队列主要通过 Queue 接口和并发包下的 BlockingQueue 两个接口来实现。
优先级队列 PriorityQueue 实现了 Queue 接口,是一个无界队列,它的元素按照自然顺序排序或者 Comparator 比较器进行排序。双端队列 ArrayDeque 也实现了 Queue 接口,是一个基于数组的,可以在两端插入和删除元素的队列。

1.3 用过哪些集合类,它们的优劣?

我常用的集合类有 ArrayList、LinkedList、HashMap、LinkedHashMap。

ArrayList 可以看作是一个动态数组,可以在需要时动态扩容数组的容量,只不过需要复制元素到新的数组。优点是访问速度快,可以通过索引直接查找到元素。缺点是插入和删除元素可能需要移动或者复制元素。

LinkedList 是一个双向链表,适合频繁的插入和删除操作。优点是插入和删除元素的时候只需要改变节点的前后指针,缺点是访问元素时需要遍历链表。

HashMap 是一个基于哈希表的键值对集合。优点是可以根据键的哈希值快速查找到值,但有可能会发生哈希冲突,并且不保留键值对的插入顺序。

LinkedHashMap 在 HashMap 的基础上增加了一个双向链表来保持键值对的插入顺序。

1.4 队列和栈的区别了解吗?

队列是一种先进先出的数据结构,第一个加入队列的元素会成为第一个被移除的元素。栈是一种后进先出的数据结构,最后一个加入栈的元素会成为第一个被移除的元素。

1.5 哪些是线程安全的容器?

Vector、Hashtable、ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue、ArrayBlockingQueue、LinkedBlockingQueue 都是线程安全的。

1.6 Collection 继承了哪些接口?

Collection 继承了 Iterable 接口,这意味着所有实现 Collection 接口的类都必须实现 iterator() 方法,之后就可以使用增强型 for 循环遍历集合中的元素了。

2、ArrayList 和 LinkedList 有什么区别?

ArrayList 是基于数组实现的,LinkedList 是基于链表实现的。
在这里插入图片描述

2.1 ArrayList 和 LinkedList 的用途有什么不同?

多数情况下,ArrayList 更利于改查,LinkedList 更利于增删。

2.2 ArrayList 和 LinkedList 是否支持随机访问?

  1. ArrayList 是基于数组的,也实现了 RandomAccess 接口,所以它支持随机访问,可以通过下标直接获取元素。
  2. LinkedList 是基于链表的,所以它没法根据下标直接获取元素,不支持随机访问。

2.3 ArrayList 和 LinkedList 内存占用有何不同?

  1. ArrayList 是基于数组的,是一块连续的内存空间,所以它的内存占用是比较紧凑的;但如果涉及到扩容,就会重新分配内存,空间是原来的 1.5 倍。
  2. LinkedList 是基于链表的,每个节点都有一个指向下一个节点和上一个节点的引用,于是每个节点占用的内存空间比 ArrayList 稍微大一点。

2.4 ArrayList 和 LinkedList 的使用场景有什么不同?

ArrayList 适用的场景:

  1. 随机访问频繁:需要频繁通过索引访问元素的场景。
  2. 读取操作远多于写入操作:如存储不经常改变的列表。
  3. 末尾添加元素:需要频繁在列表末尾添加元素的场景。

LinkedList 适用的场景:

  1. 不需要快速随机访问:顺序访问多于随机访问的场景。
  2. 频繁插入和删除:在列表中间频繁插入和删除元素的场景。
  3. 队列和栈:由于其双向链表的特性,LinkedList 可以实现队列(FIFO)和栈(LIFO)。

2.5 链表和数组有什么区别?

  1. 数组在内存中占用的是一块连续的存储空间,因此我们可以通过数组下标快速访问任意元素。数组在创建时必须指定大小,一旦分配内存,数组的大小就固定了。
  2. 链表的元素存储在于内存中的任意位置,每个节点通过指针指向下一个节点。
    在这里插入图片描述

3、ArrayList 的扩容机制了解吗?

当往 ArrayList 中添加元素时,会先检查是否需要扩容,如果当前容量 + 1 超过数组长度,就会进行扩容。扩容后的新数组长度是原来的 1.5 倍,然后再把原数组的值拷贝到新数组中。
在这里插入图片描述

4、ArrayList 怎么序列化的知道吗?

ArrayList 自定义了序列化逻辑从而只序列化有效数据,因为数组的容量一般大于实际的元素数量。

4.1 为什么 ArrayList 不直接序列化元素数组呢?

出于效率的考虑,数组可能长度 100,但实际只用了 50,剩下的 50 没用到,也就不需要序列化。

5、快速失败 fail-fast 了解吗?

在用迭代器遍历集合对象时,如果线程 A 遍历过程中,线程 B 对集合对象的内容进行了修改,就会抛出 Concurrent Modification Exception。迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用 hashNext()/next()遍历下一个元素之前,都会检测 modCount 变量是否为 expectedmodCount 值,是的话就返回遍历;否则抛出异常,终止遍历。

java.util 包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改),比如 ArrayList 类。

5.1 什么是安全失败?

采用安全失败机制的集合容器,在遍历时并不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

场景:java.util.concurrent 包下的容器都是安全失败,可以在多线程下并发使用,并发修改,比如 CopyOnWriteArrayList 类

6、有哪几种实现 ArrayList 线程安全的方法?

  1. 可以使用 Collections.synchronizedList() 方法,它可以返回一个线程安全的 List。内部是通过 synchronized 关键字加锁来实现的。
  2. 也可以直接使用 CopyOnWriteArrayList,它是线程安全的 ArrayList,遵循写时复制的原则,每当对列表进行修改时,都会创建一个新副本,这个新副本会替换旧的列表,而对旧列表的所有读取操作仍然在原有的列表上进行。

6.1 ArrayList 和 Vector 的区别?

Vector 属于 JDK 1.0 时期的遗留类,不推荐使用,仍然保留着是因为 Java 希望向后兼容。

ArrayList 是在 JDK 1.2 时引入的,用于替代 Vector 作为主要的非同步动态数组实现。因为 Vector 所有的方法都使用了 synchronized 关键字进行同步,所以单线程环境下效率较低。

7、CopyOnWriteArrayList 了解多少?

CopyOnWriteArrayList 就是线程安全版本的 ArrayList。采用了一种读写分离的并发策略。CopyOnWriteArrayList 容器允许并发读,读操作是无锁的。至于写操作,比如说向容器中添加一个元素,首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的引用指向新容器。
在这里插入图片描述

8、能说一下 HashMap 的底层数据结构吗?

JDK 8 中 HashMap 的数据结构是数组 + 链表 + 红黑树:
在这里插入图片描述
数组用来存储键值对,每个键值对可以通过索引直接拿到,索引是通过对键的哈希值进行进一步的 hash() 处理得到的。当多个键经过哈希处理后得到相同的索引时,需要通过链表来解决哈希冲突:将具有相同索引的键值对通过链表存储起来。不过,链表过长时,查询效率会比较低,于是当链表的长度超过 8 时(且数组的长度大于 64),链表就会转换为红黑树。红黑树的查询效率是 O(logn),比链表的 O(n) 要快。

hash() 方法的目标是尽量减少哈希冲突,保证元素能够均匀地分布在数组的每个位置上。如果键的哈希值已经在数组中存在,其对应的值将被新值覆盖。

HashMap 的初始容量是 16,随着元素的不断添加,HashMap 就需要进行扩容,阈值是capacity * loadFactor,capacity 为容量,loadFactor 为负载因子,默认为 0.75。扩容后的数组大小是原来的 2 倍,然后把原来的元素重新计算哈希值,放到新的数组中。

9、你对红黑树了解多少?

红黑树是一种自平衡的二叉查找树:

  1. 左根右;
  2. 根叶黑;
  3. 不红红;
  4. 黑路同;
    在这里插入图片描述

9.1 为什么不用二叉树?

二叉树是最基本的树结构,每个节点最多有两个子节点,但是二叉树容易出现极端情况,比如插入的数据是有序的,那么二叉树就会退化成链表,查询效率就会变成 O(n)。

9.2 为什么不用平衡二叉树?

平衡二叉树比红黑树的要求更高,每个节点的左右子树的高度最多相差 1,这种高度的平衡保证了极佳的查找效率,但在进行插入和删除操作时,可能需要频繁地进行旋转来维持树的平衡,维护成本更高。

9.3 为什么用红黑树?

链表的查找时间复杂度是 O(n),当链表长度较长时,查找性能会下降。红黑树是一种折中的方案,查找、插入、删除的时间复杂度都是 O(log n)。

9.4 红黑树插入删除规则?

​默认新节点为红色:
​插入逻辑:若插入后破坏红黑性质:
​情况1:父节点为黑色 → 无需调整。
​情况2:父节点为红色,递归调整。

删除逻辑:更复杂,需处理黑节点删除后的黑高减少问题。

10、红黑树怎么保持平衡的?

旋转和染色:

  1. 旋转:通过左旋和右旋来调整树的结构,避免某一侧过深。
  2. 染⾊:修复红黑规则,从而保证树的高度不会失衡。

11、HashMap 的 put 流程知道吗?

在这里插入图片描述

  1. 首先计算键的哈希值,通过 hashCode() 高位运算和扰动函数,减少哈希冲突。
  2. 进行第一次的数组扩容,确定桶的位置,根据哈希值按位计算数组索引。
  3. 处理键值对,若桶为空,直接插入新节点。若桶不为空,判断当前位置第一个节点是否与新节点的 key 相同,如果相同则更新 value,如果不同说明发生哈希冲突,如果是链表,将新节点添加到链表的尾部;如果链表长度大于等于 8,则将链表转换为红黑树。
  4. 检查容量并扩容,插入后若 size > threshold (capacity * loadFactor),则扩容为原容量的两倍。并且重新计算每个节点的索引,数据将会重新分布。

11.1 只重写元素的 equals 方法没重写 hashCode,put 的时候会发生什么?

如果只重写 equals 方法,没有重写 hashCode 方法,那么会导致 equals 相等的两个对象,hashCode 不相等,这样的话,两个对象会被 put 到数组中不同的位置,size + 1,导致大量哈希冲突,退化成链表,查询效率降为 O(n)。

12、HashMap 怎么查找元素的呢?

通过哈希值定位索引 → 定位桶 → 检查第一个节点 → 遍历链表或红黑树查找 → 返回结果。
在这里插入图片描述

13、HashMap 的 hash 函数是怎么设计的?

先拿到 key 的哈希值,是一个 32 位的 int 类型数值,然后再让哈希值的高 16 位和低 16 位进行异或操作,这样能保证哈希分布均匀,减少哈希冲突。

14、为什么 hash 函数,能减少哈希冲突?

哈希函数通过异或操作将哈希值的高位引入低位,可以增加哈希值的随机性,从而减少哈希冲突。将哈希值无符号右移 16 位,意味着原哈希值的高 16 位被移到了低 16 位的位置。这样,原哈希值的高 16 位和低 16 位就可以参与到最终用于索引计算的低位中。选择 16 位是因为它是 32 位整数的一半,这样处理既考虑了高位的信息,又没有完全忽视低位的信息,从而达到了一种微妙的平衡状态。

15、为什么 HashMap 的容量是 2 的幂次方?

是为了快速定位元素在底层数组中的下标。HashMap 是通过 hash & (n - 1) 来定位元素下标的,n 为数组的大小,也就是 HashMap 底层数组的容量。数组长度 - 1 正好相当于一个低位掩码。掩码的低位最好全是 1,这样 & 运算才有意义,否则最后一位结果一定是 0。 2 的幂次方刚好是偶数,偶数 - 1 是奇数,奇数的二进制最后一位是 1,也就保证了 hash & (n - 1) 的最后一位可能为 0,也可能为 1(取决于 hash 的值),这样可以保证哈希值的均匀分布。

15.1 对数组长度取模定位数组下标,这块有没有优化策略?

HashMap 的策略是将取模运算优化为位运算 hash & (n - 1)。因为当数组的长度是 2 的 N 次幂时,hash & (n - 1) = hash % n。位运算的速度要远高于取余运算,因为计算机本质上是二进制的。

15.2 说说什么是取模运算?

在 Java 中,通常使用 % 运算符来表示取余,用 Math.floorMod() 来表示取模。当操作数都是正数的话,取模运算和取余运算的结果是一样的;只有操作数出现负数的情况下,结果才会不同。当数组的长度是 2 的 n 次幂时,取模运算/取余运算可以用位运算来代替,效率更高,因为计算机本质上二进制的。

16、如果初始化 HashMap,传一个 17 的容量,它会怎么处理?

HashMap 会将容量调整到大于等于 17 的最小的 2 的幂次方,也就是 32。这是因为哈希表的大小最好是 2 的 N 次幂,这样可以通过 hash & (n - 1) 高效计算出索引值。

17、你还知道哪些哈希函数的构造方法呢?

  1. 除留取余法:取 key 除以一个不大于哈希表长度的正整数 p,所得余数为地址。
  2. 直接定址法:取 key 映射到对应的数组位置,例如 12345 放到索引为 12345 的位置。
  3. 数字分析法:取 key 的某些数字作为映射的位置。
  4. 平方取中法:取 key 平方的中间几位作为映射的位置。
  5. 折叠相加法:取 key 分割成位数相同的几段,然后把它们的叠加和作为映射的位置。
    ![](https://i-blog.csdnimg.cn/direct/4de06137c7a742e09b5601c2fe5404e3.png)

18、解决哈希冲突有哪些方法?

  1. 链地址法:当发生哈希冲突的时候,使用链表将冲突的元素串起来。
  2. 再哈希法:当发生哈希冲突的时候,使用另外一种哈希算法,直到找到空槽。
  3. 开放寻址法:遇到哈希冲突的时候,就去寻找下一个空的槽:
  • 线性探测:从冲突的位置开始,依次往后找,直到找到空槽。
  • 二次探测:从冲突的位置开始,第一次增加 2 个位置,第二次增加 4,第三次增加 9 个,直到找到空槽。

19、为什么 HashMap 链表转红黑树的阈值为 8 呢?

树化发生在 table 数组的长度大于 64,且链表的长度大于 8 的时候。阈值选择 8 跟统计学有关,源码注释给出的回答是:理想情况下,使用随机哈希码,链表里的节点符合泊松分布,出现节点个数的概率是递减的,节点个数为 8 的情况,发生概率仅为小数点后八位。至于红黑树转回链表的阈值为什么是 6,而不是 8?是因为如果这个阈值也设置成 8,假如发生碰撞,节点增减刚好在 8 附近,会发生链表和红黑树的不断转换,导致资源浪费。

20、HashMap扩容发生在什么时候呢?

当键值对数量超过阈值,也就是容量(默认:16) * 负载因子(默认:0.75)时。

20.1 为什么使用 1 << 4 而不是直接写 16?

首先是为了强调这个值是 2 的幂次方,而不是一个完全随机的选择。然后是为了通过位运算符快速计算索引。

20.2 为什么选择 0.75 作为 HashMap 的默认负载因子呢?

这是一个经验值。如果设置得太低,如 0.5,会浪费空间;如果设置得太高,如 0.9,会增加哈希冲突。0.75 是 JDK 作者经过大量验证后得出的最优解,能够最大限度减少 rehash 的次数。

21、HashMap的扩容机制了解吗?

扩容时,HashMap 会创建一个新数组,其容量是原来的两倍。然后遍历旧哈希表中的元素,将其重新分配到新的哈希表中。如果当前桶中只有一个元素,那么直接通过键的哈希值与新数组的大小取模锁定新的索引位置。如果当前桶是红黑树,那么会调用 split() 方法分裂树节点,以保证树的平衡。如果当前桶是链表,会通过旧键的哈希值与旧的数组大小取余 == 0 来判断,如果条件为真,元素保留在原索引的位置;否则元素移动到原索引 + 旧数组大小的位置。

21.1 JDK 7 扩容的时候有什么问题?

JDK 7 在扩容的时候使用头插法来重新插入链表节点,这样会导致链表无法保持原有的顺序。

21.2 JDK 8 是怎么解决这个问题的?

JDK 8 改用了尾插法,并且当 (e.hash & oldCap) == 0 时,元素保留在原索引的位置;否则元素移动到原索引 + 旧数组大小的位置。这样可以避免重新计算所有元素的哈希值,只需检查高位的某一位,就可以快速确定新位置。

22、JDK 8 对 HashMap 做了哪些优化呢?

  1. 底层数据结构由数组 + 链表改成了数组 + 链表或红黑树的结构。
  2. 链表的插入方式由头插法改为了尾插法。头插法在扩容后容易改变原来链表的顺序。
  3. 扩容的时机由插入时判断改为插入后判断,这样可以避免在每次插入时都进行不必要的扩容检查,因为有可能插入后仍然不需要扩容。
  4. 哈希扰动算法也进行了优化。JDK 7 是通过多次移位和异或运算来实现的。JDK 8 让 hash 值的高 16 位和低 16 位进行了异或运算,让高位的信息也能参与到低位的计算中,这样可以极大程度上减少哈希碰撞。

23、你能自己设计实现一个 HashMap 吗?

可以,我先说一下整体的设计思路:

  1. 第一步,实现一个 hash 函数,对键的 hashCode 进行扰动。
  2. 第二步,实现一个链地址法的方法来解决哈希冲突。
  3. 第三步,扩容后,重新计算哈希值,将元素放到新的数组中。

24、HashMap 是线程安全的吗?

HashMap 不是线程安全的,主要有以下几个问题:

  1. 多线程下扩容会死循环。JDK7 中的 HashMap 使用的是头插法来处理链表,在多线程环境下扩容会出现环形链表,造成死循环。不过,JDK 8 时通过尾插法修复了这个问题,扩容时会保持链表原来的顺序。
  2. 多线程在进行 put 元素的时候,可能会导致元素丢失。因为计算出来的位置可能会被其他线程覆盖掉。
  3. 多线程在进行 get 元素的时候,可能导致 get 为 null。因为其他线程可能先执行 put ,导致容量超出阈值从而扩容。

25、怎么解决 HashMap 线程不安全的问题呢?

  1. 可以用 Hashtable 来保证线程安全。Hashtable 在方法上加了 synchronized 关键字。
  2. 可以通过 Collections.synchronizedMap 方法返回一个线程安全的 Map,内部是通过 synchronized 对象锁来保证线程安全的,比在方法上直接加 synchronized 关键字更轻量级。
  3. 可以使用并发工具包下的 ConcurrentHashMap,使用了CAS + synchronized 关键字来保证线程安全。

26、HashMap 内部节点是有序的吗?

无序的,根据 hash 值随机插入。

27、讲讲 LinkedHashMap 怎么实现有序的?

LinkedHashMap 在 HashMap 的基础上维护了一个双向链表,通过 before 和 after 标识前置节点和后置节点。实现了顺序读写。

28、讲讲 TreeMap 怎么实现有序的?

TreeMap 通过 key 的比较器来决定元素的顺序,如果没有指定比较器,那么 key 必须实现 Comparable 接口。TreeMap 的底层是红黑树,红黑树是一种自平衡的二叉查找树。插入或删除元素时通过旋转和染色来保持树的平衡。查找的时候从根节点开始,利用二叉查找树的特点,逐步向左子树或者右子树递归查找,直到找到目标元素。
在这里插入图片描述

29、TreeMap 和 HashMap 的区别?

  1. HashMap 是基于数组 + 链表 + 红黑树实现的,put 元素的时候会先计算 key 的哈希值,然后通过哈希值计算出元素在数组中的存放下标,然后将元素插入到指定的位置,如果发生哈希冲突,会使用链表来解决,如果链表长度大于 8,会转换为红黑树。
  2. TreeMap 是基于红黑树实现的,put 元素的时候会先判断根节点是否为空,如果为空,直接插入到根节点,如果不为空,会通过 key 的比较器来判断元素应该插入到左子树还是右子树。

在没有哈希冲突的情况下,HashMap 的查找效率是 O(1)。适用于查找操作比较频繁的场景。TreeMap 的查找效率是 O(logn)。并且保证了元素的顺序,因此适用于需要大范围查找或者有序遍历的场景。

30、讲讲 HashSet 的底层实现?

HashSet 的底层实际是一个 HashMap 实例,其中 key 是用户添加的元素(如 String、Integer)。value 是一个固定的静态 Object 类型 PRESENT 对象。HashSet 主要用于去重,HashMap 的 put() 方法会覆盖旧值,但 HashSet 的 add() 方法会返回 false,且集合内容不变。
在这里插入图片描述

30.1 HashSet 和 ArrayList 的区别?

  1. ArrayList 是基于动态数组实现的,HashSet 是基于 HashMap 实现的。
  2. ArrayList 可以有多个相同的元素;HashSet 不允许重复元素,通过 hashCode() 和 equals() 联合判定重复。
  3. ArrayList 保持元素的插入顺序,可以通过索引访问元素;HashSet 不保证元素的顺序,元素的存储顺序依赖于哈希算法,并且可能随着元素的增删而改变。

30.2 HashSet 怎么判断元素重复,重复了是否 put ?

判断重复:通过 hashCode() 和 equals() 联合判定。
​重复处理:不覆盖,直接忽略,返回 false。若需要更新元素,需先删除旧元素再添加新元素。

相关文章:

Java 集合框架面经

1、说说有哪些常见的集合框架&#xff1f; 集合框架可以分为两条大的支线&#xff1a; Map 接口&#xff1a;表示键值对的集合&#xff0c;一个键映射到一个值。键不能重复&#xff0c;每个键只能对应一个值。Map 接口的实现类包括 HashMap、LinkedHashMap、TreeMap 等。Colle…...

【已解决】Git:为什么 .gitignore 不生效?如何停止跟踪已提交文件并阻止推送?

你可能遇到的问题 你已经提交了某个文件夹&#xff08;如 dataset&#xff09;到 Git 仓库&#xff0c;之后修改了它&#xff0c;但发现修改内容被 Git 持续跟踪&#xff0c;无法通过 .gitignore 忽略。尝试在 .gitignore 中添加规则后&#xff0c;修改的文件仍然显示为"…...

MOSN(Modular Open Smart Network)-04-TLS 安全链路

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN&#xff08;Modular O…...

SICAR 标准 KUKA 机器人标准功能块说明手册

功能块名称:LSicar_Robot_KUKA_PrD 目录 1. 概述 2. 功能说明 2.1 程序控制 2.2 状态监控 2.3 报警与故障处理 2.4 驱动控制 3. 关键参数说明 4. 操作步骤指南 4.1 初始化配置 4.2 运行控制 4.3 状态监控 5. 常见故障处理 6. 注意事项 附录1:程序段索引 附录…...

QT三 自定义控件,自定义控件的事件处理自定义事件过滤,原始事件过滤

一 自定义控件 现在的需求是这样&#xff1a; 假设我们要在QWidget 上做定制&#xff0c;这个定制包括了关于 一些事件处理&#xff0c;意味着要重写QWidget的一些代码&#xff0c;这是不实际的&#xff0c;因此我们需要自己写一个MyWidget继承QWidget&#xff0c;然后再MyWi…...

Leetcode算法方法总结

1. 双指针法解决链表/数组题目 只要数组有序&#xff0c;就要想到双指针做法。还有二分法 回文串一般也会用到双指针&#xff0c;回文串的长度由于可能是奇数也可能是偶数&#xff0c;所以在寻找时&#xff0c;既需要寻找奇数长度的回文串&#xff0c;也需要寻找偶数长度的回文…...

【Elasticsearch基础】基本核心概念介绍

Elasticsearch作为当前最流行的分布式搜索和分析引擎&#xff0c;其强大的功能背后是一套精心设计的核心概念体系。本文将深入解析Elasticsearch的五大核心概念&#xff0c;帮助开发者构建坚实的技术基础&#xff0c;并为高效使用ES提供理论支撑。 1 索引&#xff08;Index&…...

docker远程debug

1. 修改 Java 启动命令 在 Docker 容器中启动 Java 程序时&#xff0c;需要添加 JVM 调试参数&#xff0c;jdk8以上版本 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your-app.jar jdk8及以下版本&#xff1a; java -Xdebug -Xrunjdwp:tra…...

华为eNSP-配置静态路由与静态路由备份

一、静态路由介绍 静态路由是指用户或网络管理员手工配置的路由信息。当网络拓扑结构或者链路状态发生改变时&#xff0c;需要网络管理人员手工修改静态路由信息。相比于动态路由协议&#xff0c;静态路由无需频繁地交换各自的路由表&#xff0c;配置简单&#xff0c;比较适合…...

CentOS 7下安装PostgreSQL 15

一、简介 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;是以加州大学计算机系开发的POSTGRES&#xff0c;4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业…...

时序数据库 InfluxDB(一)

时序数据库 InfluxDB&#xff08;一&#xff09; 数据库种类有很多&#xff0c;比如传统的关系型数据库 RDBMS&#xff08; 如 MySQL &#xff09;&#xff0c;NoSQL 数据库&#xff08; 如 MongoDB &#xff09;&#xff0c;Key-Value 类型&#xff08; 如 redis &#xff09…...

动态添加view方法-微信小程序

在微信小程序中&#xff0c;通过动态数据绑定和条件渲染来实现动态添加 view 组件的效果。 以下是一个简单的示例&#xff0c;展示如何根据数据动态添加 view。 WXML 文件 在 WXML 文件中&#xff0c;使用 wx:for 指令来遍历数组&#xff0c;并动态生成 view 组件。 <view…...

Java中清空集合列表元素有哪些方式

在 Java 里&#xff0c;存在多种清空列表的方式&#xff0c;下面为你汇总并附上对应的示例代码&#xff1a; import java.util.ArrayList; import java.util.List;public class ListClearDemo {public static void main(String[] args) {// 初始化一个列表List<String> …...

QOpenGLWidget动态加载功能实现教程(Qt+OpenGL)

QOpenGLWidget动态加载功能实现教程 我需要在Qt里面使用QOpenGLWidget显示OpenGL窗口&#xff0c;并且需要实现加载模型后重新渲染更新窗口的功能&#xff0c;但是一直无法更新被卡住了&#xff0c;现在把问题解决了总结一下整个实现过程。 创建一个自己的OpenGLWidget类 QOp…...

00.【Linux系统编程】 Linux初识(云服务器设置CentOS并使用、Xshell链接云服务器)

目录 一、华为云服务器免费体验申请 二、Xshell远程链接创建好的华为云服务器 2.1 下载Xshell 2.2 Xshell远程连接华为云服务器 一、华为云服务器免费体验申请 华为云官网 1. 进入华为云官网&#xff0c;最上面一栏点活动&#xff0c;并进入免费体验中心。 2. 找到含有“…...

数据结构-二叉链表存储的二叉树

树形结构是一类重要的非线性数据结构&#xff0c;其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树&#xff0c;称其为二叉树。二叉树的链式存储结构是一类重要的数据结构&#xff0c;其形式定义如下&#xff1a; 而二叉树的前序、中序遍历是非常重要的能够访…...

鸿蒙Flutter实战:20. Flutter集成高德地图,同层渲染

本文以同层渲染为例&#xff0c;介绍如何集成高德地图 完整代码见 Flutter 鸿蒙版 Demo 概述 Dart 侧 核心代码如下&#xff0c;通过 OhosView 来承载原生视图 OhosView(viewType: com.shaohushuo.app/customView,onPlatformViewCreated: _onPlatformViewCreated,creation…...

idea中快速注释函数

在IntelliJ IDEA中&#xff0c;有多种方法可以快速注释函数。 使用快捷键 你可以使用以下快捷键来快速注释函数[3]&#xff1a; 行注释&#xff1a;使用Ctrl/&#xff08;Windows系统&#xff09;或Command/&#xff08;Mac系统&#xff09;可以在当前行前添加或删除单行注释…...

Leetcode13-罗马数字转整数

题目链接&#xff1a;13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 如同上一题&#xff0c;直接用暴力法破解&#xff0c;简单好理解 int romanToInt(char* s) {int len strlen(s);int res 0;for(int i 0; i < len; i) {switch(s[i]) {case M:res 1000…...

3、pytest实现参数化

在 pytest 中&#xff0c;参数化&#xff08;parametrization&#xff09;是一种强大的功能&#xff0c;可以让你用不同的输入数据重复执行同一个测试函数。这种功能非常有用&#xff0c;可以帮助你显著减少重复代码并提高测试覆盖率。 参数化的主要作用是&#xff1a; 测试多…...

深入理解指针(4)(C语言版)

文章目录 前言一、回调函数是什么&#xff08;一&#xff09;定义&#xff08;二&#xff09;工作原理&#xff08;三&#xff09;应用场景 二、qsort举例&#xff08;一&#xff09;qsort函数简介&#xff08;二&#xff09;比较函数的定义&#xff08;三&#xff09;使用示例…...

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的日志管理:Logback 的集成

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…...

记录一次渗透测试/常用命令

渗透测试常用命令速览&#xff1a;从扫描到提权再到流量劫持 在渗透测试中&#xff0c;命令行工具是我们的得力助手。本文总结了我最近在测试虚拟机靶机&#xff08;IP: 192.168.73.129&#xff09;时用到的主要命令&#xff0c;涵盖网络扫描、暴力破解、权限提升、数据修改和…...

C++11QT复习(二)

文章目录 Day4-4 New 与 delete 表达式&#xff08;2025.03.20&#xff09;1. new 表达式的三个步骤2. delete 表达式的两个步骤3. new[] 与 delete[] Day5 类的定义和关键字再探&#xff08;2025.03.24&#xff09;1. C 关键字 const、static、extern2. 类的定义&#xff1a;C…...

Pytorch学习笔记(十)Learning PyTorch - Learning PyTorch with Examples

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 Learning PyTorch with Examples 部分。 官网链接&#xff1a;https://pytorch.org/tutorials/beginner/pytorch_with_examples.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m…...

如何使用DeepSeek编写测试用例?

一、DeepSeek在测试用例设计中的定位 DeepSeek作为AI工具,并非直接替代测试设计,而是通过以下方式提升效率: 快速生成基础用例框架(等价类、边界值等) 智能补充易遗漏场景(如特殊字符、异常流) 自动化脚本片段生成(Python/pytest/JUnit等) 测试数据构造建议(符合业务…...

sql server如何提高索引命中率

#新星杯14天创作挑战营第9期# 前言 近期发现以前开发的系统运行缓慢&#xff0c;经排查&#xff0c;发现有很大的优化空间。数据库版本使用的是sql server&#xff0c;主要有以下一些问题点&#xff1a;数据表无索引、一些不规范的写法&#xff08;例如in、大表关联&#xff0…...

FALL靶机

下载靶机&#xff0c;可以看到靶机地址 在kali上扫描靶机的端口和目录文件 访问&#xff1a;http://192.168.247.146/test.php&#xff0c;他提示我们参数缺失 我们爆破一下他的参数 使用kali自带的fuzz FUZZ就是插入参数的位置 -w 指定字典文件 wfuzz -u "http://192.…...

北斗导航 | 改进最小二乘残差法的接收机自主完好性监测算法原理,公式,应用,研究综述,matlab代码

改进最小二乘残差法的接收机自主完好性监测算法研究 摘要 本文针对传统最小二乘残差RAIM算法在复杂环境下检测性能不足的问题,提出了一种基于加权抗差估计的改进算法。通过引入IGGⅢ权函数构建抗差最小二乘模型,结合滑动窗口方差估计和自适应阈值调整机制,显著提升了算法对…...

WPF 浅述ToolTipService.ShowOnDisabled

WPF 浅述ToolTipService.ShowOnDisabled ToolTipService.ShowOnDisabled 属性可以让工具提示在控件禁用状态下仍然显示。这是一个非常方便且简洁的方式。 使用 ToolTipService.ShowOnDisabled&#xff0c;你可以通过设置 ToolTipService.ShowOnDisabled 属性来确保即使在控件禁…...

嵌入式硬件工程师从小白到入门-PCB绘制(二)

PCB绘制从小白到入门&#xff1a;知识点速通与面试指南 一、PCB设计核心流程 需求分析 明确电路功能&#xff08;如电源、信号处理、通信&#xff09;。确定关键参数&#xff08;电压、电流、频率、接口类型&#xff09;。 原理图设计 元器件选型&#xff1a;匹配封装、电压、…...

05 Python 元组:不可变序列的解析和应用

文章目录 前言元组定义元组的运算索引操作切片操作连接和重复运算循环遍历元组中的元素成员运算内置函数运算 打包和解包操作交换变量的值 前言 在 Python 编程领域&#xff0c;元组&#xff08;Tuple&#xff09;是一类极为重要的数据结构。它属于不可变的序列类型&#xff0…...

MATLAB 批量移动 TIF 文件至分类文件夹

文章目录 前言一、步骤二、代码 前言 本代码用于从指定的源文件夹 (sourceFolder) 中筛选所有 .tif 文件&#xff0c;并根据文件名的特定关键词&#xff08;Daynight 和 FDI&#xff09;将其分类移动到相应的目标文件夹 (targetDaynightFolder 和 targetFDIFolder)。 一、步骤…...

Milvus×最新版DeepSeek v3:对标Claude,本地数据五分钟写网站

前言 就在昨晚&#xff0c;DeepSeek v3推出了新版本V3-0324&#xff0c;再次一夜爆火。 虽然官方表示“这只是一次小升级”“API接口和使用方式不变”&#xff0c;但经过Zilliz的第一时间实测&#xff0c;我们发现无论是逻辑能力&#xff0c;还是编程能力&#xff0c;相较原本的…...

抽象代数:群论

系列笔记为本学期上抽象代数课整理的&#xff0c;持续更新。 群的相关定义 群的定义 群是一个带有满足结合律、单位元、逆元的二元运算的集合&#xff0c;记作 ( G , ⋅ ) \left({G, \cdot}\right) (G,⋅)。若群运算满足结合律&#xff0c;则该集合构成半群。如果该半群中含…...

基于 mxgraph 实现流程图

mxgraph 可以实现复杂的流程图绘制。mxGraph里的Graph指的是图论(Graph Theory)里的图而不是柱状图、饼图和甘特图等图(chart)&#xff0c;因此想找这些图的读者可以结束阅读了。 作为图论的图&#xff0c;它包含点和边&#xff0c;如下图所示。 交通图 横道图 架构图 mxGrap…...

Stereolabs ZED Box Mini:机器人与自动化领域的人工智能视觉新选择

在人工智能视觉技术快速发展的今天&#xff0c;其应用场景正在持续拓宽&#xff0c;从智能安防到工业自动化&#xff0c;从机器人技术到智能交通&#xff0c;各领域都在积极探索如何利用这一先进技术。而 Stereolabs 推出的ZED Box Mini&#xff0c;正是一款专为满足这些多样化…...

音视频 二 看书的笔记 MediaPlayer

此类是用于播放声音和视频的主要 API 对方不想多说向你丢了一个链接 MediaPlayer Idle 空闲状态Initialized 初始化状态 调用 setDataSource() 时会进入此状态 setDataSource必须在Idle 状态下调用&#xff0c;否则就抛出异常了了了了了。Prepared 准备状态 回调监听setOnPrep…...

可以把后端的api理解为一个目录地址,但并不准确

将后端的 API 理解为一个“目录地址”是可以的&#xff0c;但并不完全准确。让我们更详细地解释一下。 目录 1、生动形象了解api 2、后端 API 的作用 3、可以将 API 理解为“目录地址”的原因 &#xff08;1&#xff09;URL 路径 &#xff08;2&#xff09;层次结构 4、…...

vscode连接服务器失败问题解决

文章目录 问题描述原因分析解决方法彻底删除VS Code重新安装较老的版本 问题描述 vscode链接服务器时提示了下面问题&#xff1a; 原因分析 这是说明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…...

Qt 高效读写JSON文件,玩转QJsonDocument与QJsonObject

一、前言 JSON作为轻量级的数据交换格式&#xff0c;已成为开发者必备技能。Qt框架为JSON处理提供了完整的解决方案&#xff0c;通过QJsonDocument、QJsonObject和QJsonArray三大核心类&#xff0c;轻松实现数据的序列化与反序列化。 JSON vs INI 特性JSONINI数据结构支持嵌…...

开源视频剪辑工具,无损编辑更高效

LosslessCut 是一款基于 FFmpeg 开发的跨平台开源视频剪辑工具&#xff0c;致力于无损处理音视频文件。它无需重新编码即可完成剪切、合并、轨道编辑等操作&#xff0c;极大地保留了原始文件的质量&#xff0c;特别适合处理大体积视频&#xff0c;如无人机拍摄素材或长时录制内…...

Git 之配置ssh

1、打开 Git Bash 终端 2、设置用户名 git config --global user.name tom3、生成公钥 ssh-keygen -t rsa4、查看公钥 cat ~/.ssh/id_rsa.pub5、将查看到的公钥添加到不同Git平台 6、验证ssh远程连接git仓库 ssh -T gitgitee.com ssh -T gitcodeup.aliyun.com...

(UI自动化测试web端)第二篇:元素定位的方法_css定位之ID选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第一种写法id选择器&#xff0c;其实XPath元素定位要比CSS好用&#xff0c;原因是CSS无法使用下标&#xff08;工作当中也是常用的xpath&#xff09;&#xff0c;但CSS定位速度比XPat…...

Mysql---锁篇

1&#xff1a;MySQL 有哪些锁&#xff1f; 全局锁 flush tables with read lock 整个数据库就处于只读状态了 unlock tables 释放全局锁 全局锁主要应用于做全库逻辑备份&#xff0c;这样在备份数据库期间&#xff0c;不会因为数据或表结构的更新&#xff0c;而出现备份文件的数…...

Django 项目打包exe本地运行

Django 项目打包exe本地运行 记一次离谱的需求 其实本来觉得Django项目架构比较清晰,代码逻辑也简单,没打算记笔记,结果遇到离谱需求折腾了很久 开发了一个Django项目,到交付的时候了,客户说自己没有服务器… 没服务器还要登录功能😓 没办法,甲方最大,整吧 第一…...

20250330 Pyflink with Paimon

1. 数据湖 2. 本地安装Pyflink和Paimon 必须安装Python 3.11 Pip install python -m pip install apache-flink1.20.1 需要手动加入这两个jar 测试代码&#xff1a; import argparse import logging import sys import timefrom pyflink.common import Row from pyflink.tab…...

RTMP推流服务器nginx在linux上的编译部署

RTMP&#xff08;Real-Time Messaging Protocol&#xff09;推流确实需要服务器支持‌。RTMP推流服务器的主要功能是接收来自推流客户端的数据流&#xff0c;对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接&#xff0c;处理推流数据&#xff08;如转码、录制等&…...

Matlab教程001:软件介绍和界面使用

1.1 软件介绍 1.1.1 Matlab的介绍 MATLAB&#xff08;MATrix LABoratory&#xff09;是一款由 MathWorks 公司开发的高级编程语言和交互式环境&#xff0c;广泛用于 科学计算、数据分析、机器学习、工程建模、仿真和信号处理 等领域。 1.1.2 主要应用领域 数据分析与可视化…...

【SQL Server数据库备份详细教程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...