面试问题【集合】

news2024/9/27 17:31:29

集合

  • 常见的集合有哪些
  • List、Set、Map 的区别
  • ArrayList 和 Vector 的扩容机制
  • Collection 和 Collections 有什么区别
  • ArrayList 和 LinkedList 的区别是什么
  • ArrayList 和 Vector 的区别是什么
  • ArrayList 和 Array 有何区别
  • ArrayList 集合加入1万条数据,应该怎么提高效率
  • HashSet 的实现原理
  • TreeSet 的实现原理
  • TreeSet 和 HashSet 的区别
  • HashMap 的实现原理
  • HashMap 和 Hashtable 有什么区别
  • 怎么确保一个集合不能被修改
  • Iterator 怎么使用
  • Iterator 和 ListIterator 有什么区别
  • 队和栈是什么
  • 队中方法的区别
  • 哪些集合类是线程安全的
  • 如何实现 Array 数组和 List 集合之间的转换

常见的集合有哪些

1、Collection

(1)list

ArrayList、LinkedList、Vector

(2)set

HashSet、TreeSet

2、Map

HashMap、HashTable、TreeMap

List、Set、Map 的区别

1、List 有序的,元素是允许重复的。
2、Set 无序的,元素是 不允许重复的,
3、Map 保存键值对映射,映射关系可以一对一、多对一。

ArrayList 和 Vector 的扩容机制

ArrayList无参构造

//Object类型的数组 elmentData []
transient Object[] elementData;
//{}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//ArrayList无参构造方法
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

底层用的是一个Object类型的数组elementData,当使用无参构造方法ArrayList后elementData是空的,也就是说使用无参构造方法后容量为0。

//容量为10
private static final int DEFAULT_CAPACITY = 10;
//add添加元素方法
public boolean add(E e) {
    ensureCapacityInternal(size + 1);
    elementData[size++] = e;
    return true;
}
//所需最小容量方法
private void ensureCapacityInternal(int minCapacity) {
	//空数组初始所需最小容量为10
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    ensureExplicitCapacity(minCapacity);
}
//是否需要扩容方法
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
    //所需最小容量当前数组能否存下,如果现在数组存不下进行扩容
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
//容器扩容方法
private void grow(int minCapacity) {
    //旧容量(原数组的长度)
    int oldCapacity = elementData.length;
    //新容量(旧容量加上旧容量右移一位,也就是1.5倍)
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    //如果计算出的新容量比最小所需容量小就用最小所需容量作为新容量
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    //如果计算出的新容量比MAX_ARRAY_SIZE大, 就调用hugeCapacity计算新容量
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    //数组扩容成新容量
    elementData = Arrays.copyOf(elementData, newCapacity);
}

由此看出只有当第一次add添加元素的时候,才初始化容量,因为是空数组所需的最小容量为10,而 elementData 大小为0,新容量算出类也是0,此时最小所需容量作为新容量为10。

例如:

ArrayList<Object> objects = new ArrayList<>();
长度:  1 容量: 10
长度:  5 容量: 10
长度:  11 容量: 15
长度:  15 容量: 15
长度:  21 容量: 22

ArrayList有参构造

//有参构造方法
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}

有参构造和无参构造区别就是给数组初始化了长度initialCapacity并且数组不为空,不为空的数组最小所需容量就是集合元素长度,集合元素长度超过初始化长度initialCapacity值才扩容,扩容逻辑和无参构造一致。

例如:

ArrayList<Object> objects = new ArrayList<>(5);
长度:  3 容量: 5
长度:  5 容量: 5
长度:  7 容量: 7
长度:  11 容量: 15
长度:  15 容量: 15
长度:  19 容量: 22
ArrayList<Object> objects = new ArrayList<>(13);
长度:  15 容量: 19
长度:  17 容量: 19
长度:  21 容量: 28
长度:  25 容量: 28
长度:  29 容量: 42

Vector 扩容机制

Vector 的底层也是一个数组 elmentData ,但相对于 ArrayList 来说,它是线程安全的,它的每个操作方法都是加了锁的。如果在开发中需要保证线程安全,则可以使用 Vector。扩容机制也与 ArrayList 大致相同。唯一需要注意的一点是,Vector 的扩容量是2倍。

结论

数据类型底层数据结构默认初始容量加载因子扩容增量
ArrayList数组10(jdk7)0(jdk8)加载因子1(元素满了扩容)0.5:扩容后容量为原容量的1.5倍
Vector数组10加载因子1(元素满了扩容)1:扩容后容量为原容量的2倍

LinkedList,链表结构,且是是双向链表,不涉及扩容的问题。

Collection 和 Collections 有什么区别

首先说下 collection,collection 它是一个接口,collection 接口的意义是为各种具体的集合提供统一的操作方式,它继承 Iterable 接口,Iterable 接口中有一个最关键的方法, Iterator iterator()方法迭代器,可以迭代集合中的元素。
Collections 是操作集合的工具类,Collections.sort(list)方法进行排序,使用此方法排序集合元素类型必须实现Comparable接口重写compareTo()方法,否则无法实现排序。

HashMap 解决hash冲突的办法有哪些?HashMap用的哪种?使用的hash算法?扩容过程?put方法流程?红黑树的特点?为什么使用红黑树而不使用AVL树?在解决 hash 冲突的时候,为什么选择先用链表,再转红黑树?HashMap 的长度为什么是 2 的幂次方?HashMap默认加载因子是多少?为什么是 0.75?一般用什么作为HashMap的key?HashMap为什么线程不安全?HashMap和HashTable的区别?
LinkedHashMap底层原理?
讲一下TreeMap?
HashSet底层原理?
HashSet、LinkedHashSet 和 TreeSet 的区别?
什么是fail fast?
什么是fail safe?
讲一下ArrayDeque?
并发容器 ConcurrentHashMap put执行流程?怎么扩容?ConcurrentHashMap 和 Hashtable 的区别? CopyOnWriteConcurrentLinkedQueue阻塞队列 JDK提供的阻塞队列原理

ArrayList 和 LinkedList 的区别是什么

  1. ArrayList 是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的,可以直接返回数组中 index 位置的元素,因此在随机访问集合元素上有较好的性能。对于随机访问,ArrayList 优于 LinkedList。
  2. LinkedList 的随机访问集合元素时性能较差,但在插入,删除操作是更快的。因为 LinkedList 不像 ArrayList 一样,不需要改变数组的大小,不需要在数组装满的时候要将所有的数据重新装入一个新的数组,对于插入和删除操作,LinkedList 优于 ArrayList。
  3. LinkedList 需要更多的内存,因为 ArrayList 的每个索引的位置是实际的数据,而 LinkedList 中的每个节点中存储的是实际的数据和前后节点的位置。

ArrayList 和 Vector 的区别是什么

  1. Vector 的方法都是同步的,线程安全;ArrayList 非线程安全,但性能比 Vector 好
  2. 默认初始化容量都是 10,Vector 扩容默认会翻倍,可指定扩容的大小;ArrayList 只增加 50%

ArrayList 和 Array 有何区别

  1. Array 可以容纳基本数据类型和对象,ArrayList 只能容纳对象
  2. Array 是制定大小的,ArrayList 大小是固定的但是可以扩容

ArrayList 集合加入1万条数据,应该怎么提高效率

因为ArrayList的底层是数组实现,并且数组的默认值是10,如果插入10000条要不断的扩容,耗费时间,所以我们调用ArrayList的指定容量的构造器方法ArrayList(int size) 就可以实现不扩容,就提高了性能。

HashSet 的实现原理

HashSet是基于HashMap实现的,数据存储结构都是数组+链表。HashSet中的元素都存放在HashMap的key上面,而value都是一个统一的对象PRESENT。

private static final Object PRESENT = new Object();

HashSet中add方法调用的是底层HashMap中的put方法,put方法要判断插入值是否存在,而HashSet的add方法,首先判断元素是否存在,如果存在则插入,如果不存在则不插入,这样就保证了HashSet中不存在重复值。

通过对象的hashCode和equals方法保证对象的唯一性。

TreeSet 的实现原理

TreeSet底层实际是用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储Set的元素。 TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。

TreeSet 和 HashSet 的区别

1、Hashset 的底层是由哈希表实现的,Treeset 底层是由红黑树实现的。
2、HashSet中的元素没有顺序,TreeSet保存的元素有顺序性(实现Comparable接口)

HashMap 的实现原理

HashMap的存储结构:

JDK1.7中采用数组+链表的存储形式。

在这里插入图片描述

JDK1.8中采用数据+链表+红黑树的存储形式。当链表长度超过阈值(8)时,将链表转换为红黑树。在性能上进一步得到提升。
在这里插入图片描述

HashMap基于map接口,元素以键值对方式存储,允许有null值,HashMap是线程不安全的。我们使用 put(key, value)存储对象到 HashMap 中,使用 get(key)从 HashMap 中获取对象

以下是具体的 put 过程(JDK1.8 版):

  • 对 Key 求 Hash 值,然后再计算下标
  • 如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的 Hash 值相同,需要放到同一个 bucket 中)
  • 如果碰撞了,以链表的方式链接到后面
  • 如果链表长度超过阀值( TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于 6,就把红黑树转回链表
  • 如果节点已经存在就替换旧值
  • 如果桶满了(容量 16*加载因子 0.75),就需要 resize(扩容 2 倍后重排)
    • initialCapacity:初始容量。指的是 HashMap 集合初始化的时候自身的容量。可以在构造方法中指定;如果不指定的话,总容量默认值是 16 。需要注意的是初始容量必须是 2 的幂次方。
    • size:当前 HashMap 中已经存储着的键值对数量,即 HashMap.size()
    • loadFactor:加载因子。所谓的加载因子就是 HashMap (当前的容量/总容量) 到达一定值的时候,HashMap 会实施扩容。加载因子也可以通过构造方法中指定,默认的值是 0.75 。
    • threshold:扩容阀值。即 扩容阀值 = HashMap 总容量 * 加载因子。当前 HashMap 的容量
      大于或等于扩容阀值的时候就会去执行扩容。扩容的容量为当前 HashMap 总容量的两倍。

举个例子,假设有一个 HashMap 的初始容量为 16 ,那么扩容的阀值就是 0.75 * 16 = 12 。
也就是说,在你打算存入第 13 个值的时候,HashMap 会先执行扩容,那么扩容之后为 32 。

HashMap 和 Hashtable 有什么区别

  1. 首先是它们的继承父类不同,HashMap 继承的是 AbstractMap,Hashtable 继承的是 Dictionary
  2. HashMap 是线程是线程不安全的,Hashtable 是线程安全的,所以 HashMap 比 Hashtable 效率高
  3. HashMap 中,null 可以作为键和值,但是 Hashtable 的键和值是 null,编译可以通过,但是会抛出 NullPointerException 异常
  4. HashMap 没有 contains 这个方法,它有的是 containsKey 和 containsValue 方法,Hashtable 有 contains 这个方法与 containsKey 功能相同
  5. HashMap 的默认的容量是 16,Hashtable 的默认容量是 11,它们的扩容方式也不同,HashMap 扩容二倍,Hashtable 扩容二倍加一
  6. 它们都使用了 iterator 遍历元素,但是 Hashtable 还使用了 Enumeration 方式 hasMoreElements()查询是否有数据 nextElement 取出数据
  7. Hashtable 计算 hash 值,直接用 key 的 hashCode(),而 HashMap 重新计算了 key 的 hash 值

怎么确保一个集合不能被修改

final关键字可以修饰类,方法,成员变量,final修饰的类不能被继承,final修饰的方法不能被重写,final修饰的成员变量必须初始化值,如果这个成员变量是基本数据类型,表示这个变量的值是不可改变的,如果说这个成员变量是引用类型,则表示这个引用的地址值是不能改变的,但是这个引用所指向的对象里面的内容还是可以改变的。

集合(map,set,list…)都是引用类型,所以我们如果用final修饰的话,集合里面的内容还是可以修改的。我们可以采用Collections包下来让集合不能修改:

1. Collections.unmodifiableList(List)
2. Collections.unmodifiableSet(Set)
3. Collections.unmodifiableSet(map)

Iterator 怎么使用

/**
 * 测试Collection迭代对象的方式 迭代器的方式 Iterator接口,定义了迭代Collection 容器中对象的统一操作方式 集合对象中的迭代器是采用内部类的方式实现 这些内部类都实现了Iterator接口
 * 使用迭代器迭代集合中数据期间,不能使用集合对象 删除集合中的数据
  */
 @Test
 public void test02() {

     Collection<String> c1 = new HashSet<String>();
     c1.add("java");
     c1.add("css");
     c1.add("html");
     c1.add("javaScript");
     Iterator<String> it = c1.iterator();
     while (it.hasNext()) {
         String str = it.next();
         System.out.println(str);// css java javaScript html
         if (str.equals("css")) {
             // c1.remove(str);//会抛出异常
             it.remove();
         }
     }
     System.out.println(c1);// [java, javaScript, html]
 }

Iterator 和 ListIterator 有什么区别

  1. ListIterator 继承 Iterator
  2. 使用范围不同,Iterator可以迭代所有集合,ListIterator 只能用于List及其子类
  3. ListIterator 比 Iterator 多方法

队和栈是什么

  • 队列特殊的线性表,队列中限制了对线性表的访问只能从线性表的一端添加元素,从另一端取出,遵循先进先出(FIFO)原则。
  • 栈是队的子接口,栈是继承队的,定义类"双端列"从队列的两端可以入队(offer)和出队(poll),LinkedList实现了该接口,如果限制Deque双端入队和出队,将双端队列改为单端队列即为栈,栈遵循先进后出(FILO)的原则。

队中方法的区别

  • offer()和 add()区别:添加队尾
    • offer()和 add()都是增加新项,如果队列满了,add会抛出异常,offer返回false。
  • poll()和 remove()区别:移除队首
    • poll()和 remove()都是从队列中删除第一个元素,为空时remove抛出异常,poll返回null。
  • peek()和 element()区别:获取队首
    • peek()和 element()用于查询队列头部元素,为空时element抛出异常,peek返回null。

哪些集合类是线程安全的

  1. Vector:就比ArrayList多了个同步机制(线程安全)
  2. Stack:栈,也是线程安全的,继承于Vector
  3. Hashtable:就比HashMap多了个线程安全
  4. ConcurrentHashMap:是一种高效但是线程安全的集合

如何实现 Array 数组和 List 集合之间的转换

① 基本数据类型数组转集合

错误代码如下(示例):

int[] arr = {1, 2, 3};
List list = Arrays.asList(arr);
System.out.println("集合为:" + list + " 长度为:" + list.size());
//集合为:[[I@4554617c] 长度为:1

当把基础数据类型的数组转为集合时,由于Arrays.asList参数为可变长泛型,而基本类型是无法泛型化的,所以它把int[] arr数组当成了一个泛型对象,所以集合中最终只有一个元素arr。

正确代码如下(示例):

//(1)通过for循环遍历数组将其转为集合
Integer a[] = {1, 2, 3};
ArrayList<Integer> aList = new ArrayList<>();
for (Integer i : a) {
    aList.add(i);
}

//(2)使用Java8的Stream实现转换(依赖boxed的装箱操作)
int [] myArray = { 1, 2, 3 };
List myList = Arrays.stream(myArray).boxed().collect(Collectors.toList());

② 包装数据类型数组转集合

 Integer[] arr = {1, 2, 3};
 List list = Arrays.asList(arr);
 System.out.println("集合为:" + list + " 长度为:" + list.size());
//集合为:[1, 2, 3] 长度为:3

③ 集合转数组

错误代码如下(示例):

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Integer[] res = (Integer[]) list.toArray();
System.out.println(res);
//java.lang.ClassCastException

正确代码如下(示例):

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);

Integer[] res = new Integer[list.size()];
for (int i = 0; i < list.size(); i++) {
    res[i] = (Integer) list.toArray()[i];
}

更加简单的方式是使用toArray(T[] a) 参数必须为list元素类型的父类或本身

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);

Integer[] res = list.toArray(new Integer[]{});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全面了解 B 端产品设计 — 基础扫盲篇

在今天,互联网的影响力与作用与日俱增,除了我们日常生活领域的改变以外,对于商业领域的渗透也见效颇丰。 越来越多的企业开始使用数字化的解决方案来助力企业发展,包括日常管理、运营、统计等等。或者通过互联网的方式开发出新的业务形态,进行产业升级,如这几年风头正劲的…

WMS相关知识点

目录一、WMS简介二、窗口的分类三、添加Window一、WMS简介 Window&#xff1a;在Android视图体系中Window就是一个窗口的概念。Android中所有的视图都是依赖于Window显示的。 Window是一个抽象的概念&#xff0c;它对应屏幕上的一块显示区域&#xff0c;它不是实实在在的内容&…

大学生实践| 微软ATP“师徒制”AI实战项目收获满满!

ChatGPT在极短时间内掀起了一轮AI狂潮&#xff0c;AI数据、AI大模型、AIGC……对我们AI实践项目感兴趣的同学也越来越多&#xff01;微软(亚洲)互联网工程院下属的微软ATP为大学生们提供了丰富的企业级实践项目。2个月内&#xff01;本期优秀的Chen同学在微软AI工程师团队带领下…

研报精选230301

目录 【行业230301天风证券】家用电器23W9周度研究&#xff1a;一图解读立达信招股说明书【行业230301财信证券】风电设备行业深度&#xff1a;受益大兆瓦、国产替代和技术进步&#xff0c;风电轴承or滚子有望迎来高景气度【行业230301中泰证券】有色金属行业周报&#xff1a;静…

composer安装thinkphp

人家的官方文档上步骤都有了&#xff0c;按照步骤走就行 安装composer 不作赘述 附一个文档链接&#xff1a; 安装 ThinkPHP5.1完全开发手册 看云 主要说一个自己踩过的坑吧 composer create-project topthink/think5.1.* tp5 在输入这个命令以后提示 [Composer\Downl…

git repack多包使用及相关性能测试

1、git数据结构 git 中存在四种数据结构&#xff0c;即object包含四种&#xff0c;分别是tree对象、blob对象、commit对象、tag对象 1.1 blob对象 存储文件内容&#xff0c;内容是二进制的形式&#xff0c;通过SHA-1算法对文件内容和头信息进行计算得到key(文件名)。 如果一…

一款优秀的低代码开发平台是什么样的?

目录 一、一款优秀的低代码平台应该是什么样的&#xff1f; 二、低代码核心能力 01、全栈可视化编程&#xff1a; 02、全生命周期管理&#xff1a; 03、低代码扩展能力&#xff1a; 三、小结 一、一款优秀的低代码平台应该是什么样的&#xff1f; 从企业角度来说&#x…

模拟QQ登录-课后程序(JAVA基础案例教程-黑马程序员编著-第十一章-课后作业)

【案例11-3】 模拟QQ登录 【案例介绍】 1.案例描述 QQ是现实生活中常用的聊天工具&#xff0c;QQ登录界面看似小巧、简单&#xff0c;但其中涉及的内容却很多&#xff0c;对于初学者练习Java Swing工具的使用非常合适。本案例要求使用所学的Java Swing知识&#xff0c;模拟实…

计算机组成原理(2.2)--系统总线

目录 一、总线结构 1.单总线结构 1.1单总线结构框图 ​编辑1.2单总线性能下降的原因 2.多总线结构 2.1双总线结构 2.2三总线结构 2.3四总线结构 ​编辑 二、总线结构举例 1. 传统微型机总线结构 2. VL-BUS局部总线结构 3. PCI 总线结构 4. 多层 PCI 总线结构 …

手撕八大排序(下)

目录 交换排序 冒泡排序&#xff1a; 快速排序 Hoare法 挖坑法 前后指针法【了解即可】 优化 再次优化&#xff08;插入排序&#xff09; 迭代法 其他排序 归并排序 计数排序 排序总结 结束了上半章四个较为简单的排序&#xff0c;接下来的难度将会大幅度上升&…

安卓逆向学习及APK抓包(二)--Google Pixel一代手机的ROOT刷入面具

注意:本文仅作参考勿跟操作&#xff0c;root需谨慎&#xff0c;本次测试用的N手Pixel&#xff0c;因参考本文将真机刷成板砖造成的损失与本人无关 1 Google Pixel介绍 1.1手机 google Pixel 在手机选择上&#xff0c;优先选择谷歌系列手机&#xff0c;Nexus和Pixel系列&…

mac系统上hdfs java api的简单使用

文章目录1、背景2、环境准备3、环境搭建3.1 引入jar包3.2 引入log4j.properties配置文件3.3 初始化Hadoop Api4、java api操作4.1 创建目录4.2 上传文件4.3 列出目录下有哪些文件4.4 下载文件4.5 删除文件4.6 检测文件是否存在5、完整代码1、背景 在上一节中&#xff0c;我们简…

五分钟进步系列之nginx(一)

学习方式&#xff1a;先读英文的原版&#xff0c;如果你能看懂就可以到此为止的了。如果你看不懂&#xff0c;可以再看一下我给的较高难度的英文单词的翻译。如果还是看不懂可以去最下面看我翻译的汉语。下面是我在nginx官网中找到的一段话&#xff0c;它给我们描述了nginx的负…

JAVA中加密与解密

BASE64加密/解密 Base64 编码会将字符串编码得到一个含有 A-Za-z0-9/ 的字符串。标准的 Base64 并不适合直接放在URL里传输&#xff0c;因为URL编码器会把标准 Base64 中的“/”和“”字符变为形如 “%XX” 的形式&#xff0c;而这些 “%” 号在存入数据库时还需要再进行转换&…

软件自动化测试工程师面试题集锦

以下是部分面试题目和我的个人回答&#xff0c;回答比较简略&#xff0c;仅供参考。不对之处请指出 1.自我介绍 答&#xff1a;姓名&#xff0c;学历专业&#xff0c;技能&#xff0c;近期工作经历等&#xff0c;可以引导到最擅长的点&#xff0c;比如说代码或者项目 参考&a…

Qt音视频开发19-vlc内核各种事件通知

一、前言 对于使用第三方的sdk库做开发&#xff0c;除了基本的操作函数接口外&#xff0c;还希望通过事件机制拿到消息通知&#xff0c;比如当前播放进度、音量值变化、静音变化、文件长度、播放结束等&#xff0c;有了这些才是完整的播放功能&#xff0c;在vlc中要拿到各种事…

ImportError: Can not find the shared library: libhdfs3.so解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流

文章目录前言安装 CMake安装 OpenCV 和 FFmpeg启动 Windows 本机的 RTSP 视频流查看本机摄像头设备开始推流开放本机防火墙用 OpenCV 接收视频流结果展示前言 本篇博客的由来如上图哈哈&#xff0c;WSL2 相关安装教程可以参考我之前的博客&#xff1a;Win11安装WSL2和Nvidia驱动…

如果我只有一个奔腾CPU,怎么加速推理神经网络?

前言 有人说当下的AI热潮不过是算力堆砌的产物。现在层出不穷的各种大模型大训练集&#xff0c;使用复杂精致的技术在排行榜上不断刷新分数&#xff0c;这些人似乎忘了一件事情&#xff0c;AI模型最终是要落地的&#xff0c;是要用的&#xff0c;如果不能普及开去那和在象牙塔…

2023年最新软著申请流程(一):软件著作权说明、国家版权官网的账号注册与实名认证

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/129230460 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…