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

Java面试黄金宝典5

1. ConcurrentHashMap 和 HashTable 有哪些区别

  • 原理

  • HashTable:它继承自 Dictionary 类,是 Java 早期提供的线程安全哈希表。其线程安全的实现方式是对每个方法都使用 synchronized 关键字进行同步。例如,在调用 putget 等方法时,整个 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
    1. Java 7 版本:采用分段锁机制,将整个哈希表分成多个 Segment(段),每个 Segment 相当于一个小的 HashTable,每个 Segment 都有自己的锁。不同的 Segment 可以被不同的线程同时访问,只要访问的不是同一个 Segment,就不会产生锁竞争,从而提高了并发性能。
    2. Java 8 版本:摒弃了分段锁,采用 CAS(Compare - And - Swap)和 synchronized 来保证并发操作的安全性。它使用数组 + 链表 + 红黑树的数据结构,在进行插入、删除和查找操作时,首先通过哈希值找到对应的桶,然后对桶首节点加锁,锁的粒度更小,性能更高。

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); }
}

  • 要点

  1. 线程安全实现方式:HashTable 是全量同步,所有方法都加锁,同一时间只能有一个线程访问;ConcurrentHashMap 在 Java 7 中是分段同步,Java 8 中是细粒度同步,允许多个线程同时访问不同部分。
  2. 性能:在高并发场景下,ConcurrentHashMap 的性能远远优于 HashTable,因为 HashTable 的锁粒度太大,容易造成线程阻塞。
  3. 空值处理:HashTable 不允许键或值为 null,而 ConcurrentHashMap 同样不允许键为 null,如果插入 null 键会抛出 NullPointerException

  • 应用

  1. 可以深入了解 CAS 算法的底层原理,它是一种无锁算法,通过比较内存中的值和预期值,如果相等则更新,否则重试。
  2. 研究 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());}}
}

  • 要点

  1. 继承关系:继承自 HashMap,具备 HashMap 的基本特性,如快速的查找、插入和删除操作。
  2. 双向链表:通过双向链表维护元素顺序,使得元素可以按照插入顺序或访问顺序进行迭代。
  3. 访问顺序:如果设置为访问顺序,每次访问元素时,该元素会被移动到链表尾部,这在实现 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:除了使用哈希表存储元素外,还使用双向链表维护元素的插入顺序或访问顺序。在插入元素时,不仅会将元素存储到哈希表中,还会将其添加到双向链表的尾部;在访问元素时,如果是访问顺序,会将该元素移动到链表尾部。

  • 要点

  1. 顺序性:HashMap 不保证元素的顺序,而 LinkedHashMap 可以保证插入顺序或访问顺序。
  2. 性能:由于需要维护双向链表,LinkedHashMap 的插入和删除操作相对 HashMap 会稍慢一些,但在迭代元素时,LinkedHashMap 可以按照顺序快速迭代。
  3. 内存占用:LinkedHashMap 由于需要额外维护双向链表,会比 HashMap 占用更多的内存空间。

  • 应用

  1. 对比它们在不同场景下的性能差异,例如在大数据量插入和频繁迭代的场景下,测试 LinkedHashMap 和 HashMap 的性能表现。
  2. 分析在使用 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);}}
}

  • 要点

  1. 唯一性:不允许存储重复元素,通过 HashMap 的键的唯一性来保证。
  2. 实现基础:基于 HashMap 实现,利用 HashMap 的哈希算法和存储结构来实现快速的查找和插入操作。
  3. 无序性:不保证元素的顺序,每次迭代的顺序可能不同。

  • 应用

  • 了解 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"));}
}

  • 要点

  1. 存储内容:HashMap 存储键值对,HashSet 只存储元素。
  2. 用途:HashMap 用于根据键查找值,HashSet 用于判断元素是否存在。
  3. 空值处理:HashMap 允许键和值为 null,而 HashSet 允许存储一个 null 元素。

  • 应用

  1. 分析在不同业务场景下,如何选择使用 HashMap 或 HashSet,例如在存储用户信息(键为用户 ID,值为用户对象)时使用 HashMap,在存储不重复的单词列表时使用 HashSet。
  2. 研究 HashMapHashSet 在处理哈希冲突时的性能差异。

6. 什么是 Collections.sort,内部原理

  • 原理

Collections.sort 是 Java 集合框架中用于对列表进行排序的静态方法。它有两种重载形式:

  1. 对于实现了 RandomAccess 接口的列表(如 ArrayList),使用双轴快速排序(Dual - pivot Quicksort)。双轴快速排序是一种改进的快速排序算法,它选择两个轴元素,将数组分为三个部分,从而减少了比较和交换的次数,平均时间复杂度为 O(nlogn)。
  2. 对于未实现 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);}}
}

  • 要点

  1. 排序算法:根据列表类型选择不同的排序算法,对于随机访问列表使用双轴快速排序,对于非随机访问列表使用先复制到数组再排序的方式。
  2. 时间复杂度:平均为 O(nlogn),在最坏情况下为 O(n2),但双轴快速排序的最坏情况很少出现。
  3. 稳定性Collections.sort 是不稳定的排序算法,即相等元素的相对顺序可能会改变。

  • 应用

  1. 了解双轴快速排序的具体实现细节,以及它与传统快速排序的区别和优势。
  2. 研究其他排序算法(如归并排序、堆排序)的特点,并与双轴快速排序进行性能比较。

7. 什么是 hash 算法

  • 原理

哈希算法是一种将任意长度的输入数据转换为固定长度的输出数据的算法,输出数据通常称为哈希值或散列值。哈希算法具有以下特点:

  1. 确定性:相同的输入始终产生相同的输出。
  2. 高效性:计算哈希值的速度快,通常在常数时间内完成。
  3. 均匀性:输出值在哈希空间中均匀分布,尽量减少哈希冲突的发生。
  4. 抗碰撞性:尽量避免不同的输入产生相同的输出,但在理论上,由于输入空间无限大,输出空间有限,哈希冲突是不可避免的。

  • 要点

  1. 作用:用于数据的快速查找、存储和验证。例如,在哈希表中,通过哈希算法将键映射到桶中,实现快速的查找和插入操作;在文件验证中,通过计算文件的哈希值来验证文件的完整性。
  2. 特性:确定性、高效性、均匀性和抗碰撞性是哈希算法的重要特性。
  3. 应用场景:广泛应用于密码学、数据存储、缓存等领域。

  • 应用

  1. 了解常见的哈希算法(如 MD5、SHA - 1、SHA - 256)的原理和应用场景。例如,MD5 曾经广泛用于文件校验,但由于其存在安全漏洞,现在逐渐被弃用;SHA - 256 常用于区块链等领域。
  2. 研究哈希碰撞的处理方法,如开放寻址法、链地址法等。

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);}}
}

  • 要点

  1. 功能差异:Iterator 支持删除元素,Enumeration 不支持。
  2. 使用场景:Iterator 是推荐的遍历方式,适用于大多数集合类;Enumeration 主要用于旧代码的兼容性,在新代码中尽量避免使用。
  3. 线程安全Enumeration 是线程安全的,因为它没有 remove() 方法,不会改变集合的结构;而 Iterator 在多线程环境下使用时需要注意线程安全问题。

  • 应用

  1. 了解迭代器模式的原理和应用,它是一种行为设计模式,用于提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
  2. 研究 Iterator 的子类(如 ListIterator)的特点,ListIteratorIterator 的子接口,它可以双向遍历列表,并且支持在遍历过程中添加、修改和删除元素。

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));}
}

  • 要点

  1. 数据结构:ArrayList 和 Vector 是数组,支持随机访问,通过索引可以快速访问元素;LinkedList 是链表,不支持随机访问,需要从头节点或尾节点开始遍历。
  2. 线程安全:Vector 是线程安全的,ArrayList 和 LinkedList 不是。在多线程环境下,如果需要线程安全的列表,可以使用 Vector 或使用 Collections.synchronizedList 方法将 ArrayList 转换为线程安全的列表。
  3. 性能:ArrayList 和 Vector 随机访问速度快,插入和删除操作在尾部以外的位置较慢;LinkedList 插入和删除操作快,随机访问速度慢。
  4. 内存占用:ArrayList 和 Vector 由于是数组,会预先分配一定的内存空间,可能会造成内存浪费;LinkedList 每个节点需要额外的引用,会占用更多的内存空间。

应用

  1. 分析在不同场景下如何选择使用 ArrayList、LinkedList 和 Vector,例如在需要频繁随机访问元素时使用 ArrayList,在需要频繁插入和删除元素时使用 LinkedList,在多线程环境下使用 Vector。
  2. 研究 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);}
}

  • 要点

  1. 功能:volatile 保证可见性,synchronized 保证可见性和原子性。
  2. 使用场景:volatile 适用于一个变量被多个线程读取,一个线程写入的场景,例如状态标志位;synchronized 适用于多个线程对共享资源进行读写操作的场景,例如多线程对计数器进行自增操作。
  3. 性能:volatile 的性能开销较小,因为它不会阻塞线程;synchronized 的性能开销较大,因为它会导致线程阻塞。

  • 应用

  1. 了解 Java 内存模型(JMM)中关于可见性和原子性的原理,以及 volatilesynchronized 在 JMM 中的实现机制。
  2. 研究 volatilesynchronized 在不同并发场景下的优化使用,例如使用 volatile 结合 CAS 操作实现无锁算法。

友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读

https://download.csdn.net/download/ylfhpy/90498379

相关文章:

Java面试黄金宝典5

1. ConcurrentHashMap 和 HashTable 有哪些区别 原理 HashTable&#xff1a;它继承自 Dictionary 类&#xff0c;是 Java 早期提供的线程安全哈希表。其线程安全的实现方式是对每个方法都使用 synchronized 关键字进行同步。例如&#xff0c;在调用 put、get 等方法时&#xff…...

【深度学习与大模型基础】第6章-对角矩阵,对称矩阵,正交矩阵

一、对角矩阵 对角矩阵&#xff08;Diagonal Matrix&#xff09;是一种特殊的方阵&#xff0c;其非对角线上的元素均为零&#xff0c;只有对角线上的元素可能非零。具体来说&#xff0c;对于一个 nn的矩阵 A[]&#xff0c;如果满足 则 AA 称为对角矩阵。对角矩阵通常表示为&am…...

初识R语言饼状图

目录 基础饼图 标签个性化 边界修改 密度条纹 边框颜色 基础饼图 rm(list ls())# Create Data Prop <- c(3,7,9,1,2) # Make the default Pie Plot P1 <- pie(Prop) dev.off() 标签个性化 P2 <-pie(Prop , labels c("Gr-A","Gr-B","…...

计算机技术系列博客——目录页(持续更新)

1.1 博客目录专栏 1.1.1 博客文章导航 计算机技术系列博客——目录页 1.1.2 网页资源整理 2.1 计算机科学理论 2.2 软件工程技术 2.2.1.1 编程语言 Java Java语言基础 (1) Java基础知识总结01——Java基础篇 (2) Java基础知识总结02——集合框架篇 (3) Java基础知识总结03—…...

HTTP和RPC的区别

RPC和 HTTP是两种常见的通信方式&#xff0c;它们在设计目标、使用场景和技术实现上有显著区别。以下是它们的详细对比&#xff1a; 1. 定义与核心思想 特性RPCHTTPRemote Procedure Call远程过程调用HyperText Transfer Protocol超文本传输协议定义一种协议或框架&#xff0…...

Spring MVC 拦截器使用

javaweb过滤器和springmvc拦截器&#xff1a; 拦截器的概念 拦截器使用 1/创建拦截器类&#xff0c;类中实现 handler执行前&#xff0c;执行后与渲染视图后的具体实现方法 public class GlobalExceptionHandler implements HandlerInterceptor {// if( ! preHandler()){re…...

汽车机械钥匙升级一键启动的优点

汽车机械钥匙升级一键启动的优点主要包括&#xff1a; 便捷性&#xff1a;一键启动功能的引入极大地提升了用车便捷性。车主无需翻找钥匙&#xff0c;只需在车辆感应范围内轻触启动键&#xff0c;即可轻松发动汽车。 安全性&#xff1a;移动管家专车专用一键启动系统配备了防…...

中小企业如何低成本构建高效专属网络?

对于许多中小企业管理者而言&#xff0c;构建一套安全、灵活且可扩展的专网系统是数字化转型的“必修课”。本文将从实际业务场景出发&#xff0c;拆解企业组网的核心步骤&#xff0c;并提供可落地的实施方案建议&#xff0c;帮助您快速匹配适合自身需求的网络服务商。 一、组网…...

实用工具-Stirling-PDF

windows桌面版参考这个文档 Getting Started | Stirling-PDF 安装包推荐使用迅雷下载&#xff0c;先转存到迅雷网盘在使用迅雷下载速度嘎嘎快。 github:https://github.com/Stirling-Tools/Stirling-PDF Stirling-PDF 是一个强大的、基于 Web 的开源 PDF 处理工具&#xff0c…...

【C++】 —— 笔试刷题day_6

刷题day_6&#xff0c;继续加油哇&#xff01; 今天这三道题全是高精度算法 一、大数加法 题目链接&#xff1a;大数加法 题目解析与解题思路 OK&#xff0c;这道题题目描述很简单&#xff0c;就是给我们两个字符串形式的数字&#xff0c;让我们计算这两个数字的和 看题目我…...

pytorch 网络结构可视化Netron安装使用方法(已解决)

首先 要把保存的训练模型 转为onnx格式的文件&#xff0c;然后打开下面的链接&#xff0c;选择刚刚转的onnx文件。 下载 Netron&#xff1a; 您可以访问 Netron 的官方网站 在线使用&#xff0c;或者下载桌面版本。 mnist_cnn_model.onnx 确定后&#xff0c; 2、TensorRT学习…...

QEMU 中 x86_cpu_realizefn 到 ept_emulation_fault 的调用流程解析(macos)

QEMU 中 x86_cpu_realizefn 到 ept_emulation_fault 的调用流程解析 在 QEMU 的 x86 虚拟化实现中&#xff0c;CPU 的初始化与执行流程涉及多个关键函数&#xff0c;从 CPU 设备的最终初始化&#xff08;x86_cpu_realizefn&#xff09;到虚拟机监控程序&#xff08;HVF&#x…...

第六:go 操作 redis-go

Redis 在项目开发中redis的使用也比较频繁&#xff0c;本文介绍了Go语言中go-redis库的基本使用。 Redis介绍 Redis是一个开源的内存数据库&#xff0c;Redis提供了多种不同类型的数据结构&#xff0c;很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外&am…...

【蓝桥杯】每天一题,理解逻辑(4/90)【Leetcode 二进制求和】

题目描述 我们解析一下题目 我们可以理解到两个主要信息 给的是二进制的字符串返回他们的和 我们知道&#xff0c;十进制的加减法需要进位&#xff0c;例如&#xff1a;9716是因为91之后进了一位&#xff0c;二进制也是如此&#xff0c;只不过十进制是逢10进1&#xff0c;二…...

CentOS 7 更换 YUM 源为国内

**CentOS 7 更换 YUM 源为国内源 ** 背景说明 更换 YUM 源可加速软件下载&#xff0c;解决官方源访问慢的问题。国内推荐镜像源&#xff1a;阿里云、清华、网易、中科大。 一、备份原有 YUM 源 # 备份系统默认源&#xff08;避免操作失误可恢复&#xff09; sudo cp /etc/yum…...

快速入手-基于Django的mysql配置(三)

Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。比如mysql&#xff0c;旧版本用pymysql对比较多&#xff0c;新的版本采用mysqlclient。 1、安装mysql模块 pip install mysqlclient 2、Django的ORM主要做了两件事 &#xff08;1&#xff09;CRUD数据库中的表&am…...

docker部署dify

1.安装docker 参考链接 https://ascendking.blog.csdn.net/article/details/136407383 设置docker源 vim /etc/docker/daemon.json {"registry-mirrors": ["https://docker.registry.cyou", "https://docker-cf.registry.cyou", "http…...

网络安全红蓝对抗实战演练,沉浸式对抗训练场上线!

在网络安全的世界里&#xff0c;没有永恒的盾牌&#xff0c;只有不断磨砺的利剑。近年来&#xff0c;某金融机构因系统漏洞导致千万级用户数据泄露&#xff0c;某制造企业因生产线遭遇勒索攻击被迫停产数日——这些真实案例揭示了一个残酷现实&#xff1a;传统的理论教学已无法…...

舞狮表演(dp)

#include <bits/stdc.h> using namespace std; const int N1e35; int main() {int t;cin>>t;while(t--){int n;cin>>n;int a[N][N];for(int i1;i<n;i){for(int j1;j<n;j){int x;cin>>x;if(x&1) a[i][j]1; // 如果金额是奇数&#xff0c;a[i]…...

【Qt】Qt + Modbus 服务端学习笔记

《Qt Modbus 服务端学习笔记》 1.因为项目的需要&#xff0c;要写一个modbus通信&#xff0c;csdn上感觉有些回答&#xff0c;代码是人工智能生成的&#xff0c;有些细节不对。我这个经过实测&#xff0c;是可以直接用的。 首先要包含Qt 的相关模块 Qt Modbus 模块主要包含以…...

squirrel语言全面介绍

Squirrel 是一种较新的程序设计语言&#xff0c;由意大利人 Alberto Demichelis 开发&#xff0c;其设计目标是成为一个强大的脚本工具&#xff0c;适用于游戏等对大小、内存带宽和实时性有要求的应用程序。以下是对 Squirrel 语言的全面介绍&#xff1a; 语言特性 动态类型&a…...

SpringBoot配置文件加载优先级

目录 示例 配置文件&编写配置类 在Spring Boot项目中&#xff0c;配置属性的优先级是一个重要的概念&#xff0c;它决定了当存在多个配置源时&#xff0c;哪个配置源的属性将被应用。以下是SpringBoot中配置属性的优先级&#xff0c;从最高到最低&#xff1a; 命令行参数…...

【详细解决】pycharm 终端出现报错:“Failed : 无法将“Failed”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

昨天在终端一顿操作后突然打开pycharm时就开始报错&#xff1a; 无法将“Failed”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 所在位置 行:1 字符: 1 Failed to act…...

CXL协议之FM(Fabric Management)解释

CXL协议中的FM功能详解 1. FM的核心作用 FM是CXL&#xff08;Compute Express Link&#xff09;架构中的核心管理实体&#xff0c;负责协调和管理CXL设备之间的通信、资源分配及拓扑结构。其核心功能包括&#xff1a; 设备发现与枚举&#xff1a;识别CXL拓扑中的设备&#x…...

用Promise实现ajax的自动重试

有时候遇到网络错误&#xff0c;希望可以多试几次&#xff0c;可以利用Promise递归调用实现 以若依系统的登出举例 export function logout() {return request({url: /logout,method: post}) } 修改下原本的登出逻辑&#xff0c;遇到ERR_NETWORK错误&#xff0c;也就是网络问…...

Unity URP 实现场景和UI添加后处理

在更新到URP之后&#xff0c;之前内置的渲染管线的那一套后处理已经无法使用&#xff0c;接下来&#xff0c;我们使用URP的内置后处理实现对场景和UI的后处理。 设置UI 如果UI需要使用后处理&#xff0c;在Canvas里&#xff0c;我们要选择Screen Space - Camera&#xff0c;然…...

搭建ISCSI传输的配置与管理

前提是&#xff1a; windows server2019设置成桥接模式&#xff0c;因为要让虚拟机和主机设置成一个网段&#xff0c;才能通过网络进行新建虚拟磁盘。 1.添加ISCSI角色 安装位置 选择文件和存储服务----------文件和iscsl 服务------------iscsl目标服务器 2.右上角点击任务&a…...

华为参访预约,团队考察体验黑科技之旅

华为参观学习背景 全球第1&#xff0c;中国骄傲 成立于1987年的华为&#xff0c;早在2013年其销售收入就已超过爱立信&#xff0c;成为全球行业第1名。2019年福布斯世界500强排名第61位&#xff0c;全球唯1一家没有上市的民营企业。目前&#xff0c;华为5G技术已经走在世界前沿…...

Java 设计模式之享元模式(Flyweight Pattern)

享元模式&#xff08;Flyweight Pattern&#xff09; 是一种 结构型设计模式&#xff0c;旨在通过共享对象来有效支持大量细粒度对象的复用&#xff0c;从而减少内存占用和提高性能。其核心是 分离内部状态&#xff08;可共享&#xff09;与外部状态&#xff08;不可共享&#…...

C#入门学习记录(三)C#中的隐式和显示转换

C#类型转换&#xff1a;隐式与显式转换的机制与应用 在C#的强类型体系中&#xff0c;数据类型转换是实现数据交互和算法逻辑的基础操作。当数值类型范围存在包含关系&#xff0c;或对象类型存在继承层次时&#xff0c;系统通过预定义的转换规则实现类型兼容处理。隐式转换&…...