Java面试黄金宝典5
1. ConcurrentHashMap 和 HashTable 有哪些区别
- 原理
- HashTable:它继承自
Dictionary
类,是 Java 早期提供的线程安全哈希表。其线程安全的实现方式是对每个方法都使用synchronized
关键字进行同步。例如,在调用put
、get
等方法时,整个 HashTable 会被锁定,其他线程必须等待当前线程释放锁后才能访问该方法。
java
import java.util.Hashtable;public class HashTableExample {public static void main(String[] args) {Hashtable<String, Integer> hashtable = new Hashtable<>();// 线程安全的 put 操作hashtable.put("one", 1); }
}
- ConcurrentHashMap:
- Java 7 版本:采用分段锁机制,将整个哈希表分成多个
Segment
(段),每个Segment
相当于一个小的 HashTable,每个Segment
都有自己的锁。不同的Segment
可以被不同的线程同时访问,只要访问的不是同一个Segment
,就不会产生锁竞争,从而提高了并发性能。 - Java 8 版本:摒弃了分段锁,采用 CAS(Compare - And - Swap)和
synchronized
来保证并发操作的安全性。它使用数组 + 链表 + 红黑树的数据结构,在进行插入、删除和查找操作时,首先通过哈希值找到对应的桶,然后对桶首节点加锁,锁的粒度更小,性能更高。
- Java 7 版本:采用分段锁机制,将整个哈希表分成多个
java
import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();// 并发安全的 put 操作concurrentHashMap.put("one", 1); }
}
- 要点
- 线程安全实现方式:HashTable 是全量同步,所有方法都加锁,同一时间只能有一个线程访问;ConcurrentHashMap 在 Java 7 中是分段同步,Java 8 中是细粒度同步,允许多个线程同时访问不同部分。
- 性能:在高并发场景下,ConcurrentHashMap 的性能远远优于 HashTable,因为 HashTable 的锁粒度太大,容易造成线程阻塞。
- 空值处理:HashTable 不允许键或值为
null
,而 ConcurrentHashMap 同样不允许键为null
,如果插入null
键会抛出NullPointerException
。
- 应用
- 可以深入了解 CAS 算法的底层原理,它是一种无锁算法,通过比较内存中的值和预期值,如果相等则更新,否则重试。
- 研究 Java 8 中 ConcurrentHashMap 在扩容、红黑树转换等方面的优化策略。
2. 什么是 LinkedHashMap
- 原理
LinkedHashMap
继承自 HashMap
,它在 HashMap
的基础上维护了一个双向链表。这个双向链表定义了元素的迭代顺序,默认情况下是插入顺序,即元素按照插入的先后顺序进行迭代;也可以通过构造函数将其设置为访问顺序,即最近访问的元素会被移动到链表尾部。
java
import java.util.LinkedHashMap;
import java.util.Map;public class LinkedHashMapExample {public static void main(String[] args) {// 创建一个按照插入顺序排序的 LinkedHashMapLinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();linkedHashMap.put("one", 1);linkedHashMap.put("two", 2);linkedHashMap.put("three", 3);for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}
}
- 要点
- 继承关系:继承自
HashMap
,具备HashMap
的基本特性,如快速的查找、插入和删除操作。 - 双向链表:通过双向链表维护元素顺序,使得元素可以按照插入顺序或访问顺序进行迭代。
- 访问顺序:如果设置为访问顺序,每次访问元素时,该元素会被移动到链表尾部,这在实现 LRU 缓存时非常有用。
- 应用
- 实现一个简单的 LRU 缓存,使用
LinkedHashMap
来存储缓存数据,当缓存满时,自动移除最久未使用的元素。
java
import java.util.LinkedHashMap;
import java.util.Map;public class LRUCache<K, V> extends LinkedHashMap<K, V> {private final int capacity;public LRUCache(int capacity) {// 第三个参数设置为 true 表示按照访问顺序排序super(capacity, 0.75f, true) {@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {return size() > capacity;}};this.capacity = capacity;}public static void main(String[] args) {LRUCache<Integer, Integer> cache = new LRUCache<>(2);cache.put(1, 1);cache.put(2, 2);System.out.println(cache.get(1)); // 返回 1cache.put(3, 3); // 该操作会使得关键字 2 作废System.out.println(cache.get(2)); // 返回 -1 (未找到)cache.put(4, 4); // 该操作会使得关键字 1 作废System.out.println(cache.get(1)); // 返回 -1 (未找到)System.out.println(cache.get(3)); // 返回 3System.out.println(cache.get(4)); // 返回 4}
}
3. LinkedHashMap 与 HashMap 有哪些区别
- 原理
- HashMap:基于哈希表实现,通过哈希函数将键映射到桶中,每个桶可以存储一个链表或红黑树(当链表长度超过 8 且数组长度大于 64 时,链表会转换为红黑树)。它不保证元素的顺序,每次迭代的顺序可能不同。
java
import java.util.HashMap;
import java.util.Map;public class HashMapExample {public static void main(String[] args) {HashMap<String, Integer> hashMap = new HashMap<>();hashMap.put("one", 1);hashMap.put("two", 2);hashMap.put("three", 3);for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}
}
- LinkedHashMap:除了使用哈希表存储元素外,还使用双向链表维护元素的插入顺序或访问顺序。在插入元素时,不仅会将元素存储到哈希表中,还会将其添加到双向链表的尾部;在访问元素时,如果是访问顺序,会将该元素移动到链表尾部。
- 要点
- 顺序性:HashMap 不保证元素的顺序,而 LinkedHashMap 可以保证插入顺序或访问顺序。
- 性能:由于需要维护双向链表,LinkedHashMap 的插入和删除操作相对 HashMap 会稍慢一些,但在迭代元素时,LinkedHashMap 可以按照顺序快速迭代。
- 内存占用:LinkedHashMap 由于需要额外维护双向链表,会比 HashMap 占用更多的内存空间。
- 应用
- 对比它们在不同场景下的性能差异,例如在大数据量插入和频繁迭代的场景下,测试 LinkedHashMap 和 HashMap 的性能表现。
- 分析在使用 LinkedHashMap 时,不同的访问顺序设置对性能和内存的影响。
4. 什么是 HashSet
- 原理
HashSet
基于 HashMap
实现,它不允许存储重复的元素。HashSet
内部使用一个 HashMap
来存储元素,将元素作为键,值统一为一个静态常量对象 PRESENT
。当向 HashSet
中添加元素时,实际上是将该元素作为键插入到内部的 HashMap
中,值为 PRESENT
。
java
import java.util.HashSet;public class HashSetExample {public static void main(String[] args) {HashSet<String> hashSet = new HashSet<>();hashSet.add("one");hashSet.add("two");hashSet.add("three");for (String element : hashSet) {System.out.println(element);}}
}
- 要点
- 唯一性:不允许存储重复元素,通过
HashMap
的键的唯一性来保证。 - 实现基础:基于
HashMap
实现,利用HashMap
的哈希算法和存储结构来实现快速的查找和插入操作。 - 无序性:不保证元素的顺序,每次迭代的顺序可能不同。
- 应用
- 了解
HashSet
在去重场景中的应用,例如对一个包含重复元素的列表进行去重操作。
java
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;public class DuplicateRemoval {public static void main(String[] args) {List<String> listWithDuplicates = new ArrayList<>();listWithDuplicates.add("one");listWithDuplicates.add("two");listWithDuplicates.add("one");HashSet<String> set = new HashSet<>(listWithDuplicates);List<String> listWithoutDuplicates = new ArrayList<>(set);for (String element : listWithoutDuplicates) {System.out.println(element);}}
}
5. HashMap 与 HashSet 有什么区别
- 原理
- HashMap:存储键值对,通过键的哈希值来确定存储位置,允许键和值为
null
。它使用哈希表来存储元素,当发生哈希冲突时,会通过链表或红黑树来解决。
java
import java.util.HashMap;
import java.util.Map;public class HashMapExample {public static void main(String[] args) {HashMap<String, Integer> hashMap = new HashMap<>();hashMap.put("one", 1);hashMap.put("two", 2);System.out.println(hashMap.get("one"));}
}
- HashSet:只存储元素,基于
HashMap
实现,元素作为键存储,值为一个固定的常量对象。它不允许存储重复元素,通过HashMap
的键的唯一性来保证。
java
import java.util.HashSet;public class HashSetExample {public static void main(String[] args) {HashSet<String> hashSet = new HashSet<>();hashSet.add("one");hashSet.add("two");System.out.println(hashSet.contains("one"));}
}
- 要点
- 存储内容:HashMap 存储键值对,HashSet 只存储元素。
- 用途:HashMap 用于根据键查找值,HashSet 用于判断元素是否存在。
- 空值处理:HashMap 允许键和值为
null
,而 HashSet 允许存储一个null
元素。
- 应用
- 分析在不同业务场景下,如何选择使用 HashMap 或 HashSet,例如在存储用户信息(键为用户 ID,值为用户对象)时使用 HashMap,在存储不重复的单词列表时使用 HashSet。
- 研究
HashMap
和HashSet
在处理哈希冲突时的性能差异。
6. 什么是 Collections.sort,内部原理
- 原理
Collections.sort
是 Java 集合框架中用于对列表进行排序的静态方法。它有两种重载形式:
- 对于实现了
RandomAccess
接口的列表(如ArrayList
),使用双轴快速排序(Dual - pivot Quicksort)。双轴快速排序是一种改进的快速排序算法,它选择两个轴元素,将数组分为三个部分,从而减少了比较和交换的次数,平均时间复杂度为 O(nlogn)。 - 对于未实现
RandomAccess
接口的列表(如LinkedList
),先将列表元素复制到一个数组中,对数组进行排序,再将排序后的元素复制回列表。
java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class CollectionsSortExample {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(3);list.add(1);list.add(2);Collections.sort(list);for (Integer num : list) {System.out.println(num);}}
}
- 要点
- 排序算法:根据列表类型选择不同的排序算法,对于随机访问列表使用双轴快速排序,对于非随机访问列表使用先复制到数组再排序的方式。
- 时间复杂度:平均为 O(nlogn),在最坏情况下为 O(n2),但双轴快速排序的最坏情况很少出现。
- 稳定性:
Collections.sort
是不稳定的排序算法,即相等元素的相对顺序可能会改变。
- 应用
- 了解双轴快速排序的具体实现细节,以及它与传统快速排序的区别和优势。
- 研究其他排序算法(如归并排序、堆排序)的特点,并与双轴快速排序进行性能比较。
7. 什么是 hash 算法
- 原理
哈希算法是一种将任意长度的输入数据转换为固定长度的输出数据的算法,输出数据通常称为哈希值或散列值。哈希算法具有以下特点:
- 确定性:相同的输入始终产生相同的输出。
- 高效性:计算哈希值的速度快,通常在常数时间内完成。
- 均匀性:输出值在哈希空间中均匀分布,尽量减少哈希冲突的发生。
- 抗碰撞性:尽量避免不同的输入产生相同的输出,但在理论上,由于输入空间无限大,输出空间有限,哈希冲突是不可避免的。
- 要点
- 作用:用于数据的快速查找、存储和验证。例如,在哈希表中,通过哈希算法将键映射到桶中,实现快速的查找和插入操作;在文件验证中,通过计算文件的哈希值来验证文件的完整性。
- 特性:确定性、高效性、均匀性和抗碰撞性是哈希算法的重要特性。
- 应用场景:广泛应用于密码学、数据存储、缓存等领域。
- 应用
- 了解常见的哈希算法(如 MD5、SHA - 1、SHA - 256)的原理和应用场景。例如,MD5 曾经广泛用于文件校验,但由于其存在安全漏洞,现在逐渐被弃用;SHA - 256 常用于区块链等领域。
- 研究哈希碰撞的处理方法,如开放寻址法、链地址法等。
8. 什么是迭代器 Iterator 和 Enumeration
- 原理
- Iterator:是 Java 集合框架中用于遍历集合元素的接口,它提供了
hasNext()
、next()
和remove()
方法。hasNext()
用于判断集合中是否还有下一个元素,next()
用于返回下一个元素,remove()
用于删除最后一次调用next()
方法返回的元素。Iterator
可以在遍历过程中安全地删除元素。
java
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class IteratorExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("one");list.add("two");list.add("three");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String element = iterator.next();if (element.equals("two")) {iterator.remove();}}for (String element : list) {System.out.println(element);}}
}
- Enumeration:是 Java 早期版本中用于遍历集合元素的接口,它只提供了
hasMoreElements()
和nextElement()
方法。hasMoreElements()
用于判断集合中是否还有更多元素,nextElement()
用于返回下一个元素。Enumeration
不支持在遍历过程中删除元素。
java
import java.util.Enumeration;
import java.util.Vector;public class EnumerationExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("one");vector.add("two");vector.add("three");Enumeration<String> enumeration = vector.elements();while (enumeration.hasMoreElements()) {String element = enumeration.nextElement();System.out.println(element);}}
}
- 要点
- 功能差异:Iterator 支持删除元素,Enumeration 不支持。
- 使用场景:Iterator 是推荐的遍历方式,适用于大多数集合类;Enumeration 主要用于旧代码的兼容性,在新代码中尽量避免使用。
- 线程安全:
Enumeration
是线程安全的,因为它没有remove()
方法,不会改变集合的结构;而Iterator
在多线程环境下使用时需要注意线程安全问题。
- 应用
- 了解迭代器模式的原理和应用,它是一种行为设计模式,用于提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
- 研究
Iterator
的子类(如ListIterator
)的特点,ListIterator
是Iterator
的子接口,它可以双向遍历列表,并且支持在遍历过程中添加、修改和删除元素。
9. 什么是 LIST,ArrayList,LinkedList 和 Vector 的区别和实现原理
- 原理
- ArrayList:基于动态数组实现,它会自动扩容以容纳更多元素。当元素数量超过数组容量时,会创建一个更大的数组,并将原数组元素复制到新数组中。默认初始容量为 10,每次扩容为原来的 1.5 倍。
java
import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> arrayList = new ArrayList<>();arrayList.add("one");arrayList.add("two");System.out.println(arrayList.get(0));}
}
- LinkedList:基于双向链表实现,每个节点包含数据和指向前一个节点和后一个节点的引用。插入和删除操作只需要修改节点的引用,不需要移动大量元素,因此在插入和删除操作频繁的场景下性能较好。
java
import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> linkedList = new LinkedList<>();linkedList.add("one");linkedList.add("two");System.out.println(linkedList.get(0));}
}
- Vector:也是基于动态数组实现,与
ArrayList
类似,但它是线程安全的,所有方法都使用synchronized
关键字进行同步。默认初始容量为 10,每次扩容为原来的 2 倍。
java
import java.util.Vector;
import java.util.List;public class VectorExample {public static void main(String[] args) {List<String> vector = new Vector<>();vector.add("one");vector.add("two");System.out.println(vector.get(0));}
}
- 要点
- 数据结构:ArrayList 和 Vector 是数组,支持随机访问,通过索引可以快速访问元素;LinkedList 是链表,不支持随机访问,需要从头节点或尾节点开始遍历。
- 线程安全:Vector 是线程安全的,ArrayList 和 LinkedList 不是。在多线程环境下,如果需要线程安全的列表,可以使用 Vector 或使用
Collections.synchronizedList
方法将 ArrayList 转换为线程安全的列表。 - 性能:ArrayList 和 Vector 随机访问速度快,插入和删除操作在尾部以外的位置较慢;LinkedList 插入和删除操作快,随机访问速度慢。
- 内存占用:ArrayList 和 Vector 由于是数组,会预先分配一定的内存空间,可能会造成内存浪费;LinkedList 每个节点需要额外的引用,会占用更多的内存空间。
应用
- 分析在不同场景下如何选择使用 ArrayList、LinkedList 和 Vector,例如在需要频繁随机访问元素时使用 ArrayList,在需要频繁插入和删除元素时使用 LinkedList,在多线程环境下使用 Vector。
- 研究 ArrayList 和 Vector 在扩容机制上的差异对性能的影响。
10. 什么是 volatile 和 synchronized,有什么区别
- 原理
- volatile:是一个关键字,用于修饰变量。它保证了变量的可见性,即当一个线程修改了被
volatile
修饰的变量的值,其他线程能够立即看到最新的值。这是因为volatile
变量会直接从主内存中读取和写入,而不是从线程的本地缓存中读取和写入。但它不保证原子性,例如对volatile
变量进行自增操作不是原子操作。
java
public class VolatileExample {private static volatile int counter = 0;public static void main(String[] args) {Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter++;}});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {counter++;}});t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(counter);}
}
- synchronized:是一个关键字,用于修饰方法或代码块。它可以保证在同一时间只有一个线程可以访问被
synchronized
修饰的方法或代码块,从而保证了线程安全,既保证了可见性,也保证了原子性。当一个线程进入synchronized
方法或代码块时,会获得对象的锁,其他线程必须等待该线程释放锁后才能进入。
java
public class SynchronizedExample {private static int counter = 0;public static synchronized void increment() {counter++;}public static void main(String[] args) {Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {increment();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {increment();}});t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(counter);}
}
- 要点
- 功能:volatile 保证可见性,synchronized 保证可见性和原子性。
- 使用场景:volatile 适用于一个变量被多个线程读取,一个线程写入的场景,例如状态标志位;synchronized 适用于多个线程对共享资源进行读写操作的场景,例如多线程对计数器进行自增操作。
- 性能:volatile 的性能开销较小,因为它不会阻塞线程;synchronized 的性能开销较大,因为它会导致线程阻塞。
- 应用
- 了解 Java 内存模型(JMM)中关于可见性和原子性的原理,以及
volatile
和synchronized
在 JMM 中的实现机制。 - 研究
volatile
和synchronized
在不同并发场景下的优化使用,例如使用volatile
结合 CAS 操作实现无锁算法。
友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读
https://download.csdn.net/download/ylfhpy/90498379
相关文章:
Java面试黄金宝典5
1. ConcurrentHashMap 和 HashTable 有哪些区别 原理 HashTable:它继承自 Dictionary 类,是 Java 早期提供的线程安全哈希表。其线程安全的实现方式是对每个方法都使用 synchronized 关键字进行同步。例如,在调用 put、get 等方法时ÿ…...
【FastGPT】利用知识库创建AI智能助手
【FastGPT】利用知识库创建AI智能助手 摘要创建知识库上传文档创建应用准备提示词准备开场白关联知识库AI回答效果 摘要 关于FastGPT的部署,官方提供了docker-compose方式的部署文档,如果使用的是podman和podman-compose的同学,可以参考这篇…...
尚硅谷爬虫(解析_xpath的基本使用)笔记
1、xpath的基本使用 创建一个简单的HTML: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><ul><li>北京</li><li&…...
redis MISCONF Redis is configured to save RDB snapshots报错解决
直接上解决方案 修改redis配置文件 stop-writes-on-bgsave-error no 重启redis...
《深入理解AOP编程:从基础概念到Spring实现》
AOP编程 AOP(Aspect Oriented Programing) 面向切面编程 Spring动态代理开发 以切面为基本单位的程序开发,通过切脉你间的彼此协同,相互调用,完成程序构建 切面切入点额外功能 OOP(Object Oriented Programing)面向对象编程 java 以对象为基本…...
网络安全漏洞的种类分为哪些?
漏洞,是指在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。漏洞的出现,不仅会造成个人隐私信息泄露,还涉及到我们的财产安全,那么网络安全漏洞的种类分…...
C程序设计(第五版)及其参考解答,附pdf
通过网盘分享的文件:谭浩强C语言设计 链接: https://pan.baidu.com/s/1U927Col0XtWlF9TsFviApg?pwdeddw 提取码: eddw 谭浩强教授的《C程序设计》是C语言学习领域的经典教材,其内容深入浅出,适合不同层次的学习者。 一、教材版本与特点 最…...
CXL协议之FM(Fabric Management)解释
CXL协议中的FM功能详解 1. FM的核心作用 FM是CXL(Compute Express Link)架构中的核心管理实体,负责协调和管理CXL设备之间的通信、资源分配及拓扑结构。其核心功能包括: 设备发现与枚举:识别CXL拓扑中的设备&#x…...
gstreamer之GstVideoDecoder源码剖析
GStreamer 中的 GstVideoDecoder 基类旨在为实现视频解码器提供一个框架。它定义了一套规则和规范,用于指导基类与其派生子类(具体的视频解码器)之间如何交互与协作。 /*** SECTION:gstvideodecoder* title: GstVideoDecoder* short_descrip…...
Windows部署deepseek R1训练数据后通过AnythingLLM当服务器创建问答页面
如果要了解Windows部署Ollama 、deepseek R1请看我上一篇内容。 这是接上一篇的。 AnythingLLM是一个开源的全栈AI客户端,支持本地部署和API集成。它可以将任何文档或内容转化为上下文,供各种语言模型(LLM)在对话中使用。以下是…...
嵌入式软件开发--面试总结
(1)公司简介:做打印机设备、项目涉及到操作系统 (2)面试内容:笔试题技术面试 //32位单片机c语言程序typedef struct{int a;char b;char c;}str1;typedef struct{char a;int b;char c;}str2;void function…...
测试专项3:算法测试基础理论速查手册
1 算法测试的基本概念 1.1 传统软件测试 vs. 算法测试 在软件工程领域,传统软件测试主要关注程序逻辑的正确性。测试人员通过预设输入与期望输出的对比,确保软件程序能够按照设计要求执行,从而发现代码中的错误或缺陷。常见的测试方法包括单…...
基于Springboot+Typst的PDF生成方案,适用于报告打印/标签打印/二维码打印等
基于SpringbootTypst的PDF生成方案,适用于报告打印/标签打印/二维码打印等。 仅提供后端实现 Typst2pdf-for-report/label/QR code github 环境 JDK11linux/windows/mac 应用场景 适用于定制化的报告模板/标签/条码/二维码等信息的pdf生成方案。通过浏览器的p…...
轻松迁移 Elasticsearch 数据:如何将自建索引导出并导入到另一个实例
概述 在日常的 Elasticsearch 运维和数据管理中,数据迁移是一个常见的需求。无论是为了备份、升级,还是将数据从一个集群迁移到另一个集群,导出和导入索引数据都是至关重要的操作。本文将详细介绍如何将自建 Elasticsearch 实例中的索引数据…...
【C#语言】C#同步与异步编程深度解析:让程序学会“一心多用“
文章目录 ⭐前言⭐一、同步编程:单线程的线性世界🌟1、寻找合适的对象✨1) 🌟7、设计应支持变化 ⭐二、异步编程:多任务的协奏曲⭐三、async/await工作原理揭秘⭐四、最佳实践与性能陷阱⭐五、异步编程适用场景⭐六、性能对比实测…...
【Linux】——环境变量与进程地址空间
文章目录 环境变量环境变量的概念常见的环境变量PATH相关指令 main的三个参数前两个参数第三个参数 程序地址空间进程地址空间 环境变量 环境变量的概念 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,将来会以shell的形式传递给所有进程&…...
docker、docker-compose常用命令
初学者使用的docker、docker-compose常用命令,日常练习,环境简单搭建。 一、docker 1.1、安装docker 1.1.1、yum安装 #安装docker的数据存储驱动包 yum install -y yum-utils device-mapper-persistent-data lvm2 #设置新的安装源、下载配置文件到…...
LS-NET-006-思科MDS 9148S 查看内存
LS-NET-006-思科MDS 9148S 查看内存 方法一:使用 show version 命令 该命令可显示设备的基本系统信息,包括内存总量。 登录交换机的CLI(通过控制台或SSH连接)。输入命令: show version 在输出中查找类似以下内容…...
Pytorch使用手册—自定义函数的双重反向传播与自定义函数融合卷积和批归一化(专题五十二)
1. 使用自定义函数的双重反向传播 有时候,在反向计算图中运行两次反向传播是有用的,例如计算高阶梯度。然而,支持双重反向传播需要对自动求导(autograd)有一定的理解,并且需要小心处理。支持单次反向传播的函数不一定能够支持双重反向传播。在本教程中,我们将展示如何编…...
OpenCV图像拼接(4)图像拼接模块的一个匹配器类cv::detail::BestOf2NearestRangeMatcher
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::BestOf2NearestRangeMatcher 是 OpenCV 库中用于图像拼接模块的一个匹配器类,专门用于寻找两幅图像之间的最佳特征点匹配…...
springmvc中如何自定义入参注解并自动注入值
在Spring中,HandlerMethodArgumentResolver 是一个非常强大的接口,用于自定义控制器方法参数的解析逻辑。以下是一个完整的示例,展示如何使用 HandlerMethodArgumentResolver 并结合自定义注解来实现特定的参数解析逻辑。 ### **1. 定义自定…...
前端安全之DOMPurify基础使用
DOMPurify时一款专门用于防御XSS攻击的库,通过净化HTML的内容,移除恶意脚本,同时保留安全的HTML标签和数学。以下是基础使用指南,涵盖基础的安装与用法。 1,安装DOMPurify 通过npm或yarn安装 npm install dompurify …...
test skills
一、测试技术 1、python GitHub - taizilongxu/interview_python: 关于Python的面试题 GitHub - JushuangQiao/Python-Offer: 《剑指Offer》面试题Python实现 GitHub - vinta/awesome-python: An opinionated list of awesome Python frameworks, libraries, software and …...
sql-DDL
ddl全称为data definition language(数据定义语言),用来定义数据库对象(数据库,表,字段) 一.ddl-数据库操作 1.查询数据库 show databases; 2.创建数据库 create database [if not exists] 数据库名 [default charset 字符集]…...
小科普《DNS服务器》
DNS服务器详解 1. 定义与核心作用 DNS(域名系统)服务器是互联网的核心基础设施,负责将人类可读的域名(如www.example.com)转换为机器可识别的IP地址(如192.0.2.1),从而实现设备间的…...
【操作系统安全】任务3:Linux 网络安全实战命令手册
目录 一、基础网络信息获取 1. 网络接口配置 2. 路由表管理 3. 服务端口监控 二、网络监控与分析 1. 实时流量监控 2. 数据包捕获 3. 网络协议分析 三、渗透测试工具集 1. 端口扫描 2. 漏洞利用 3. 密码破解 四、日志审计与分析 1. 系统日志处理 2. 入侵检测 3…...
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用
Docker 是一种轻量级容器化技术,它允许开发者打包应用程序和其依赖项到一个可移植的容器中,然后在任何环境中运行。Docker 的基本概念包括以下几点: 容器:Docker 使用容器来封装应用程序及其所有依赖项,使其能够在任何…...
数据结构与算法-图论-拓扑排序
前置芝士 概念 拓扑排序(Topological Sorting)是对有向无环图(DAG,Directed Acyclic Graph)的顶点进行排序的一种算法。它将图中的所有顶点排成一个线性序列,使得对于图中的任意一条有向边 (u, v)&#x…...
RabbitMQ的高级特性介绍(一)
消息确认机制 ⽣产者发送消息之后, 到达消费端之后, 可能会有以下情况: a. 消息处理成功 b. 消息处理异常 RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第二种情况, 就会造成消息丢失。 那么如何确保消费端已经成功接收了, 并正确处理了呢? 为了保证消息从队列…...
嵌入式硬件篇---WIFI模块
文章目录 前言一、核心工作原理1. 物理层(PHY)工作频段2.4GHz5GHz 调制技术直接序列扩频正交频分复用高效数据编码 2. 协议栈架构MAC层Beacon帧4次握手 3. 核心工作模式 二、典型应用场景1. 智能家居系统远程控制环境监测视频监测 2. 工业物联网设备远程…...
Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取。本地部署方式
开源地址:https://github.com/mendableai/firecrawl 01、FireCrawl 项目简介 Firecrawl 是一款开源、优秀、尖端的 AI 爬虫工具,专门从事 Web 数据提取,并将其转换为 Markdown 格式或者其他结构化数据。 Firecrawl 还特别上线了一个新的功…...
zabbix数据库溯源
0x00 背景 zabbix数据库如果密码泄露被登录并新增管理员如何快速发现?并进行溯源? 本文介绍数据库本身未开启access log的情况。 0x01 实践 Mysql 数据库查insert SELECT * FROM sys.host_summary_by_statement_type where statement like %insert% 查…...
oracle 索引
Oracle 数据库中的索引是优化查询性能的重要工具,其类型多样,适用于不同场景。以下是 Oracle 索引的主要分类及特点: 1.B-Tree 索引(平衡树索引) 特点: 默认索引类型,树形结构(根、…...
ZooKeeper集群高可用性测试与实践:从规划到故障模拟
#作者:任少近 文章目录 ZooKeeper集群环境规划1.集群数据一致性测试2.集群节点故障测试 ZooKeeper集群高可用性测试的主要目的是确保在分布式环境中,ZooKeeper服务能够持续提供一致性和高可用性的协调服务。 ZooKeeper集群环境规划 节点ipZooKeeper版本…...
RocketMQ 架构
一、RocketMQ 核心架构概述 1. 主要组件 Name Server: 集群的「中枢神经」,负责 Topic 元数据管理(如 Topic 分区分布、Broker 节点状态监控)。 Broker: 消息存储与流转的核心节点,负责消息的持久化…...
Microchip AN1477中关于LLC数字补偿器的疑问
最近在学习Microchip的AN1477关于LLC的功率级传递函数推导及数字补偿器设计,对其中的2P2Z数字补偿器的系数有一些困惑。我在MATLAB中运行了源程序提供的VMC_LLC.m文件,发现有些地方和AN1477中的结果不一致。现在把相关有疑问的地方列举出来,也…...
力扣热题100(方便自己复习,自用)
力扣热题100 1. 两数之和 - 力扣(LeetCode) 查找两数之和是不是等于target也就是我们找到一个数之后,用target将其减掉,再寻找应当对应的元素是什么每找到一个数,我们就将其放在集合中,因为集合中可以去重…...
视频翻译器免费哪个好?轻松玩转视频直播翻译
你是不是觉得看外语视频很麻烦?每次遇到喜欢的外语电影、电视剧或动漫,总是要等字幕组的翻译,或者因为语言不通而错过精彩的情节。 这个时候,掌握多语种直播翻译方案就显得尤为重要,有了实时字幕,看外语视…...
深度学习中的“刹车”:正则化如何防止模型“超速”
深度学习中的“刹车”:正则化如何防止模型“超速” 大家好!今天我们来聊聊深度学习中的一个重要概念——正则化。 什么是过拟合? 想象一下,你正在教一个孩子认字。你给他看很多猫的图片,他都能正确识别。但是&#…...
【pytest框架源码分析五】pytest插件的注册流程
前文介绍到pytest整体是运用插件来实现其运行流程的。这里仔细介绍下具体过程。 首先进入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…...
【协作开发】低成本一键复刻github的gitea
在阅读 next-public 时,反思原本的需求,是否本未倒置,故而重新调研当下开源现状。发现 gitea 完全满足商业软件的开发要求,并且价格足够低,使用足够方便,其他同类软件完全不用看了,真是世界级的…...
虚拟机 | Ubuntu操作系统:su和sudo理解及如何处理忘记root密码
系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放 文章目录 系列文章目录前言一、su和sudo是什么?1、su忘记root密码的解决方案无法进入GRUB引导页面 2、sudo推荐使用sud…...
token升级(考虑在分布式环境中布置token,结合session保证请求调用过程中token不会过期。)
思路: 首先,用户的需求是确保使用同一个Token的外部调用都在一个Session中处理。 需要考虑Token与Session绑定、安全措施、Session管理、分布式处理等。 使用Redis作为Session存储, 在Java中 通过Spring Data Redis或Lettuce库实现。 2.生成…...
Flink 通过 Chunjun Oracle LogMiner 实时读取 Oracle 变更日志并写入 Doris 的方案
文章目录 一、 技术背景二、 关键技术1、 Oracle LogMiner2、 Chunjun 的 LogMiner 关键流程3、修复 Chunjun Oracle LogMiner 问题 一、 技术背景 在大数据实时同步场景中,需要将 Oracle 数据库的变更数据(CDC) 采集并写入 Apache Doris&am…...
若依(RuoYi)框架新手使用指南
若依(RuoYi)框架新手使用指南 若依(RuoYi)是一款基于 Spring Boot Vue 的前后端分离企业级开发框架,集成了权限管理、代码生成、监控日志等核心功能,适用于快速构建中后台管理系统。以下是详细的使用指南…...
k8s-coredns-CrashLoopBackOff 工作不正常
本文作者: slience_me 问题描述 # 问题描述 # rootk8s-node1:/home/slienceme# kubectl get pods --all-namespaces # NAMESPACE NAME READY STATUS RESTARTS AGE # kube-flannel kube-flannel-ds-66bcs …...
【css酷炫效果】纯CSS实现粒子旋转动画
【css酷炫效果】纯CSS实现粒子旋转动画 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492008 缘 创作随缘,不定时更新。 创作背景 刚看到csdn出活动了&…...
SQL 通配符
SQL 通配符 在SQL查询中,通配符是一种非常有用的特性,它允许用户在查询时使用特殊字符来匹配一系列的值。本文将详细介绍SQL中的通配符及其用法,帮助读者更好地理解如何在SQL查询中使用通配符。 1. 什么是通配符? 通配符是SQL查…...
【工具】C#防沉迷进程监控工具使用手册
一、软件简介 本工具用于监控指定进程的运行时长,当达到预设时间时通过声音、弹窗、窗口抖动等方式进行提醒,帮助用户合理控制程序使用时间。 软件在上篇文章。 二、系统要求 Windows 7/10/11.NET Framework 4.5 或更高版本 三、快速入门 1. 配置文件…...
4.数据结构-树和二叉树
树和二叉树 4.1树和二叉树的定义4.1.1树的定义4.1.2树的基本术语4.1.3二叉树的定义 4.2二叉树的性质和存储结构4.2.1二叉树的性质4.2.1二叉树的存储结构顺序存储链式存储 4.3遍历二叉树和线索二叉树4.3.1遍历二叉树根据遍历序确定二叉树先序序列创建二叉链表复制二叉树计算二叉…...