杭州某小厂面试
问的都是基础知识,主要是三个部分:计网,数据库,java。计网答得挺好,数据答得一般,Java答得一坨。
目录
1.TCP/IP协议的5层模型
2.3次握手和4次挥手
3.操作系统中的进程和线程的区别
4.lunix top 命令看到的是进程还是线程?
5.http协议的post和get有什么区别?
6.http协议有哪几块内容?
7.几个状态码对应的含义
8.数据库事务的隔离级别
9.主键索引和非主键索引有什么区别?(聚集索引和二级索引)
10.非主键索引一定要回表吗?
11.String以及StringBuilder和StringBuffer的区别
12.HashMap的数据结构
13.hashMap什么时候线程不安全?
14.讲讲concurrentHashMap(JDK1.8之后)
15.实现多线程的方法
16.结合线程池的几个核心参数讲一个线程提交到线程池中的一个过程
1.核心参数
2.线程任务提交到线程池的过程
17.如何保证缓存中的数据和数据库中的数据是一致的?
缓存更新策略
重试机制
异步更新
缓存过期策略
分布式锁
1.TCP/IP协议的5层模型
送分题,TCP/IP是物理层,数据链路层,网络层,传输层,应用层。OSI是7层“物联网输会示用”
2.3次握手和4次挥手
也是送分题,我说的太详细了,讲了中间的所有syn,ack,ACK,seq还有fin等,在讲4次挥手的时候他打断了说太详细了不用讲了。
3次握手:
第一次握手 TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT 同步已发送状态
第二次握手 TCP服务器收到请求报文后,如果同意连接,则会向客户端发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了 SYN-RCVD 同步收到状态
第三次握手 TCP客户端收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED已建立连接状态 触发三次握手
4次挥手:
第一次挥手 客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态
第二次挥手 服务器端接收到连接释放报文后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT 关闭等待状态
第三次挥手 客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成
3.操作系统中的进程和线程的区别
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
4.lunix top 命令看到的是进程还是线程?
top命令看到的是进程,top -h -pid 看到的pid进程下的线程
5.http协议的post和get有什么区别?
目的和用途:
GET 方法主要用于从指定的资源请求数据。它通常用于获取数据,而不是发送数据。
POST 方法主要用于将数据发送到服务器以创建或更新资源。它通常用于提交表单或上传文件。
数据发送:
GET 请求的数据通常附加在 URL 的查询字符串中,这意味着数据会暴露在 URL 中,长度也有限制(通常是 URL 长度限制,而不是数据本身的限制)。
POST 请求的数据包含在请求体中,这意味着数据不会暴露在 URL 中,更加安全。此外,POST 请求没有长度限制(虽然服务器和客户端可能会有限制)。
幂等性:
GET 请求是幂等的,即多次执行相同的 GET 请求不会产生不同的结果(除非资源本身发生了变化)。
POST 请求通常不是幂等的,因为每次发送 POST 请求都可能会创建新的资源或更新现有资源。
缓存:
GET 请求可以被缓存,这有助于减少网络流量并提高性能。
POST 请求通常不会被缓存,因为它们通常用于修改数据。
安全性:
GET 请求由于数据在 URL 中,所以不适合传输敏感信息,因为它可能被记录在浏览器历史、服务器日志或代理服务器中。
POST 请求通过请求体发送数据,因此更加安全,适合传输敏感信息。但是,这并不意味着 POST 请求本身更加安全,因为还需要其他安全措施(如 HTTPS)来保护数据。
书签和收藏夹:
GET 请求的 URL 可以被书签或收藏夹保存,方便用户以后再次访问。
POST 请求的 URL 通常不包含用户提交的数据,因此无法直接通过书签或收藏夹保存。
6.http协议有哪几块内容?
包括请求行,请求头,请求体。
-
请求行(Request Line):
- 方法:如 GET、POST、PUT、DELETE等,指定要执行的操作。
- 请求 URI(统一资源标识符):请求的资源路径,通常包括主机名、端口号(如果非默认)、路径和查询字符串。
- HTTP 版本:如 HTTP/1.1 或 HTTP/2。
请求行的格式示例:
GET /index.html HTTP/1.1
-
请求头(Request Headers):
- 包含了客户端环境信息、请求体的大小(如果有)、客户端支持的压缩类型等。
- 常见的请求头包括
Host
、User-Agent
、Accept
、Accept-Encoding
、Content-Length
等。
-
请求体(可选):
- 在某些类型的HTTP请求(如 POST 和 PUT)中,请求体包含要发送给服务器的数据。
7.几个状态码对应的含义
200:请求成功 处理方式:获得响应的内容,进行处理
302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
404:没有找到 处理方式:丢弃
503:服务出错 由于临时的维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
参考:http 请求包含哪几个部分,分别有何作用?_后端开发 最关注的是请求的哪部分-CSDN博客
8.数据库事务的隔离级别
数据库事务隔离级别是为了解决多个事务并发执行时可能出现的问题,如脏读、不可重复读和幻读等。SQL标准定义了四种隔离级别,它们分别是:
-
Read Uncommitted(读未提交):这是最低的隔离级别,允许事务读取尚未提交的数据变更,可能会导致脏读。
-
Read Committed(读已提交):这个级别保证一个事务只能看见已经提交事务所做的改变,但不可重复读仍可能发生。
-
Repeatable Read(可重复读):这是MySQL的默认事务隔离级别,它确保在同一事务中多次读取相同数据时,结果是一致的,但可能会导致幻读。
-
Serializable(可串行化):这是最高的隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。但这会导致性能问题,因为它可能导致大量的超时和锁竞争。
9.脏读和幻读:
-
脏读:一个事务读取另一个未提交事务的数据。
-
不可重复读:在一个事务内,多次读取同一数据集合时,由于其他事务的修改,导致多次读取的结果不一致。
-
幻读:在一个事务内,执行两次查询,第二次查询结果中包含了第一次查询中未出现的数据或者缺少了原有的数据。
9.主键索引和非主键索引有什么区别?(聚集索引和二级索引)
存储结构:
主键索引:在 InnoDB 存储引擎中,主键索引采用聚簇索引(Clustered Index)的存储方式。聚簇索引的特点是数据行和索引项是存储在一起的,索引的叶子节点直接包含了完整的数据记录。
非主键索引:非主键索引通常采用非聚簇索引(Non - Clustered Index)的存储方式。非聚簇索引的叶子节点存储的是索引列的值以及对应的主键值,而不是完整的数据记录。
查询效率:
主键索引:对于基于主键的查询,主键索引的查询效率非常高,因为可以直接通过聚簇索引定位到数据行,无需进行二次查找。
非主键索引:对于基于非主键索引列的查询,首先需要在非主键索引中查找对应的主键值,然后再通过主键值在主键索引中查找完整的数据记录,这个过程称为回表。因此,非主键索引的查询效率相对较低,尤其是在需要查询大量数据时,回表操作会增加额外的开销。
唯一性:
主键索引:主键索引具有唯一性约束,即主键列中的值必须是唯一的,且不能为 NULL。这是为了确保每一行记录都能被唯一标识。
非主键索引:非主键索引的创建和维护相对简单,因为它不影响数据行的物理存储顺序。在插入、更新和删除数据时,只需要更新非主键索引的索引项,而不需要移动数据行。但是,过多的非主键索引会占用额外的存储空间,并且在数据更新时需要同时更新多个索引,也会增加一定的维护成本。
10.非主键索引一定要回表吗?
不一定,在大多数情况下,当使用非主键索引进行查询,且查询的列不包含在该非主键索引中时,就需要进行回表操作,当查询的列都包含在非主键索引中时,就不需要进行回表操作,这种查询被称为索引覆盖查询。覆盖索引是查询使用了索引,返回的列,必须在索引中能够全部找到。
11.String以及StringBuilder和StringBuffer的区别
String:是不可变类。这意味着一旦创建了String
对象,它的内容就不能再被修改。每次对字符串的修改操作,实际上都会生成一个新的字符串对象,而不会改变原有的对象。这种不可变性提供了较高的安全性和性能优化,但在频繁操作字符串时会导致大量的临时对象生成,影响性能。
StringBuffer:是一个可变类,用于构建和修改字符串。与String不同,StringBuffer允许在不创建新对象的情况下修改字符串的内容。此外,StringBuffer是线程安全的,这意味着它的所有方法都是同步的,多个线程可以安全地操作同一个StringBuffer对象,而不会发生数据竞争。
StringBuilder:也是一个可变类,允许在不生成新对象的情况下修改字符串。StringBuilder和StringBuffer的主要区别在于,StringBuilder是非线程安全的,它的操作不是同步的,不能保证多线程环境中的安全性。但正因为没有同步开销,StringBuilder在单线程环境中的性能优于StringBuffer。
string不可变是因为底层是一个final修饰的char数组,并且没有对外提供修改方法,拼接,替换等方法实际是创建了一个新的数组。不变性可以做到多线程线程安全,而且hashcode不变,使用String作为哈希表的键时能够提高性能。
StringBuilder
和 StringBuffer
都继承自 AbstractStringBuilder
类,它们内部同样使用一个字符数组 value
来存储字符串内容,但这个数组没有被 final
修饰,并且提供了一些方法可以修改数组中的内容,如 append()
、insert()
、delete()
等,这些方法可以直接修改内部字符数组 value
中的内容,而不需要创建新的对象(除非容量不足时进行扩容)。目的是为了在需要频繁修改字符串内容的场景下提高性能。如果使用 String
进行频繁的字符串拼接等操作,会产生大量的临时对象,导致频繁的垃圾回收,影响性能。而 StringBuilder
和 StringBuffer
可以直接在原对象上进行修改,避免了创建大量临时对象的开销。
12.HashMap的数据结构
数组加链表,当链表长度大于8,数组长度大于64链表会变成红黑树。
13.hashMap什么时候线程不安全?
1、put的时候导致的多线程数据不一致。
比如有两个线程A和B,首先A希望插入一个key-value对到HashMap中,首先计算记录所要落到的桶的索引坐标,然后获取到该桶里面的链表头结点,此时线程A的时间片用完了,而此时线程B被调度得以执行,和线程A一样执行,只不过线程B成功将记录插到了桶里面,假设线程A插入的记录计算出来的桶索引和线程B要插入的记录计算出来的桶索引是一样的,那么当线程B成功插入之后,线程A再次被调度运行时,它依然持有过期的链表头但是它对此一无所知,以至于它认为它应该这样做,如此一来就覆盖了线程B插入的记录,这样线程B插入的记录就凭空消失了,造成了数据不一致的行为。
2、在扩容的时候,jdk1.8之前是采用头插法,当两个线程同时检测到hashmap需要扩容,在进行同时扩容的时候有可能会造成链表的循环,主要原因就是,采用头插法,新链表与旧链表的顺序是反的,在1.8后采用尾插法就不会出现这种问题,同时1.8的链表长度如果大于8就会转变成红黑树。
14.讲讲concurrentHashMap(JDK1.8之后)
摒弃了分段锁机制,采用 CAS(Compare - And - Swap)和 synchronized
来保证并发操作的线程安全性。数据结构上采用数组 + 链表 + 红黑树,与 JDK 1.8 的 HashMap
类似。
- CAS:在初始化数组、扩容等操作中使用 CAS 操作。CAS 是一种无锁算法,它通过比较内存中的值和预期值是否相等,如果相等则更新内存中的值,否则重试。例如,在初始化数组时,使用 CAS 操作来确保只有一个线程可以成功初始化数组。
- synchronized:在插入、删除和查找操作中,当需要对某个桶进行操作时,使用
synchronized
关键字对该桶进行加锁。由于只对单个桶加锁,不同的线程可以同时访问不同的桶,从而实现高并发。
jdk1.8之前是在整个put方法上加synthornized,而jdk1.8之后是在方法里面当发生冲突的那一段代码加锁。
put方法:
做插入操作时,首先进入乐观锁,
然后,在乐观锁中判断容器是否初始化,
如果没初始化则初始化容器,
如果已经初始化,则判断该hash位置的节点是否为空,如果为空,则通过CAS操作进行插入。
如果该节点不为空,再判断容器是否在扩容中,如果在扩容,则帮助其扩容。
如果没有扩容,则进行最后一步,先加锁,然后找到hash值相同的那个节点(hash冲突),
循环判断这个节点上的链表,决定做覆盖操作还是插入操作。
循环结束,插入完毕。
get方法:
看上面这代码,ConcurrentHashMap
的get()
方法是不加锁的,为什么可以不加锁?因为table
有volatile
关键字修饰,保证每次获取值都是最新的。
参考:ConcurrentHashMap原理详解(太细了)-CSDN博客
15.实现多线程的方法
1. 继承Thread类
2. 实现Runnable接口
3. 实现Callable接口( JDK1.5>= )
4. 线程池方式创建
16.结合线程池的几个核心参数讲一个线程提交到线程池中的一个过程
1.核心参数
ThreadPoolExecutor
的构造函数如下:
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
corePoolSize
:核心线程数。线程池在初始化时会创建一定数量的核心线程,这些线程在空闲时也不会被销毁,会一直存活在线程池中等待任务的到来。maximumPoolSize
:最大线程数。线程池允许创建的最大线程数量。当核心线程都在执行任务,且任务队列已满时,线程池会创建新的线程,直到线程数量达到最大线程数。keepAliveTime
:线程空闲时间。当线程池中的线程数量超过核心线程数时,多余的线程在空闲一段时间后会被销毁,这段空闲时间就是keepAliveTime
。unit
:keepAliveTime
的时间单位,例如TimeUnit.SECONDS
表示秒。workQueue
:任务队列。用于存储等待执行的任务。当核心线程都在忙碌时,新提交的任务会被放入这个队列中等待执行。常见的任务队列有ArrayBlockingQueue
、LinkedBlockingQueue
等。threadFactory
:线程工厂,用于创建线程。可以通过自定义线程工厂来设置线程的名称、优先级等属性。handler
:拒绝策略。当任务队列已满,且线程池中的线程数量达到最大线程数时,新提交的任务会触发拒绝策略。常见的拒绝策略有AbortPolicy
(直接抛出异常)、CallerRunsPolicy
(由提交任务的线程自己执行)等。
2.线程任务提交到线程池的过程
假设我们创建了一个线程池,代码如下:
import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // 核心线程数5, // 最大线程数60, // 线程空闲时间TimeUnit.SECONDS, // 时间单位new LinkedBlockingQueue<>(3), // 任务队列Executors.defaultThreadFactory(), // 线程工厂new ThreadPoolExecutor.AbortPolicy() // 拒绝策略);// 提交任务for (int i = 0; i < 10; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Executing task " + taskId + " by thread " + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});}// 关闭线程池executor.shutdown();}
}
- 检查核心线程数:当一个新任务提交到线程池时,线程池首先会检查当前线程数量是否小于核心线程数(
corePoolSize
)。如果是,线程池会创建一个新的核心线程来执行该任务。在上述示例中,最初提交的 2 个任务会分别由 2 个新创建的核心线程来执行。 - 放入任务队列:如果当前线程数量已经达到核心线程数,新任务会被放入任务队列(
workQueue
)中等待执行。在示例中,当提交第 3、4、5 个任务时,由于核心线程数为 2,这 3 个任务会被放入LinkedBlockingQueue
中等待。 - 创建新线程:如果任务队列已满,且当前线程数量小于最大线程数(
maximumPoolSize
),线程池会创建一个新的非核心线程来执行该任务。在示例中,当提交第 6、7、8 个任务时,由于任务队列已满(队列容量为 3),且最大线程数为 5,线程池会创建 3 个新的非核心线程来执行这 3 个任务。 - 触发拒绝策略:如果任务队列已满,且当前线程数量已经达到最大线程数,新提交的任务会触发拒绝策略(
handler
)。在示例中,当提交第 9、10 个任务时,由于任务队列已满,且线程数量已达到最大线程数 5,会触发AbortPolicy
拒绝策略,直接抛出RejectedExecutionException
异常。 - 线程空闲处理:当线程完成任务后,如果线程数量超过核心线程数,且该线程空闲时间超过
keepAliveTime
,这个多余的线程会被销毁,以释放系统资源。
17.如何保证缓存中的数据和数据库中的数据是一致的?
缓存更新策略
1.先更新数据库,再更新缓存:这种策略是先更新数据库中的数据,更新成功后再去更新缓存里对应的数据,不过它存在并发问题,多个线程同时更新时,可能会使缓存更新顺序混乱,最终导致缓存数据状态错误。比如两个线程同时更新同一条数据,就可能出现后更新数据库的线程先更新了缓存,造成数据不一致。它比较适用于对缓存更新实时性要求不高,并且写操作较少的场景。
2.先删除缓存,再更新数据库:执行数据更新操作时,先把缓存里对应的数据删除,再去更新数据库。后续请求获取数据时,若发现缓存中无数据,就会从数据库读取最新数据并更新到缓存。在高并发场景下会有短暂的数据不一致情况。例如一个线程删除缓存后还没更新数据库,另一个线程读取数据,就会把数据库里的旧数据更新到缓存,等第一个线程更新完数据库,缓存数据就成旧的了。适合读多写少的场景,因为频繁的读操作能及时把最新数据更新到缓存。
重试机制
1.本地重试:当更新数据库成功但删除缓存失败时,在本地进行多次重试。可以用循环和计数器实现,设置最大重试次数,达到次数仍失败就记录日志或做其他处理。
2.消息队列重试:删除缓存失败时,把删除任务发到消息队列,有专门的消费者处理。若处理失败,任务会重新放回队列,直到成功或达到最大重试次数。能避免本地重试阻塞业务线程,提高系统吞吐量。
异步更新
数据库变更监听:通过监听数据库的变更日志,像 MySQL 的 binlog。数据库数据变更时,触发缓存更新或删除操作。比如用 Canal 工具监听 MySQL 的 binlog,把变更信息发到消息队列,由消费者处理缓存。能实现数据库和缓存的异步更新,降低业务代码复杂度,保证数据最终一致性。
缓存过期策略
合理设置缓存过期时间:给缓存数据设置合理的过期时间,过期后下次请求会从数据库获取最新数据更新缓存。过期时间要根据业务需求和数据更新频率确定,太短会频繁读数据库影响性能,太长则数据不一致时间会延长。
分布式锁
读写锁:进行读写操作时用读写锁,保证同一时间只有一个线程能写,多个线程可以同时读。写操作先获取写锁,更新数据库和缓存后释放;读操作获取读锁,读取数据后释放。能避免并发读写导致的数据不一致,提升系统并发性能。
相关文章:

杭州某小厂面试
问的都是基础知识,主要是三个部分:计网,数据库,java。计网答得挺好,数据答得一般,Java答得一坨。 目录 1.TCP/IP协议的5层模型 2.3次握手和4次挥手 3.操作系统中的进程和线程的区别 4.lunix top 命令看…...

C基础寒假练习(8)
一、终端输入10个学生成绩,使用冒泡排序对学生成绩从低到高排序 #include <stdio.h> int main(int argc, const char *argv[]) {int arr[10]; // 定义一个长度为10的整型数组,用于存储学生成绩int len sizeof(arr) / sizeof(arr[0]); // 计算数组…...
设计模式 ->模板方法模式(Template Method Pattern)
模板方法模式 模板方法模式是一种行为设计模式,它在一个方法中定义一个操作的算法骨架,而将一些步骤延迟到子类中实现。它允许子类在不改变算法结构的情况下重新定义算法中的某些步骤 特点 算法骨架: 在基类中定义算法的框架延迟实现&…...

Redis存储⑤Redis五大数据类型之 List 和 Set。
目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…...
MySQL开窗函数种类和使用总结
在 MySQL 中,开窗函数(Window Functions) 是一种强大的功能,能够在数据分析和聚合时提供灵活的方式。开窗函数在 MySQL 8.0 及以上版本 中引入,可以基于数据的某个分组(窗口)来执行计算…...

DeepSeek——DeepSeek模型部署实战
摘要 文章主要介绍了DeepSeek大模型的本地部署方法、使用方式以及API接入相关内容。首先指出可通过下载Ollama来部署DeepSeek-R1模型,并给出了模型不同参数版本及存储信息。接着说明了如何通过Chatbox官网下载并接入DeepSeek API,以及如何接入本地部署模…...
zsh: command not found: pip
当你在终端输入 pip install ipykernel 时出现 zsh: command not found: pip 错误,这表明系统无法找到 pip 命令,下面为你详细分析可能的原因以及对应的解决办法。 可能的原因 Python 未安装:pip 是 Python 的包管理工具,若你的…...
机器学习数学基础:16.方程组
一、方程组基础概念 (一)定义 方程组是由若干个包含未知数的方程组合而成的集合。例如, { 3 x 2 y − z 7 2 x − y 3 z 5 x 4 y − 2 z 3 \begin{cases}3x 2y - z 7\\2x - y 3z 5\\x 4y - 2z 3\end{cases} ⎩ ⎨ ⎧3x2y−z7…...
即梦(Dreamina)技术浅析(四):生成对抗网络
即梦(Dreamina) 的生成对抗网络(GAN,Generative Adversarial Network)技术是其核心功能之一,用于生成高质量的图像、文本和视频内容。GAN 是一种深度学习模型,由生成器(Generator)和判别器(Discriminator)两部分组成,通过对抗训练的方式不断提升生成内容的质量。 …...

2025年软件测试五大趋势:AI、API安全、云测试等前沿实践
随着软件开发的不断进步,测试方法也在演变。企业需要紧跟新兴趋势,以提升软件质量、提高测试效率,并确保安全性,在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…...
Vue混入(Mixins)与插件开发深度解析
Vue混入(Mixins)与插件开发深度解析 Vue混入(Mixins)与插件开发深度解析1. Vue混入(Mixins)核心概念1.1 什么是混入1.1.1 本质定义与技术定位1.1.2 混入与相关概念的对比1.1.3 适用场景分析1.1.4 设计哲学与…...

【C++】C++11
目录 C11简介 统一的列表初始化 {}初始化 std::initializer_list 声明 auto decltype nullptr 范围for循环 智能指针 STL中的一些变化 右值引用和移动语义 左值引用和右值引用 右值引用的意义 完美转发 lambda表达式 新的类功能 可变参数模版 包装器 func…...

k8sollama部署deepseek-R1模型,内网无坑
这是目录 linux下载ollama模型文件下载到本地,打包迁移到k8s等无网络环境使用下载打包ollama镜像非k8s环境使用k8s部署访问方式非ollama运行deepseek模型linux下载ollama 下载后可存放其他服务器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…...
mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制
在 MySQL 8 的 C 源码中,表的最大字段数量限制体现在 MAX_FIELDS 宏定义中。这个宏定义了表中可以拥有的最大字段数量。 代码中的体现 在 mysql_prepare_create_table 函数中,有以下代码段检查表的字段数量是否超过最大限制: cpp if (alt…...

胜任力冰山模型:深入探索职业能力的多维结构
目录 1、序言 2、什么是胜任力? 3、任职资格和胜任力的区别 4、胜任力冰山模型:职场能力的多维展现 4.1、冰山水面上的部分 4.2、冰山水面下的部分 4.3、深层的个人特质与价值观 5、如何平衡任职资格与胜任能力 6、结语 1、序言 在快速发展的I…...

什么是三层交换技术?与二层有什么区别?
什么是三层交换技术?让你的网络飞起来! 一. 什么是三层交换技术?二. 工作原理三. 优点四. 应用场景五. 总结 前言 点个免费的赞和关注,有错误的地方请指出,看个人主页有惊喜。 作者:神的孩子都在歌唱 大家好…...

Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 替代】
🎀🎀Shell语法入门篇 系列篇 🎀🎀 LinuxDocer 容器化部署之 Shell 语法入门篇 【准备阶段】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell变量】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell数组与函数】LinuxDocer 容…...
DeepSeek LLM(初代)阅读报告
概况 这个是deepseek发布的第一版模型对应的技术报告,模型发布于23年11月,本报告发布于24年1月。 模型有7B和67B两个版本。 虽然本报告中还没有用上后面V2/V3和R1中的关键技术例如MLA、MTP、GRPO,但是报告中已经指明了MoE、强化学习等未来…...
JAVA异步的TCP 通讯-服务端
一、服务端代码示例 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.Completion…...

高效协同,Tita 助力项目管理场景革新
在当今快节奏、高度竞争的商业环境中,企业面临着前所未有的挑战:如何在有限资源下迅速响应市场变化,确保多个项目的高效执行并达成战略目标?答案就在于优化项目集程管理。而在这个过程中,Tita项目管理产品以其独特的优…...
shell编程笔记
变量定义 在 Shell 中,变量定义无需声明类型,直接赋值即可。变量名区分大小写,建议使用大写字母命名环境变量,小写字母命名局部变量。赋值时等号()两边不能有空格。 MY_VAR"Hello World" # 定…...

Python训练营打卡Day40(2025.5.30)
知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout # 先继续之前的代码 import torch import …...
C++ 模板元编程语法大全
C 模板元编程语法大全 模板元编程(Template Metaprogramming, TMP)是C中利用模板在编译期进行计算和代码生成的强大技术。以下是C模板元编程的核心语法和概念总结: 1. 基础模板语法 类模板 template <typename T> class MyClass {// 类定义 };函数模板 t…...
数据库主键与索引详解
目录 主键核心特性 主键必要性问题 索引核心解析 基本定义 优劣分析 索引类型对比 数据结构实现 工作原理 主键与索引核心区别 主键核心特性 唯一标识:确保字段数据不重复且不为空数量限制:每表仅允许存在一个主键存储类型:通常采用…...

Python 训练营打卡 Day 30-模块和库的导入
模块和库的导入 1.1标准导入 import mathprint("方式1: 使用 import math") print(f"圆周率π的值: {math.pi}") print(f"2的平方根: {math.sqrt(2)}\n") 1.2从库中导入特定项 from math import pi, sqrtprint("方式2:使用 f…...

搭建 Select 三级联动架构-东方仙盟插件开发 JavaScript ——仙盟创梦IDE
三级级联开卡必要性 在 “东方仙盟” 相关插件开发中,使用原生 HTML 和 JavaScript 实现三级联动选择(如村庄 - 建筑 - 单元的选择)有以下好处和意义,学校管理: 对游戏体验的提升 增强交互性:玩家能够通…...
C语言| 函数参数传递指针
C语言| 拷贝传递(指针控制内存单元)-CSDN博客 【函数参数传指针和传数据的区别】 如果希望在另外一个函数中修改本函数中变量的值,那么在调用函数时只能传递该变量的地址。 1 普通变量,传递它的地址,可以直接操作该变量的内存空间。 举例…...
HTML5有那些更新
语义化标签 header 头部nav 导航栏footer 底部aside 内容的侧边栏 媒体标签 audio 音频播放video 视频播放 dom查询 document.querySelector,document.querySelectorAll他们选择的对象可以是标签,也可以是类(需要加点),也可以是ID(需要加#) web存储 localStorage和sessi…...

【Zephyr 系列 2】用 Zephyr 玩转 Arduino UNO / MEGA,实现串口通信与 CLI 命令交互
🎯 本篇目标 在 Ubuntu 下将 Zephyr 运行在 Arduino UNO / MEGA 上 打通串口通信,实现通过串口发送命令与反馈 使用 Zephyr Shell 模块,实现 CLI 命令处理 🪧 为什么 Arduino + Zephyr? 虽然 Arduino 开发板通常用于简单的 C/C++ 开发,但 Zephyr 的支持范围远超 STM32…...
AIS常见问题解答(AIS知识补充)
AIS常见问题解答 什么是 AIS? AIS 是“自动识别系统”的缩写。AIS 是一种基于甚高频 (VHF) 的导航和防撞工具,可以实现船舶之间的信息交换。这些信息(AIS 数据)还会被丹麦海事局运营的岸基 AIS 系统收集。因此,在提及 …...