安卓车载app面经
java部分
-
常见集合类
List
继承了Collection接口的一个接口,List中的数据是有序的,可重复的
实现类
在Java中,List
是一个接口,它属于 Java Collections Framework 的一部分。List
接口代表了一个有序的集合(有时被称为序列),可以通过它们的整数索引位置(从0开始)访问元素,并且允许重复的元素。Java 提供了多个 List
接口的实现类,每个都有其特点和适用场景。
-
ArrayList:
-
实现了
List
接口。 -
基于动态数组的数据结构,允许快速随机访问元素。
-
在列表末尾添加元素的操作通常很快,但如果需要插入或删除中间的元素,则可能比较慢,因为需要移动其他元素。
-
-
LinkedList:
-
同样实现了
List
接口,并额外实现了Deque
接口,因此它也可以作为队列使用。 -
基于双向链表的数据结构,使得在任何位置(开头、结尾或中间)插入和删除元素都非常快。
-
但是,访问特定索引的元素相对较慢,因为它需要从头或尾遍历链表直到找到目标节点。
-
-
Vector:
-
类似于
ArrayList
,但它是同步的,意味着它是线程安全的。 -
因为其实现了同步机制,在不需要线程安全的情况下使用它可能会导致性能下降。
-
-
Stack:(因为历史原因,栈数据结构使用ArrayDeque来实现)
-
继承自
Vector
,提供了一种“后进先出”(LIFO)的数据结构。 -
主要用于支持如
push
,pop
,peek
等栈操作。
-
当你选择使用哪种类型的 List
实现时,应考虑你的具体需求,例如是否需要频繁地在列表中间进行插入和删除操作,还是更注重快速的随机访问能力等。每种实现都有其优缺点,了解这些可以帮助你做出更好的决策。
例如,如果你的应用程序需要大量的插入和删除操作,特别是在列表的两端,那么 LinkedList
可能是一个更好的选择。相反,如果你的应用主要涉及随机访问而较少涉及插入和删除,那么 ArrayList
或者 Vector
可能更加合适。
Set
继承了Collection接口的一个接口,接受泛型类,Set接口包含HashSet,TreeSet等实现类
HashSet中的数据是无序的(是散列表),可以存储空值,不可重复的,都是线程不同步
TreeSet中的数据是有序的,不可以存储空值不可重复
Map
储存了键值对的一个接口,
它不是继承自Collection 的子接口,它自成一派,它里面存放的数据是一对一对存放的,称为键值对,键不能重复,键和值都是Object型
实现类:
HashMap和Hashtable
区别:
在于HashMap线程不同步,效率高,HashTable线程同步,效率低
HashMap允许使用null作为键,而Hashtable不可以使用null作为键
put()——存入键值对
HashMap
是 Java 中用于存储键值对的数据结构,它提供了快速的插入、删除和查找操作。
HashMap
HashMap
主要依赖于数组和链表(在 Java 8 及之后版本中引入了红黑树优化)来存储数据。具体来说,HashMap
内部包含了一个 Node<K,V>[] table
数组,每个 Node
实际上就是一个单向链表的节点。当多个键通过哈希函数映射到数组的同一个位置时,这些键值对会以链表的形式存在该位置上。如果链表长度超过一定阈值(默认为8),则会将链表转换成红黑树,以此提高查询效率。
关键特性
-
哈希函数:
HashMap
使用键对象的hashCode()
方法生成一个哈希码,然后通过一定的算法将其映射到数组中的某个索引位置。这个过程是决定键值对存储位置的关键步骤。
细节:怎么判断两个对象的hashCode是相同的?
具体说说hashCode这个方法?
-
负载因子(Load Factor):这是
HashMap
在扩容之前允许的最大“满度”。默认的负载因子是 0.75,意味着当HashMap
中元素的数量达到容量的 75% 时,HashMap
会自动进行扩容(通常是将容量翻倍),以便减少哈希冲突的概率并维持较好的性能。 -
扩容机制:当
HashMap
达到其容量与负载因子的乘积大小时,就会触发扩容操作。扩容过程中,HashMap
会创建一个新的更大的数组,并将现有的所有键值对重新分配到新的数组中。 -
链表转红黑树:为了防止因哈希碰撞导致的链表过长而影响查询效率,在 Java 8 中,当链表长度超过特定阈值(默认为8)且当前
HashMap
容量大于等于64时,链表会被转换成红黑树。这大大提高了在最坏情况下的查找效率,从 O(n) 提升到了 O(log n)。 -
线程不安全:
HashMap
不是线程安全的。如果需要在多线程环境中使用,则可以考虑使用ConcurrentHashMap
或者通过其他同步手段来保证线程安全。
-
访问控制关键字:private, protected, public,
private修饰的成员变量和函数 仅类内部可以访问
不写时修饰的成员变量和函数默认是一种包访问,仅内部类和同一个包中的类可以访问
protected修饰的成员变量和函数 内部类,同一个包中的类以及子类可以访问
public修饰的成员变量和函数没有访问限制
类内部 | 同包 | 子类 | 无限制 | |
private | √ | |||
不写 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
细节:
什么时候会使用这些关键字?
结合项目说:private,不希望某个类在外部被修改,保证只能在类内部使用
注意观察项目中哪里使用这些关键字,意义是什么?
protected关键字使用的场景?不希望外部类使用,只希望子类/内部类能够使用
-
线程状态
-
创建线程的三种方式,各自阐述优缺点和作用
-
线程池:
-
corePoolSize(核心线程数)
-
maximumPoolSize(最大线程数)
-
keepAliveTime(空闲线程存活时间)
-
unit(存活时间单位)
-
workQueue(任务队列)
-
threadFactory(线程工厂)
-
handler(拒绝策略)
细节:
线程池有哪些拒绝策略?
在车机安卓项目上什么时候使用了线程池?(使用耗时操作举例)
相比于线程池/子线程,自定义线程池的好处?
线程池相关的问题
/** * 在实际业务中,thread Runnable Callable启动线程都不用, * 将所有的多线程异步任务都交给线程池执行-资源控制 * * public ThreadPoolExecutor(int corePoolSize, * int maximumPoolSize, * long keepAliveTime, * TimeUnit unit, * BlockingQueue<Runnable> workQueue, * ThreadFactory threadFactory, * RejectedExecutionHandler handler) * * 七大参数: * corePoolSize:核心线程数【一直存在除非设置( allowCoreThreadTimeOut)】 * 线程池,创建好以后就准备就绪的线程数量,就等待来接受异步任务去执行 * maximumPoolSize:【200】最大线程数量,控制资源 * keepAliveTime:存活时间。如果当前的线程数量大于core数量 * 释放空闲的线程(maximumPoolSize-corePoolSize)。只要线程空闲大于指定的keepAliveTime就释放 * TimeUnit:时间单位 * BlockingQueue:阻塞队列,用来存储等待执行的任务,如果当前对线程的需求超过了 corePoolSize * 大小,就会放在这里等待空闲线程执行。 * ThreadFactory:创建线程的工厂,比如指定线程名等 * RejectedExecutionHandler:拒绝策略,如果线程满了,线程池就会使用拒绝策略。 * * 工作顺序: * 运行流程: * 1、线程池创建,准备好 core 数量的核心线程,准备接受任务 * 2、新的任务进来,用 core 准备好的空闲线程执行。 * (1) 、core 满了,就将再进来的任务放入阻塞队列中。空闲的 core 就会自己去阻塞队 * 列获取任务执行 * (2) 、阻塞队列满了,就直接开新线程执行,最大只能开到 max 指定的数量 * (3) 、max 都执行好了。Max-core 数量空闲的线程会在 keepAliveTime 指定的时间后自 * 动销毁。最终保持到 core 大小 * (4) 、如果线程数开到了 max 的数量,还有新任务进来,就会使用 reject 指定的拒绝策 * 略进行处理 * 3、所有的线程创建都是由指定的 factory 创建的。 * * new LinkedBlockingDeque<>(100000) 默认是Integer的最大值。内存不够 / 业务需求 * * 面试: * 一个线程池 core 7; max 20 ,queue:50,100 并发进来怎么分配的; * 先有 7 个能直接得到执行,接下来 50 个进入队列排队,在多开 13 个继续执行。现在 70 个 * 被安排上了。剩下 30 个默认拒绝策略。 * 如果不想抛弃还要执行:使用CallerRunsPolicy策略 * public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {//同步执行线程的run方法 * if (!e.isShutdown()) { * r.run(); * } * * @param args */ ThreadPoolExecutor executor = new ThreadPoolExecutor( 10, // corePoolSize 20, // maximumPoolSize 60, // keepAliveTime TimeUnit.SECONDS, // unit new LinkedBlockingQueue<>(100), // workQueue new ThreadFactory() { // threadFactory @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setName("CustomThreadPoolThread"); return t; } }, new ThreadPoolExecutor.CallerRunsPolicy() // handler );
-
多线程方法 sleep wait join notify notifyAll()
sleep() 和 wait() 有什么区别?
sleep()是Thread类的方法,调用此方法使得当前线程停止运行一段时间,让出CPU,使得其他线程有机会执行。但是sleep()并不会放弃对象锁
wait()是Object类的方法,调用此方法使得Object放弃对象锁,进入此对象的等待锁定池,在调用Notify方法后,才进入线程获取池获取对象。
在Java中,join()
, notify()
, 和 notifyAll()
是与线程同步和通信相关的几个重要方法。它们用于管理线程的执行顺序以及在线程之间进行协调。下面是每个方法的详细解释:
join()
-
作用:
join()
方法用于等待该线程结束。调用某个线程A的join()
方法会使当前线程(比如主线程)等待直到线程A死亡。 -
使用场景:当你希望在一个线程完成其工作之后再继续执行后续代码时非常有用。
-
示例:
Thread threadA = new Thread(() -> { // 线程A的工作 }); threadA.start(); try { threadA.join(); // 主线程将等待直到threadA完成 } catch (InterruptedException e) { e.printStackTrace(); } // 继续执行主线程的其他任务
notify() 和 notifyAll()
这两个方法都是用来唤醒正在等待某个特定监视器锁(monitor lock)的线程。
-
notify()
-
作用:唤醒一个正在等待该对象监视器的单个线程。如果有多个线程都在等待,则随机选择其中一个线程来唤醒。
-
注意事项:必须在同步上下文中调用(即,在
synchronized
方法或块内),否则会抛出IllegalMonitorStateException
。
-
-
notifyAll()
-
作用:唤醒所有正在等待该对象监视器的所有线程。然而,尽管所有的线程都被唤醒了,但只有一个线程能够获取到锁并继续执行,其他的线程将继续等待。
-
适用情况:当你不确定哪个线程应该被唤醒,或者你想要让所有等待的线程都有机会竞争锁的时候使用。
-
-
synchronized 关键字:
代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。
细节:
synchronized锁非静态方法锁的是什么?
synchronized修饰静态方法锁的是什么?
可重入锁有了解吗?
synchronized相关问题
-
volatile关键字
volatile
-
解释死锁
死锁
-
生产者消费者
生产者-消费者问题及Java实现
-
常用设计模式
单例模式(理解其实现方式和适用场景)单例模式写法
工厂模式:不太熟,提一嘴
观察者模式:
我说的是使用匿名内部类注册回调,结合项目说一下
https://blog.csdn.net/qq_26460841/article/details/121335675
通过观察者模式可以实现一种一对多的关系,使得当被观察者的状态发生改变的时候,所有的观察者都可以得到通知,并作出相应的更新操作。
-
匿名内部类:Android中,最常见的点击事件,通过设置控件的OnClickListener并传入一个OnClickListener的实现类来回调点击事件。(观察者:OnClickListener,被观察者:控件)
-
例四:Android中,我们常用的recyclerView,listView刷行数据时调用notifyDataSetChanged()来更新ui,想知道具体原因,那么请仔细往下看完这篇文章。
-
例五:Android中,我们通常发送一个广播,凡是注册了该广播的都可以接收到该广播,这也是Android中典型的观察者模式。
android部分
-
四大组件:
Activity:
用于用户交互的页面,顺便把生命周期和启动模式提一嘴
BroadCastReceiver:
广播
ContentProvider :
ContentProvider
Service
Service的用法
-
Activity生命周期的七个状态:
-
onCreate()
当Activity正在被创建时调用。这是生命周期中的第一个回调方法,通常在这里初始化界面组件和一些基本设置。
-
onStart()
当Activity变得可见,但还未出现在前台时调用。此时,Activity已经准备好与用户交互。
-
onResume()
当Activity出现在前台并与用户交互时调用。这是用户真正开始使用Activity的时刻。
-
onPause()
当系统准备去启动另一个Activity,当前Activity即将停止交互时调用。在这个方法中,应该做一些资源释放或者保存数据的操作,但此时Activity仍然可见。
-
onStop()
当Activity不再可见时调用。这可能是因为另一个Activity已经启动或者系统正在销毁Activity。
-
onDestroy()
当Activity即将被销毁时调用。在这个方法中,应该释放所有的资源,如线程、注册的广播接收器等。
-
onRestart()
-
当Activity从前台状态回到可见状态时调用(例如,从onStop返回)。这通常发生在用户返回到这个Activity时。
Activity启动模式
启动模式(LaunchMode)是一个用于定义Activity如何启动的属性。启动模式决定了新的Activity实例是如何与当前任务关联的。Android支持以下几种启动模式:
-
standard:每次调用startActivity()时,都会创建一个新的实例。这是默认的启动模式。
-
singleTop:如果新的Activity位于任务的栈顶,则不会创建新实例,而是使用现有的实例。
-
singleTask:任务栈中只有一个实例。如果实例已存在,则不会创建新的实例,而是将该实例移至栈顶并将其上方的实例全部出栈。再次onNewIntent()方法
-
singleInstance:新建一个任务栈,并且这个任务栈只有这一个实例。这个实例可以被多个应用共享。
启动模式可以在AndroidManifest.xml中通过<activity>标签的android:launchMode属性来设置。
细节:
Activity 在横竖屏切换的时候调用onStoreInstanceState缓存的当前UI状态信息,会在哪个函数中被调用?
onCreate
singleTop/singleTask:比如从A页面跳到B页面,再从B页面跳回A页面,不会调用onCreate方法,那么缓存的内容是怎么被加载到A页面中的?
onNewIntent()
-
Binder机制:源码
https://blog.csdn.net/weixin_37390872/article/details/109447337?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-3-109447337-blog-105314445.235%5Ev43%5Econtrol&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-3-109447337-blog-105314445.235%5Ev43%5Econtrol&utm_relevant_index=6
-
AIDL机制:
https://blog.csdn.net/weixin_37390872/article/details/109447337?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-3-109447337-blog-105314445.235%5Ev43%5Econtrol&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-3-109447337-blog-105314445.235%5Ev43%5Econtrol&utm_relevant_index=6
在Android平台,一个进程通常不能访问另一个进程的内存空间为了使其他的应用程序也可以访问本应用程序提供的服务。
简化版:
细节:
-
什么时候会使用AIDL?
-
AIDL的实现?
-
AIDL的数据类型?
AIDL相关问题
-
进程间通信:
我说的广播机制:结合项目说一下
蓝牙实例化一个BroadCastReceiver对象,接受来自框架层的广播,并进行处理,触发上层的回调传至View层,做出响应
进程间通信相关
-
Handler机制
Handler,Message,looper和MessageQueue构成了安卓的消息机制,handler创建后可以通过sendMessage将消息加入消息队列,然后looper不断的将消息从MessageQueue中取出来,回调到Hander的handleMessage方法,从而实现线程的通信。
从两种情况来说,第一在UI线程创建Handler,此时我们不需要手动开启looper,因为在应用启动时,在ActivityThread的main方法中就创建了一个当前主线程的looper,并开启了消息队列,消息队列是一个无限循环,为什么无限循环不会ANR?因为可以说,应用的整个生命周期就是运行在这个消息循环中的,安卓是由事件驱动的,Looper.loop不断的接收处理事件,每一个点击触摸或者Activity每一个生命周期都是在Looper.loop的控制之下的,looper.loop一旦结束,应用程序的生命周期也就结束了。我们可以想想什么情况下会发生ANR,第一,事件没有得到处理,第二,事件正在处理,但是没有及时完成,而对事件进行处理的就是looper,所以只能说事件的处理如果阻塞会导致ANR,而不能说looper的无限循环会ANR
另一种情况就是在子线程创建Handler,此时由于这个线程中没有默认开启的消息队列,所以我们需要手动调用looper.prepare(),并通过looper.loop开启消息
主线程Looper从消息队列读取消息,当读完所有消息时,主线程阻塞。子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。因此loop的循环并不会对CPU性能有过多的消耗。
Handler的使用理解
handler使用:
Service的用法
handler设置wifi 10s 更新一次
Handler postdelay实现蓝牙每隔30s扫描
-
ANR
ANR
-
内存泄漏:handler
内存泄漏
-
内存溢出
内存泄漏
-
java/Android垃圾回收机制
垃圾回收机制
网络协议
-
Tcp 三次握手,四次挥手
三次握手建立连接
-
第一次握手:客户端向服务器发送一个带有SYN(Synchronize)标志的数据包,用来请求建立连接。这个数据包中包含客户端的初始序列号(Seq),即客户端从哪个序列号开始发送数据。此时,客户端进入SYN_SEND状态。
-
第二次握手:服务器收到客户端的SYN数据包后,回复一个SYN+ACK(同步应答)数据包,表示同意建立连接。在这个数据包中,服务器将自己的初始序列号Seq设置为服务器选择的初始序列号,并将客户端的序列号加1作为应答号(Ack=X+1),以告诉客户端它已经成功接收到客户端的请求。此时,服务器进入SYN_RECEIVED状态。
-
第三次握手:客户端收到服务器的SYN+ACK数据包后,发送一个确认数据包ACK,表示自己已经接收到服务器的应答,并且确认序列号为服务器的序列号加1。此时,客户端和服务器之间的连接就正式建立起来了,双方可以进入数据传输状态。客户端进入ESTABLISHED状态,服务器也同样进入ESTABLISHED状态。
四次挥手关闭连接
四次挥手(Four-Way Handshake)是TCP协议中用于关闭一个连接的过程。由于TCP连接是全双工的,意味着数据可以在两个方向上同时传输,因此每个方向上的连接关闭需要单独处理。四次挥手确保了双方都能正确地结束会话,避免任何一方的数据丢失。以下是四次挥手的具体步骤:
-
第一次挥手:主动关闭方(可以是客户端或服务器端,取决于谁先发起关闭请求)发送一个带有FIN(Finish)标志的TCP段给被动关闭方,表示自己已经没有数据要发送了,但是仍然可以接收对方的数据。此时,主动关闭方进入FIN_WAIT_1状态。
-
第二次挥手:被动关闭方收到FIN后,会向主动关闭方回复一个ACK(Acknowledgment),确认序号为收到的FIN段的序号加1。这表明被动关闭方已知晓主动关闭方将要终止连接,但它可能还有未发送完的数据或者未确认的数据需要处理。此时,主动关闭方进入FIN_WAIT_2状态,而被动关闭方则进入CLOSE_WAIT状态。
-
第三次挥手:当被动关闭方准备好关闭自己的连接时(即完成了所有数据的发送和确认),它会发送一个FIN标志给主动关闭方,以请求关闭从它到主动关闭方方向的连接。这时,被动关闭方进入LAST_ACK状态。
-
第四次挥手:主动关闭方收到FIN后,必须发送一个ACK给被动关闭方进行确认,并且设置确认序号为收到的FIN段的序号加1。之后,主动关闭方进入TIME_WAIT状态,等待一段足够长的时间(通常是2倍的最大报文生存时间MSL,Maximum Segment Lifetime),以确保被动关闭方收到了这个确认信号并关闭连接。一旦这个时间段过去,如果没有收到更多的数据,则主动关闭方也正式关闭连接。
-
TCP/UDP区别:
TCP
关键特性
-
面向连接:在数据传输之前,TCP需要通过三次握手建立一个连接,保证双方都准备好进行通信。
-
可靠性:TCP通过序列号和确认应答机制确保数据包按正确的顺序到达接收方,并且没有丢失或损坏。如果发送方在规定时间内没有收到确认信息,则会重新发送数据包。
-
流量控制:采用滑动窗口机制来实现流量控制,防止发送方发送的数据量超出接收方处理能力,从而避免接收缓冲区溢出。
-
拥塞控制:TCP实现了多种算法来应对网络拥塞问题,如慢启动、拥塞避免、快速重传和快速恢复等,以适应网络状况调整发送速率。
-
错误检测与纠正:每个TCP段都包含校验和字段,用于检测数据是否在传输过程中发生了错误。如果发现错误,该段将被丢弃并请求重发。
-
有序交付:即使接收到的数据包顺序混乱,TCP也会根据序列号对它们进行排序,然后按照正确的顺序提交给上层应用程序。
-
全双工通信:支持双向同时发送数据。
TCP适用于那些对数据准确性要求较高的应用场景,例如:
-
文件传输(FTP)
-
邮件传输(SMTP, POP3, IMAP)
-
Web浏览(HTTP/HTTPS)
总之,TCP是一种非常重要的协议,它保证了互联网上的数据传输既高效又可靠,是现代网络通信的基础之一。
UDP协议
UDP(User Datagram Protocol,用户数据报协议)是互联网协议族中的一种无连接的传输层协议。与TCP(Transmission Control Protocol,传输控制协议)不同,UDP不提供可靠的数据传输服务,也不保证数据包的顺序到达。然而,正因为缺少这些额外的功能,UDP具有更低的延迟和更高的效率,适用于那些对实时性要求较高、能够容忍一定程度的数据丢失的应用场景。
UDP的主要特点
-
无连接:在通信之前,UDP不需要建立连接,直接发送数据报即可。
-
不可靠传输:UDP不对数据报进行确认,也不会重传丢失的数据报。如果网络状况不佳导致数据丢失或损坏,UDP不会采取任何措施来恢复。
-
无序传递:接收方收到的数据报可能与发送方发送的顺序不同,UDP不负责对数据报进行排序。
-
头部开销小:UDP头部仅包含源端口、目的端口、长度和校验和四个字段,总共8个字节,比TCP的头部要小得多。
-
支持广播和多播:UDP支持向多个接收者同时发送消息,适合用于实现广播或多播应用。
使用场景
由于其特性,UDP通常用于以下场景:
-
实时应用:如语音通话、视频会议等,这类应用更关注于数据传输的及时性而非完整性,少量的数据丢失是可以接受的。
-
在线游戏:需要快速响应的游戏可以利用UDP的低延迟特性,即使偶尔丢失一些更新信息也不会严重影响游戏体验。
-
域名系统(DNS):DNS查询通常使用UDP,因为请求和响应都很简短,并且期望得到快速响应。
-
流媒体服务:对于播放连续的音频或视频内容来说,稍微丢弃几个数据包远不如等待重新传输重要。
项目/个人:
做什么工作?
技术难点?
有印象的一些问题?
项目架构?
相关文章:
安卓车载app面经
java部分 常见集合类 List 继承了Collection接口的一个接口,List中的数据是有序的,可重复的 实现类 在Java中,List 是一个接口,它属于 Java Collections Framework 的一部分。List 接口代表了一个有序的集合(有时…...
JAVA SE :认识数组
目录 1.概念 2.数组的创建和初始化 2.1 创建 2.2 初始化 3.数组的使用 4.认识引用数据类型 4.1 JVM的内存分布 4.2 基本数据类型和引用数据类型 4.3 null的认识 5.二维数组 6.Arrays类的了解和使用 1.概念 数组用于存储一定数量相同类型的数据,可以看…...
深入理解机器学习之TF-IDF:文本特征提取的核心技术
文章目录 引言一、什么是TF-IDF?二、TF-IDF的数学原理1. 词频(TF)计算2. 逆文档频率(IDF)计算3. TF-IDF计算 三、TF-IDF的Python实现1.数据文件介绍2.导入库3.读取数据4.数据预处理5.对单词进行排序6.全部代码 四、结语 引言 在自然语言处理(NLP)和文本挖掘领域&am…...
Anaconda Jupyter 默认启动位置修改
Anaconda Jupyter 默认启动位置修改 本篇给大家分享的事关于Anaconda Jupyter的保存路径修改方法。 我们使用Anaconda Jupyter默认启动时,通常会跳转进入C盘的用户目录下,如下图所示。 但是很多时候我们使用 Jupyter 的场景并不在C盘,因为它…...
CNG汽车加气站操作工备考真题及答案解析【判断题】
1、燃气经营许可证按照燃气经营规模和类别实行分级审批。(√) 解析:不同规模和类别的燃气经营,其许可证审批级别不同,以确保经营活动的规范和安全。 2、依照《安全生产法》的规定,安全生产监督检查人员对检…...
es 3期 第27节-运用Script脚本实现复杂需求
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
智能监控视频聚合平台,GB28181/RTSP/SIP/RTMP直播会议融合方案
全场景智能监控聚合平台:打破边界,赋能高效协同 在数字化转型加速的今天,海量视频监控设备、多样化的编码协议与复杂的业务场景,让企业面临跨系统整合难、资源调度效率低、协作响应慢等痛点。我们的智能监控聚合平台以技术创新为…...
B494:开关电源领域的PWM控制新星
在电子技术飞速发展的今天,高效的电源管理系统成为各类电子设备稳定运行的关键。B494电压驱动型脉宽调制(PWM)控制集成电路以其卓越的性能和丰富的功能,成为开关电源设计领域的焦点。 一、B494:开关电源领域的PWM控制…...
03 相机标定图像采集
学完本文,您将获取一下技能: 1:如何提升标定质量,如选择标定板,标定图像采集的注意事项, 2:实现标定图像自动筛选的代码 3:量产场景如何通过一张图像来标定相机 为了实现良好的标定效果,以下因素在标定数据采集前必须设置得当。 标定板选择 标定板尺寸准确材料平…...
详解Spark executor
在 Apache Spark 中,Executor(执行器) 是运行在集群工作节点(Worker Node)上的进程,负责执行具体的计算任务并管理数据。它是 Spark 分布式计算的核心组件之一,直接决定了任务的并行度和资源利用…...
约束文件SDC常用命令
约束文件SDC常用命令 定义时钟create_clock -name CLK-period 2 [get_ports_clk]告诉工具主时钟周期是2ns(频率500MHz),从clk端口输入 输入信号延迟set_input_delay 0.5 -clock CLK [get_ports data_in]数据进芯片前,外部电路已消耗0.5ns,综合要预留这段“堵车时间”。 输出…...
流量分析2
一,webshell流量 [GKCTF 2021]签到 先看协议分级,大部分是tcp,里面有http的基于的行文本数据占了很大的比重,看看里面有什么 过滤http的流量 点击一条流量,里面的内容进去后面有基于行的文本数据, 先解he…...
23种设计模式-组合(Composite)设计模式
组合设计模式 🚩什么是组合设计模式?🚩组合设计模式的特点🚩组合设计模式的结构🚩组合设计模式的优缺点🚩组合设计模式的Java实现🚩代码总结🚩总结 🚩什么是组合设计模式…...
数据库概述
文章目录 数据库1、什么是数据库?2、数据库的分类关系型数据库非关系型数据库优缺点 3、MySQL数据库的安装和使用3.1 卸载3.2 安装命令行操作 4、 Navicat For MySQL连接MySQL新建数据库新建表在表中添加数据执行SQL语句 数据库 1、什么是数据库? 数据…...
C# System.Text.Encoding 使用详解
总目录 前言 在C#编程中,处理字符串和字节数组之间的转换是一个常见的任务。System.Text.Encoding类及其派生类提供了丰富的功能,帮助开发者实现不同字符编码之间的转换。本文将详细讲解System.Text.Encoding类的使用方法,包括常用编码的介绍…...
js 对象深拷贝的五种方法
js 对象深拷贝 今天遇到一个bug ,子组件页面修改了内容,但是按了取消保存按钮,没有将数据传回父组件的,但是父组件的数据改了,原因是通过子组件接受父组件的参数对象层级深没有做深拷贝的原因。 在 JavaScript 中&…...
1.1 计算机网络的概念
首先来看什么是计算机网络,关于计算机网络的定义并没有一个统一的标准,不同的教材有 不同的说法(这是王道书对于计算机网络的定义),我们可以结合自己的生活经验去体会这个 定义。 可以用不同类型的设备去连接计算机网络…...
当EFISH-SBC-RK3576遇上区块链:物联网安全与可信数据网络
在工业物联网场景中,设备身份伪造与数据篡改是核心安全隐患。EFISH-SBC-RK3576 通过 硬件安全模块 区块链链上验证,实现设备身份可信锚定与数据全生命周期加密,安全性能提升10倍以上。 1. 安全架构:从芯片到链的端到端防…...
k8s 基础知识:Service + 负载均衡(下)
但凡觉得哪块说有问题,欢迎评论区留言探讨,谢谢 K8s Service 是 Kubernetes 集群中用于暴露应用程序的一种资源对象: 一、概念与作用: Service 可以将一组具有相同功能的 Pod(容器组)定义为一个逻辑分组…...
deepseek(2)——deepseek 关键技术
1 Multi-Head Latent Attention (MLA) MLA的核心在于通过低秩联合压缩来减少注意力键(keys)和值(values)在推理过程中的缓存,从而提高推理效率: c t K V W D K V h t c_t^{KV} W^{DKV}h_t ctKVWDKVht…...
机器学习之条件概率
1. 引言 概率模型在机器学习中广泛应用于数据分析、模式识别和推理任务。本文将调研几种重要的概率模型,包括EM算法、MCMC、朴素贝叶斯、贝叶斯网络、概率图模型(CRF、HMM)以及最大熵模型,介绍其基本原理、算法流程、应用场景及优势。 2. EM算法(Expectation-Maximizati…...
第四天 文件操作(文本/CSV/JSON) - 异常处理机制 - 练习:日志文件分析器
Python文件操作与异常处理完全指南:从入门到实战 一、为什么要学习文件操作和异常处理? 在Python编程的初级阶段,我们主要处理内存中的数据。但当我们需要: 永久保存数据处理各种格式的数据文件分析系统日志构建数据处理管道 …...
多onnx模型导出合并调研(文本检测+方向分类+文本识别)
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! 多onnx模型合并导出调研(文本检测+方向分类+文本识别) 引言1,尝试合并两个模型(文本方向分类+文本识别模型)(并行合并)(1)文本方向分类(2)文本识别模型(…...
linux scp复制多层级文件夹到另一服务器免密及脚本配置
文章目录 生成 SSH 密钥对将公钥复制到目标服务器验证免密登录scp 多级文件夹复制脚本 生成 SSH 密钥对 在本地机器上,使用 ssh-keygen 命令生成 SSH 密钥对。打开终端并执行以下命令: ssh-keygen -t rsa 按提示连续按回车键,默认会在 ~/.ss…...
Ubuntu 22.04 安装向日葵远程控制
1. 前言 由于公司客户的服务器用是图形化桌面,所以我们需要一个远程控制工具来控制服务器,目前市面上两款比较热门的控制软件就是ToDesk和向日葵了,我们今天就来学习一下向日葵的使用 2. 下载软件 前往向日葵官网下载 向日葵远程控制app官…...
Spring Boot(十七):集成和使用Redis
Redis(Remote Dictionary Server,远程字典服务器)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Spring Boot 中集成和使用Redis主要涉及以下几个步骤: 添加依赖 在项目的pom.xml文件中添加Redis的依赖。Spring Boot提供了对Redis的集…...
Redisson - 分布式锁和同步器
文章目录 锁(Lock)公平锁(Fair Lock)联锁(MultiLock)红锁(RedLock) 【已废弃】读写锁(ReadWriteLock)信号量(Semaphore)可过期许可信号…...
LabVIEW时间触发协议
介绍了基于LabVIEW开发的时间触发协议应用,通过实例解析了FlexRay总线的设计与优化。通过技术细节、系统构建和功能实现等方面,探讨了LabVIEW在现代工业通信系统中的应用效能,特别是在提高通信可靠性和实时性方面的贡献。 项目背景 在工…...
IDEA的使用
idea的介绍 IntelliJ IDEA 是由 JetBrains 公司开发的一款功能强大的集成开发环境(IDE),主要用于Java语言的开发,但同时也支持其他多种编程语言如Kotlin、Groovy、Scala等。它被广泛认为是专业软件开发者的首选工具之一ÿ…...
unity一个图片的物体,会有透明的效果
如图 想要去掉这个透明效果 选择一个高层级的layer即可。...
IP报文格式
IPv4 头部结构(共 20 字节,不含可选字段) 1. 版本(Version) 长度:4 比特 作用:标识 IP 协议版本(IPv4 值为 4,IPv6 值为 6)。 示例:0100&#x…...
2025最新-智慧小区物业管理系统
目录 1. 项目概述 2. 技术栈 3. 功能模块 3.1 管理员端 3.1.1 核心业务处理模块 3.1.2 基础信息模块 3.1.3 数据统计分析模块 3.2 业主端 5. 系统架构 5.1 前端架构 5.2 后端架构 5.3 数据交互流程 6. 部署说明 6.1 环境要求 6.2 部署步骤 7. 使用说明 7.1 管…...
sql结尾加刷题
找了一下mysql对extractvalue()、updatexml()函数的官方介绍https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html#function_extractvalue ExtractValue(xml_frag, xpath_expr) 知识点 解释一下这两个参数xml_frag,是xml标记片段,第二个参数…...
UE4学习笔记 FPS游戏制作26 UE中的UI
文章目录 几个概念创建一个UI蓝图添加UI获取UI的引用 切换设计器和UI蓝图将UI添加到游戏场景锚点轴点slotSizeToContent三种UI数据更新方式函数绑定属性绑定事件绑定 九宫格分割图片 几个概念 UMG:UE的UI编辑器 slate UI: UE的UI的编辑语言 创建一个UI蓝图 右键用…...
pnpm 依赖升级终极指南:从语义化版本控制到 Monorepo 全局更新的企业级实践
要使用 pnpm 更新所有依赖包,可以通过以下命令实现: 1. 更新所有依赖到符合语义化版本的范围 pnpm update该命令会根据 package.json 中定义的版本范围(如 ^1.0.0 或 ~2.3.4)更新依赖包到最新兼容版本,但不会突破版本…...
C++:类和对象(二)
目录 const成员函数 1. 基本语法 2. const 成员函数的作用 (1) 保证对象不被修改 (2) 提高代码安全性 (3) 支持 const 对象 3. 示例 (1) 基本用法 (2) const 对象只能调用 const 成员函数 (3) mutable 成员变量 4. const 成员函数的重载 初始化列表 基本语法 为什…...
【Django】教程-2-前端-目录结构介绍
【Django】教程-1-安装创建项目目录结构介绍 3. 前端文件配置 3.1 目录介绍 在app下创建static文件夹, 是根据setting中的配置来的 STATIC_URL ‘static/’ templates目录,编写HTML模板(含有模板语法,继承,{% static ‘xx’ …...
2025年渗透测试面试题总结-某快手-安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 快手-安全工程师 一、Linux提权技术:Dirty Cow漏洞深度解析 1.1 漏洞技术原理 1.2 漏洞影…...
数据结构之栈
目录 1 简介 2 栈的基本概念 3 代码实现 4 代码解析(部分) 4.1 初始化栈 4.2 入栈 4.3 出栈 4.4 只读获取栈顶元素(peek) 4.5 判断是否为空 4.6 获取栈大小 4.7 十进制转换为二进制 5 核心操作分析 6 总结 1 简介 栈…...
【AndroidRTC-10】webrtc是如何确定双端的编解码类型?
Android-RTC系列软重启,改变以往细读源代码的方式 改为 带上实际问题分析代码。增加实用性,方便形成肌肉记忆。同时不分种类、不分难易程度,在线征集问题切入点。 问题:webrtc-android是如何确定编解码类型,如何调整视…...
深度求索(DeepSeek):以AI之力重塑医疗未来
目录 一、智能诊断:打破医疗认知的“分辨率极限” 二、药物研发:重构分子世界的“造物逻辑” 三、医疗资源重构:打造分级诊疗的“神经中枢” 四、健康管理:编织个体化医学的“防护网” 五、伦理与进化:构建医疗AI…...
【HTML 基础教程】HTML 属性
HTML 属性 属性是 HTML 元素提供的附加信息。 属性通常出现在 HTML 标签的开始标签中,用于定义元素的行为、样式、内容或其他特性。 属性总是以 name"value" 的形式写在标签内,name 是属性的名称,value 是属性的值。 HTML 属性 …...
macOS 制作dmg磁盘映像安装包
制作dmg磁盘影像安装包需要准备一下材料: 1. 导出的APP 2. 背景图片 3. 应用程序替身 前两种材料很容易得到。 下面介绍一下 应用程序替身制作过程: Finder —> 选中 应用程序 --> 找到顶部菜单栏中 的 前往 ----> 选择上层文件夹选中应用程…...
Appium中元素定位之一组元素定位API
应用场景 和定位一个元素相同,但如果想要批量的获取某个相同特征的元素,使用定位一组元素的方式更加方便 在 Appium 中定位一组元素的 API 与定位单个元素的 API 类似,但它们返回的是一个元素列表(List<MobileElement>&am…...
webstorm中element-ui标签无法跳转源码
原本用的webstorm2019,之前的项目开发时切实体验过跳转element-ui源码,觉得很香。 更新了webstorm至2024,居然不行了,能弹出来提示,但就是找不到定义。 不知道是不是2024版本的问题,node_moudles不管我是否手动添加exc…...
【蓝桥杯】算法笔记1
1.暴力枚举 给定一个正整数n,请找出所有满足a + b = n的整数对(a, b),其中a和b都是正整数,且a ≤ b。 输入格式:一个正整数n (1 ≤ n ≤ 10⁶) 输出格式:所有符合条件的(a, b)对,每行一对,按a的升序排列。如果没有符合条件的对,输出"No solution"。 问题分…...
Pytorch学习笔记(十一)Learning PyTorch - What is torch.nn really
这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 What is torch.nn really? 部分。主要是教你如何一步一步将最原始的代码进行重构至pytorch标准的代码,如果你已经熟悉了如何使用原始代码以及pytorch标准形式构建模型,可以跳过这一篇。 …...
OpenGL ES 2.0与OpenGL ES 3.1的区别
如果硬件支持且需要更高质量的图形效果,推荐3.1;如果兼容性和开发简便更重要,且效果需求不高,2.0更合适。不过现代车载系统可能越来越多支持3.x版本,所以可能倾向于使用3.1,但具体情况还需调查目标平台的硬…...
【Unity3D脚本与系统设计6】鼠标触摸超时待机实现
实现步骤 在Unity中实现一个功能,当鼠标或触摸超过一定时间没有操作时,自动返回待机界面。 检测输入 首先,我需要检测用户的输入,无论是鼠标还是触摸。Unity的Input系统可以检测到鼠标和触摸事件,比如Input.GetAxis…...
SpringMVC 入门教程
一、SpringMVC 简介 SpringMVC 是基于 MVC 设计模式的轻量级 Web 框架,核心功能包括: 请求分发:通过 DispatcherServlet 统一处理请求。注解驱动:使用 Controller、RequestMapping 简化开发。视图解析:支持 JSP、Thy…...