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

Android面试必问:Handler、Bitmap、线程,面试官一听回答都懵了

Handler,线程,Bitmap 这三个,在 Android 面试中,几乎每一轮都会被问到的,今天,让我们一起来看一下,面试中常见的面试题

Handler

1、谈谈消息机制Handler作用 ?有哪些要素 ?流程是怎样的 ?

参考回答:负责跨线程通信,这是因为在主线程不能做耗时操作,而子线程不能更新UI,所以当子线程中进行耗时操作后需要更新UI时,通过Handler将有关UI的操作切换到主线程中执行。

具体分为四大要素:

  • Message(消息):需要被传递的消息,消息分为硬件产生的消息(如按钮、触摸)和软件生成的消息。
  • MessageQueue(消息队列):负责消息的存储与管理,负责管理由 Handler发送过来的Message。读取会自动删除消息,单链表维护,插入和删除上有优势。在其next()方法中会无限循环,不断判断是否有消息,有就返回这条消息并移除。
  • Handler(消息处理器):负责Message的发送及处理。主要向消息池发送各种消息事件(Handler.sendMessage())和处理相应消息事件(Handler.handleMessage()),按照先进先出执行,内部使用的是单链表的结构。
  • Looper(消息池):负责关联线程以及消息的分发,在该线程下从 MessageQueue获取 Message,分发给Handler,Looper创建的时候会创建一个 MessageQueue,调用loop()方法的时候消息循环开始,其中会不断调用messageQueue的next()方法,当有消息就处理,否则阻塞在messageQueue的next()方法中。当Looper的quit()被调用的时候会调用messageQueue的quit(),此时next()会返回null,然后loop()方法也就跟着退出。

具体流程如下:

在主线程创建的时候会创建一个Looper,同时也会在在Looper内部创建一个消息队列。而在创键Handler的时候取出当前线程的Looper,并通过该Looper对象获得消息队列,然后Handler在子线程中通过
MessageQueue.enqueueMessage在消息队列中添加一条Message。

通过Looper.loop() 开启消息循环不断轮询调用 MessageQueue.next(),取得对应的Message并且通过Handler.dispatchMessage传递给Handler,最终调用Handler.handlerMessage处理消息。

2、一个线程能否创建多个Handler,Handler跟Looper之间的对应关系 ?

参考回答:一个Thread只能有一个Looper,一个MessageQueen,可以有多个Handler。

以一个线程为基准,他们的数量级关系是:Thread(1) : Looper(1) : MessageQueue(1) : Handler(N)。

3、软引用跟弱引用的区别

参考回答:

  • 软引用(SoftReference):如果一个对象只具有软引用,则内存空间充足时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以一直被程序使用。
  • 弱引用(WeakReference):如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
  • 两者之间根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候,通常不被回收。

4、Handler 引起的内存泄露原因以及最佳解决方案

泄露原因:Handler 允许我们发送延时消息,如果在延时期间用户关闭了 Activity,那么该 Activity 会泄露。这个泄露是因为 Message 会持有 Handler,而又因为 Java 的特性,内部类会持有外部类,使得 Activity 会被 Handler 持有,这样最终就导致 Activity 泄露。

解决方案:将 Handler 定义成静态的内部类,在内部持有Activity的弱引用,并在Acitivity的onDestroy()中调用
handler.removeCallbacksAndMessages(null)及时移除所有消息。

5、为什么系统不建议在子线程访问UI?

参考回答:Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态。

这时你可能会问为何系统不对UI控件的访问加上锁机制呢?因为:

  • 加锁机制会让UI访问逻辑变的复杂
  • 加锁机制会降低UI的访问效率,因为加锁会阻塞某些线程的执行

6、Looper死循环为什么不会导致应用卡死?

参考回答:

  • 主线程的主要方法就是消息循环,一旦退出消息循环,那么你的应用也就退出了,Looer.loop()方法可能会引起主线程的阻塞,但只要它的消息循环没有被阻塞,能一直处理事件就不会产生ANR异常。
  • 造成ANR的不是主线程阻塞,而是主线程的Looper消息处理过程发生了任务阻塞,无法响应手势操作,不能及时刷新UI。
  • 阻塞与程序无响应没有必然关系,虽然主线程在没有消息可处理的时候是阻塞的,但是只要保证有消息的时候能够立刻处理,程序是不会无响应的。

7、使用Handler的postDealy后消息队列会有什么变化?

参考回答:如果队列中只有这个消息,那么消息不会被发送,而是计算到时唤醒的时间,先将Looper阻塞,到时间就唤醒它。但如果此时要加入新消息,该消息队列的对头跟delay时间相比更长,则插入到头部,按照触发时间进行排序,队头的时间最小、队尾的时间最大。

8、可以在子线程直接new一个Handler吗?怎么做?

参考回答:不可以,因为在主线程中,Activity内部包含一个Looper对象,它会自动管理Looper,处理子线程中发送过来的消息。而对于子线程而言,没有任何对象帮助我们维护Looper对象,所以需要我们自己手动维护。所以要在子线程开启Handler要先创建Looper,并开启Looper循环

9、Message可以如何创建?哪种效果更好,为什么?

参考回答:可以通过三种方法创建:

  • 直接生成实例Message m = new Message
  • 通过Message m = Message.obtain
  • 通过Message m = mHandler.obtainMessage()

后两者效果更好,因为Android默认的消息池中消息数量是10,而后两者是直接在消息池中取出一个Message实例,这样做就可以避免多生成Message实例。

10、 什么是异步消息,同步屏障?

这个这里就不展开阐述了,留给大家自己五查,印象可能会更深刻。

线程

1、线程池的好处?四种线程池的使用场景,线程池的几个参数的理解?

使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或则“过度切换”的问题,归纳总结就是:

  • 重用存在的线程,减少对象创建、消亡的开销,性能佳。
  • 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
  • 提供定时执行、定期执行、单线程、并发数控制等功能。

Android中的线程池都是直接或间接通过配置ThreadPoolExecutor来实现不同特性的线程池.Android中最常见的类具有不同特性的线程池分别为:

newCachedThreadPool: 只有非核心线程,最大线程数非常大,所有线程都活动时会为新任务创建新线程,否则会利用空闲线程 ( 60s空闲时间,过了就会被回收,所以线程池中有0个线程的可能 )来处理任务.

  • 优点:任何任务都会被立即执行(任务队列SynchronousQuue相当于一个空集合);比较适合执行大量的耗时较少的任务.

newFixedThreadPool: 只有核心线程,并且数量固定的,所有线程都活动时,因为队列没有限制大小,新任务会等待执行,当线程池空闲时不会释放工作线程,还会占用一定的系统资源。

  • 优点:更快的响应外界请求

newScheduledThreadPool: 核心线程数固定,非核心线程(闲着没活干会被立即回收数)没有限制.

  • 优点:执行定时任务以及有固定周期的重复任务

newSingleThreadExecutor: 只有一个核心线程,确保所有的任务都在同一线程中按序完成

  • 优点:不需要处理线程同步的问题

通过源码可以了解到上面的四种线程池实际上还是利用 ThreadPoolExecutor 类实现的

2、Android中还了解哪些方便线程切换的类?

参考回答:

  • AsyncTask:底层封装了线程池和Handler,便于执行后台任务以及在子线程中进行UI操作。
  • HandlerThread:一种具有消息循环的线程,其内部可使用Handler。
  • IntentService:是一种异步、会自动停止的服务,内部采用HandlerThread。

3、讲讲AsyncTask的原理:

AsyncTask中有两个线程池(SerialExecutor和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler),其中线程池SerialExecutor用于任务的排队,而线程池THREAD_POOL_EXECUTOR用于真正地执行任务,InternalHandler用于将执行环境从线程池切换到主线程。

sHandler是一个静态的Handler对象,为了能够将执行环境切换到主线程,这就要求sHandler这个对象必须在主线程创建。由于静态成员会在加载类的时候进行初始化,因此这就变相要求AsyncTask的类必须在主线程中加载,否则同一个进程中的AsyncTask都将无法正常工作。

4、IntentService有什么用 ?

IntentService可用于执行后台耗时的任务,当任务执行完成后会自动停止,同时由于IntentService是服务的原因,不同于普通Service,IntentService可自动创建子线程来执行任务,这导致它的优先级比单纯的线程要高,不容易被系统杀死,所以IntentService比较适合执行一些高优先级的后台任务。

5、直接在Activity中创建一个thread跟在service中创建一个thread之间的区别?

在Activity中被创建:该Thread的就是为这个Activity服务的,完成这个特定的Activity交代的任务,主动通知该Activity一些消息和事件,Activity销毁后,该Thread也没有存活的意义了。

在Service中被创建:这是保证最长生命周期的Thread的唯一方式,只要整个Service不退出,Thread就可以一直在后台执行,一般在Service的onCreate()中创建,在onDestroy()中销毁。所以,在Service中创建的Thread,适合长期执行一些独立于APP的后台任务,比较常见的就是:在Service中保持与服务器端的长连接。

6、ThreadPoolExecutor的工作策略 ?

ThreadPoolExecutor执行任务时会遵循如下规则:

  • 如果线程池中的线程数量未达到核心线程的数量,那么会直接启动一个核心线程来执行任务。
  • 如果线程池中的线程数量已经达到或则超过核心线程的数量,那么任务会被插入任务队列中排队等待执行。
  • 如果在第2点无法将任务插入到任务队列中,这往往是由于任务队列已满,这个时候如果在线程数量未达到线程池规定的最大值,那么会立刻启动一个非核心线程来执行任务。
  • 如果第3点中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor会调用RejectedExecutionHandler的rejectedExecution方法来通知调用者。

7、Handler、Thread和HandlerThread的差别?

参考回答:

Handler:在android中负责发送和处理消息,通过它可以实现其他支线线程与主线程之间的消息通讯。

Thread:Java进程中执行运算的最小单位,亦即执行处理机调度的基本单位。某一进程中一路单独运行的程序。

HandlerThread:一个继承自Thread的类HandlerThread,Android中没有对Java中的Thread进行任何封装,而是提供了一个继承自Thread的类HandlerThread类,这个类对Java的Thread做了很多便利的封装。HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它在内部直接实现了Looper的实现,这是Handler消息机制必不可少的。有了自己的looper,可以让我们在自己的线程中分发和处理消息。如果不用HandlerThread的话,需要手动去调用Looper.prepare()和Looper.loop()这些方法。

8、ThreadLocal的原理:

ThreadLocal是一个关于创建线程局部变量的类。使用场景如下所示:

  • 实现单个线程单例以及单个线程上下文信息存储,比如交易id等。
  • 实现线程安全,非线程安全的对象使用ThreadLocal之后就会变得线程安全,因为每个线程都会有一个对应的实例。承载一些线程相关的数据,避免在方法中来回传递参数。

当需要使用多线程时,有个变量恰巧不需要共享,此时就不必使用synchronized这么麻烦的关键字来锁住,每个线程都相当于在堆内存中开辟一个空间,线程中带有对共享变量的缓冲区,通过缓冲区将堆内存中的共享变量进行读取和操作,ThreadLocal相当于线程内的内存,一个局部变量。每次可以对线程自身的数据读取和操作,并不需要通过缓冲区与 主内存中的变量进行交互。并不会像synchronized那样修改主内存的数据,再将主内存的数据复制到线程内的工作内存。ThreadLocal可以让线程独占资源,存储于线程内部,避免线程堵塞造成CPU吞吐下降。

在每个Thread中包含一个ThreadLocalMap,ThreadLocalMap的key是ThreadLocal的对象,value是独享数据。

9、多线程是否一定会高效(优缺点)

多线程的优点:

  • 方便高效的内存共享 - 多进程下内存共享比较不便,且会抵消掉多进程编程的好处
  • 较轻的上下文切换开销 - 不用切换地址空间,不用更改CR3寄存器,不用清空TLB
  • 线程上的任务执行完后自动销毁

多线程的缺点:

  • 开启线程需要占用一定的内存空间(默认情况下,每一个线程都占512KB)
  • 如果开启大量的线程,会占用大量的内存空间,降低程序的性能
  • 线程越多,cpu在调用线程上的开销就越大
  • 程序设计更加复杂,比如线程间的通信、多线程的数据共享

综上得出,多线程不一定能提高效率,在内存空间紧张的情况下反而是一种负担,因此在日常开发中,应尽量:

  • 不要频繁创建,销毁线程,使用线程池
  • 减少线程间同步和通信(最为关键)
  • 避免需要频繁共享写的数据
  • 合理安排共享数据结构,避免伪共享(false sharing)
  • 使用非阻塞数据结构/算法
  • 避免可能产生可伸缩性问题的系统调用(比如mmap)
  • 避免产生大量缺页异常,尽量使用Huge Page
  • 可以的话使用用户态轻量级线程代替内核线程

10、多线程中,让你做一个单例,你会怎么做?

多线程中建立单例模式考虑的因素有很多,比如线程安全 -延迟加载-代码安全:如防止序列化攻击,防止反射攻击(防止反射进行私有方法调用) -性能因素

实现方法有多种,饿汉,懒汉(线程安全,线程非安全),双重检查(DCL),内部类,以及枚举

11、除了notify还有什么方式可以唤醒线程?

参考回答:当一个拥有Object锁的线程调用 wait()方法时,就会使当前线程加入object.wait 等待队列中,并且释放当前占用的Object锁,这样其他线程就有机会获取这个Object锁,获得Object锁的线程调用notify()方法,就能在Object.wait 等待队列中随机唤醒一个线程(该唤醒是随机的与加入的顺序无关,优先级高的被唤醒概率会高)

如果调用notifyAll()方法就唤醒全部的线程。注意:调用notify()方法后并不会立即释放object锁,会等待该线程执行完毕后释放Object锁。

12、什么是ANR ? 什么情况会出现ANR ?如何避免 ?在不看代码的情况下如何快速定位出现ANR问题所在 ?

  • ANR(Application Not Responding,应用无响应):当操作在一段时间内系统无法处理时,会在系统层面会弹出ANR对话框
  • 产生ANR可能是因为5s内无响应用户输入事件、10s内未结束BroadcastReceiver、20s内未结束Service
  • 想要避免ANR就不要在主线程做耗时操作,而是通过开子线程,方法比如继承Thread或实现Runnable接口、使用AsyncTask、IntentService、HandlerThread等

Bitmap

1、Bitmap使用需要注意哪些问题 ?

选择合适的图片规格(bitmap类型):通常我们优化Bitmap时,当需要做性能优化或者防止OOM,我们通常会使用RGB_565,因为ALPHA_8只有透明度,显示一般图片没有意义,Bitmap.Config.ARGB_4444显示图片不清楚,Bitmap.Config.ARGB_8888占用内存最多。:

  • ALPHA_8 每个像素占用1byte内存
  • ARGB_4444 每个像素占用2byte内存
  • ARGB_8888 每个像素占用4byte内存(默认)
  • RGB_565 每个像素占用2byte内存

降低采样率:BitmapFactory.Options 参数inSampleSize的使用,先把
options.inJustDecodeBounds设为true,只是去读取图片的大小,在拿到图片的大小之后和要显示的大小做比较通过calculateInSampleSize()函数计算inSampleSize的具体值,得到值之后。options.inJustDecodeBounds设为false读图片资源。

复用内存:即通过软引用(内存不够的时候才会回收掉),复用内存块,不需要再重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。

使用recycle()方法及时回收内存。

压缩图片

2、Bitmap.recycle()会立即回收么?什么时候会回收?如果没有地方使用这个Bitmap,为什么垃圾回收不会直接回收?

  • 通过源码可以了解到,加载Bitmap到内存里以后,是包含两部分内存区域的。简单的说,一部分是Java部分的,一部分是C部分的。这个Bitmap对象是由Java部分分配的,不用的时候系统就会自动回收了
  • 但是那个对应的C可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。所以需要调用recycle()方法来释放C部分的内存
  • bitmap.recycle()方法用于回收该Bitmap所占用的内存,接着将bitmap置空,最后使用System.gc()调用一下系统的垃圾回收器进行回收,调用System.gc()并不能保证立即开始进行回收过程,而只是为了加快回收的到来。

3、一张Bitmap所占内存以及内存占用的计算?

参考回答:Bitamp 所占内存大小 = 宽度像素 x (inTargetDensity / inDensity) x 高度像素 x (inTargetDensity / inDensity)x 一个像素所占的内存字节大小

注: 这里inDensity表示目标图片的dpi(放在哪个资源文件夹下),inTargetDensity表示目标屏幕的dpi,所以你可以发现inDensity和inTargetDensity会对Bitmap的宽高进行拉伸,进而改变Bitmap占用内存的大小。

在Bitmap里有两个获取内存占用大小的方法。

  • getByteCount():API12 加入,代表存储 Bitmap 的像素需要的最少内存。
  • getAllocationByteCount():API19 加入,代表在内存中为 Bitmap 分配的内存大小,代替了 getByteCount() 方法。
  • 在不复用 Bitmap 时,getByteCount() 和 getAllocationByteCount 返回的结果是一样的。在通过复用 Bitmap 来解码图片时,那么 getByteCount() 表示新解码图片占用内存的大 小,getAllocationByteCount() 表示被复用 Bitmap 真实占用的内存大小

4、Android中缓存更新策略 ?

Android的缓存更新策略没有统一的标准,一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作,但不管是内存缓存还是存储设备缓存,它们的缓存容量是有限制的,因此删除一些旧缓存并添加新缓存,如何定义缓存的新旧这就是一种策略,不同的策略就对应着不同的缓存算法

比如可以简单地根据文件的最后修改时间来定义缓存的新旧,当缓存满时就将最后修改时间较早的缓存移除,这就是一种缓存算法,但不算很完美

5、LRU的原理 ?

参考回答:为减少流量消耗,可采用缓存策略。常用的缓存算法是LRU(Least Recently Used):当缓存满时, 会优先淘汰那些近期最少使用的缓存对象。主要是两种方式:

  • LruCache(内存缓存):LruCache类是一个线程安全的泛型类:内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,并提供get和put方法来完成缓存的获取和添加操作,当缓存满时会移除较早使用的缓存对象,再添加新的缓存对象。
  • DiskLruCache(磁盘缓存):通过将缓存对象写入文件系统从而实现缓存效果

最后

在这里再分享一份由多位大佬亲自收录整理的Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料

这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来面试取得一份不错的答卷。

当然,你也可以拿去查漏补缺,提升自身的竞争力。

如果你有需要的话,只需 点击这里快速免费获取

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

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

QT大作业:学生管理系统(通过mysql数据库)

一、前言 学校实验室进行第二轮考核,第二次qt作业是学生管理系统。 要求如下: 1、连接数据库,对学生信息进行增删改查操作,可以使用qt的SQLITE,但大家需自行学习sql语句的语法才能实现相关功能(建议使用MY…...

三种方法安装CUDA--看出你是【入门】算法工程师还是【高级】算法工程师

三种方法安装CUDA–看出你是【入门】算法工程师还是【高级】算法工程师 文章目录 三种方法安装CUDA--看出你是【入门】算法工程师还是【高级】算法工程师0 微信交流群:1 前言:2 显卡驱动安装3 CUDA9.2卸载2.1 10.0及之前2.2 cuda10.1及之后2.3 pwd2.4 卸载2.5 清除残留2.6 验…...

Java岗大厂面试官常问的那些问题,涨姿势!

前言 分布式,是程序员必备技能之一,在面试过程中属于必备类的,在工作中更是会经常用到。而Kafka是一个分布式的基于发布订阅的消息队列,目前它的魅力是无穷的,对于Kafka的奥秘,还需要我们细细去探寻。 要…...

[HDU2520]我是菜鸟,我怕谁(每日一题5.30)

题目链接&#xff1a;Problem - 2520 (hdu.edu.cn) 乍一看这个题&#xff0c;发现不就是匀加速直线运动么&#xff0c;于是写出了如下的代码&#xff1a; #include <iostream>using namespace std;int d(int t);int main() {int T;cin >> T;while(T--){int t;cin …...

初步理解类加载运行机制和类加载过程,全套教学资料

一道面试题 让我们开门见山&#xff0c;直面主题&#xff1a;Dubbo 服务里面有个服务端&#xff0c;还有个消费端你知道吧&#xff1f; 服务端和消费端都各有一个线程池你知道吧&#xff1f; 那么面试题来了&#xff1a;一般情况下&#xff0c;服务提供者比服务消费者多吧。…...

每日一题 错选择 及 编程题 周总结(五)

目录Day1错选择星际密码数根Day2错选择变态跳台阶快到碗里来Day3错选择不用加减乘除做加法三角形Day4错选择奇数位上都是奇数或者偶数位上都是偶数猴子分桃Day5错选择求正整数组的最小不可组成和有假币Day6错选择最难的问题因子个数Day1 错选择 在单处理器系统中&#xff0c;如…...

第二讲:基本飞行姿态

四旋翼在其四个轴臂上四个桨的高速转动作用下&#xff0c;会受到四个桨的拉力&#xff0c;拉力方向与机身垂直&#xff0c;当四个桨产生的拉力总和大于机身重力时&#xff0c;飞机处于上升状态&#xff1b;当总拉力小于机身重力时&#xff0c;飞机处于下降状态&#xff1b;当总…...

小程序单页面应用,解决跳转10层问题

文章目录问题背景解决思路需要解决的问题内容实现初始页面布局自定义导航头控制页面显隐左滑回退子组件上拉加载问题&#xff08;父组件调用子组件方法&#xff09;存在问题问题背景 小程序存在10层爆栈问题&#xff0c;在开发中因为流程过长&#xff0c;且存在其他页面跳转当…...

MySQL索引用法实例分析

建议看原文&#xff1a;https://www.jb51.net/article/88846.htm 这篇文章主要介绍了MySQL索引用法,结合实例形式较为详细的分析了mysql索引的功能、定义、使用方法与相关注意事项,需要的朋友可以参考下 本文实例分析了MySQL索引用法。分享给大家供大家参考&#xff0c;具体如下…...

必看!LuatOS自定义C库全新教程,一文极速上手

今天继续讲LuatOS的开发&#xff0c;上一期简单说了一下如何移植LuatOS&#xff0c;相信很多朋友已经看过了。那么今天&#xff0c;我就开始讲C和Lua调用的部分教程。 LuatOS相关资料及Lua语言的官方定义&#xff0c;详见以下链接&#xff1a; LuatOS仓库&#xff1a; https:/…...

Xshell 连接不上Linux Centos 7的解决方法之设置静态IP

前序 最近在开发项目&#xff0c;需要在服务器部署数据库、ftp文件管理等相关内容时&#xff0c;为了方便操作&#xff0c;使用Xshell会话管理工具进行服务器操作。出现连不上服务器网络的问题&#xff0c;就所遇问题进行学习解决方案及总结记录。 配置虚拟机网络 1.在虚拟机…...

boost::geometry::tag用法的测试程序

boost::geometry::tag用法的测试程序 实现功能C++实现代码实现功能 boost::geometry::tag用法的测试程序 C++实现代码 #include <geometry_test_common.hpp> #include <boost/type_traits/is_same.hpp> #include <boost/geometry/core/tag.hpp>...

ann2snn的代码分析

首先&#xff0c;主函数是if_cnn_mnist_work.py 1.输出snn测试结果的就是这么一些代码&#xff1a; utils.pytorch_ann2snn(model_namemodel_name,norm_tensornorm_tensor,test_data_loadertest_data_loader,devicedevice,TT,log_dirlog_dir,configconfig)2.ctrl鼠标左键点击py…...

基于域名访问网站1(作业)

搭建一个基于http://www.zuoye.com:22222访问的web网站&#xff0c;网站首页在/www/http/&#xff0c;内容为zuoye 结果 过程&#xff1a; 创建网页的根目录&#xff0c;并编辑网页内容为zuoye 编辑/etc/httpd/conf.d/zuoye.conf 关闭防火墙 关闭selinux 重启httpd 编辑/…...

虚拟内存和地址空间

目录 一、物理内存vs虚拟内存 二、物理内存空间和虚拟内存空间 三、32bit的地址空间 四、cpu位宽和cpu地址总线宽 五、虚拟内存地址空间划分 六、虚拟地址和物理地址的映射 早期的计算机程序都是直接跑在物理内存上的&#xff0c;这就要求程序大小不能超过物理内存的上限…...

macbook Maven 下载 解压 配置 使用

文章目录下载 && 解压配置文件修改环境变量配置使用测试下载 && 解压 在官网&#xff1a;http://maven.apache.org/download.cgi 下载 https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip 解压到指定目录(我是~/j…...

HttpClient请求Https证书问题解决

本地使用HttpClient请求https时没有问题&#xff0c;但是放到服务器上&#xff0c;运行出现报错&#xff0c;出现异常为&#xff1a; javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.ce…...

STM32CubMx自学笔记(一)-LED灯翻转

STM32CubMX自学笔记&#xff08;一&#xff09;---LED灯翻转工程创建系统具体配置工程代码编写下载验证结语工程创建 首先得安装STM32CubMx软件。具体安装步骤参照 保姆级安装步骤&#xff0c;这里将不再赘述&#xff0c;第一节主要是介绍新工程的创建&#xff0c;首先在桌面打…...

十四、Python第十四课——文件和异常

&#xff08;请先看这篇文章&#xff1a;https://blog.csdn.net/GenuineMonster/article/details/104495419&#xff09; 如果看完这篇博文&#xff0c;你的问题还是没有解决&#xff0c;那么请关注我的公众号&#xff0c;后台发消息给我吧&#xff0c;当天回复&#x…...

LeetCode: 523. 连续的子数组和

给你一个整数数组 nums 和一个整数 k &#xff0c;编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组&#xff1a; 子数组大小 至少为 2 &#xff0c;且 子数组元素总和为 k 的倍数。 如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …...

macbook Maven 下载 解压 配置 使用

文章目录下载 && 解压配置文件修改环境变量配置使用测试下载 && 解压 在官网&#xff1a;http://maven.apache.org/download.cgi 下载 https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip 解压到指定目录(我是~/j…...

jvm 类加载器

类加载器是JVM执行类加载机制的前提 q : 类加载器的主要作用是什么 ? 加载全部的class文件, 将class信息的二进制数据流读入JVM内部classLoader在整个装在阶段, 之影响类的加载阶段, 不影响链接和初始化类的加载器分类 : 显示加载 vs 隐式加载 显示加载 : Class.forName…...

基于SSM框架的图书管理系统的设计与实现毕业论文+选题表+任务书+开题报告+外文翻译及原文+答辩PPT+项目源码及数据库+运行说明

下载地址&#xff1a;https://download.csdn.net/download/qq_31293575/18340399 摘 要 随着网络技术的发展、计算机应用水平的提高的扩大&#xff0c;原来系统的时效性、数据的正确性、操作的方便性上都存在不足&#xff0c;已影响到系统的正常使用。经过考察比较&#xff…...

R最基础操作

OLS一元回归&#xff08;GPA on act&#xff09;伍德里奇案例2.3 #data input gpac(2.8,3.4,3.0,3.5,3.6,3.0,2.7,3.7)#读入数据&#xff1a;GPA因变量 actc(21,24,26,27,29,25,25,30)#读入数据&#xff1a;自变量 student1:8#生成1到8编号 datacbind(student,gpa,act)#按列合…...

boost::geometry::tag用法的测试程序

boost::geometry::tag用法的测试程序 实现功能C++实现代码实现功能 boost::geometry::tag用法的测试程序 C++实现代码 #include <geometry_test_common.hpp> #include <boost/type_traits/is_same.hpp> #include <boost/geometry/core/tag.hpp>...

kubenetes入门之升级pod镜像

1.简介 当一个pod部署之后,镜像有新的版本,希望滚动升级pod,使用新版本镜像 2.配置镜像拉取策略 spec:containers:- image: xxxxxximagePullPolicy: Alwaysname: macroverse-webports: 配置镜像拉取策略为Always 3.设置新的镜像版本 kubectl set image deployment/<dep…...

网页数据的获取----相关的Python库

目录 网页数据获取的相关库request库beautifulsoup4库 正文 网页数据获取的相关库 Python语言提供了许多与URL和网页处理相关的库&#xff0c;使得Python非常适合网页链接和网页处理。常用的与URL和网页处理相关的库有requests、beautifulsoup4库。 requests库能够获取网页…...

据说MD5加密很安全,真的是么?

首先我们要了解一下MD5&#xff08;只需要了解简单的特点&#xff0c;至于实现过程不必深究&#xff09; MD5即Message-Digest Algorithm 5&#xff08;信息-摘要算法5&#xff09;&#xff0c;用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一&#xff08;又译摘要算…...

完美解决error: command ‘C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe‘ failed

完美解决error: command C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe failed with exit status 1 【win10安装detectron2】 本人的编译环境&#xff1a; pytorhc&#xff1a;1.8.1cu111 cuda11.0 首先下载https://github.com/facebookresearc…...

计算机网络-学习总结篇

计算机网络 前情&#xff1a;由于本人目前的学习要求&#xff0c;重点分析了网络层、传输层、应用层&#xff0c;物理层和数据链路层都是点到为止 参看&#xff1a; 计算机网络-自顶向下&#xff08;2015版&#xff09;学堂在线-计算机网络&#xff08;华南理工大学-袁华&#…...

php日程提醒,php日程控件

日历控件&#xff0c;可以在此基础上做更多的扩展&#xff0c;如实现行程安排等日历控件.rili {margin: 30px 0px;overflow: hidden;text-align: center;color: #666}.low_calendar {overflow: hidden;border: 1px solid #c8d2dc;}.low_calendar h1 {width: 100%;background: #…...

debug - 用Procmon记录目标程序启动后的操作

文章目录debug - 用Procmon记录目标程序启动后的操作概述笔记备注ENDdebug - 用Procmon记录目标程序启动后的操作 概述 想看看 D:\Cadence\SPB_17.4\tools\bin\Capture.exe 开始页中的recent projects 从哪里读的. 想用Procmon记录Capture.exe启动后的动作, 再记录成文本日志…...

贪心算法-寻找硬币

问题&#xff1a;贪心算法-寻找硬币 题目描述 现有价值分别为:1 3 5 10的硬币若干。请用最少的硬币数量找出n(n<100000000)元钱。输入 一个数字&#xff0c;表示要找出的钱的数量输出 一个数字&#xff0c;表示需要多少硬币样例输入 14样例输出 3 1 #include<stdio.h>…...

递归--题目:利用递归方法求5!。

#include<stdio.h> int main() {int f(int x);int s;sf(5);printf("5!%d\n",s);return 0; } int f(int x) {int sum;if(x0)sum1;elsesumx*f(x-1);return sum; }...

递归方法求数组元素中的最大值

递归方法求数组元素中的最大值 下面展示一些 内联代码片。 // 用递归 方法求下列数组中的最大值 int a[]{1,2,3,4,5,6,7};script //用递归函数实现 #include <stdio.h> int Max(int a[],int L,int R)//L表示数座第一个元素&#xff0c;R表示数组最后一个元素 {if(a[L]a…...

利用递归方法求10!

题目&#xff1a;利用递归方法求10!。 程序分析&#xff1a;递归公式&#xff1a;fnfn_1*4! public class Prog22{public static void main(String[] args){System.out.println(fact(10));}//递归求阶乘private static long fact(int n){if(n1)return 1;elsereturn fact(n-1)…...

Java题-利用递归方法求5!

题目&#xff1a;利用递归方法求5!。 程序分析&#xff1a;递归公式&#xff1a;fnfn_1*4! 方法一&#xff1a; import java.util.Scanner; public class Ex22 { public static void main(String[] args) {Scanner s new Scanner(System.in);int n s.nextInt();Ex22 tfr n…...

react 树形结构递归方法

react 树形结构递归方法## 标题 typescriptconst renderTreeNodes (data) > {const arr [];let obj ;const newArr [];let newObj ;data.forEach(tree > {const tmp { ...tree };const { id, title } tree;if (tmp.children) {tmp.children renderTreeNodes(tmp.…...

使用递归方法计算斐波那契数列详解

斐波那契数列&#xff1a;1、1、2、3、5、8、13、21.。。。。。。 首先观察数列&#xff0c;得出规律&#xff1a;f(n)f(n-1)f&#xff08;n-2&#xff09;&#xff0c;n为位数&#xff1b; 其次&#xff0c;定义一个feibonaqie类&#xff0c;构造出方法&#xff0c;由题目易…...

递归方法实现全排列(C语言)

全排列呢就是我们在数学中学的将一组数字或者是字母的所有排列方式计算出来的数学工具。 比如&#xff0c;ABCD这四个字母随机取三个字母的全排列就有24种之多。那么&#xff0c;我们如何用程序来实现他呢&#xff1f; 我们来探讨一下这个问题的手工过程&#xff1a; 无非就是在…...

22、利用递归方法求5!

22、利用递归方法求5!程序分析代码实现程序分析 递归算法&#xff08;英语&#xff1a;recursion algorithm&#xff09;在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。 递归算法——百度百科. 代码实现 定义无返回值的方法 public class Test…...

初识递归,使用递归方法求一个数组中的最大值

找一个数组的最大值&#xff0c;方法很多&#xff0c;也很简单&#xff0c;一般再定义一个变量就可以了&#xff0c;就像下面这串代码。 int []arrnew int [] {1,22,3,44,5,6,76,118,91};int maxarr[0];for(int i0;i<arr.length;i) {if(max<arr[i]) {maxarr[i];}}System.…...

采用递归和非递归方法求解汉诺塔问题

递归&#xff1a; &#xfeff;&#xfeff;#include<stdio.h> void move(int n, int x, int y){ printf("the %dth plate from %c to %c\n",n,x65,y65); } void hanoi(int n, int A, int B, int C){ if(n1) move(n,A,C); …...

用递归方法求n!

#include<stdio.h> int main() {int n,y;int fac(int n);printf("请输入需要阶乘的数字&#xff1a;\n");scanf("%d",&n);yfac(n);printf("%d!%d",n,y);return 0; } int fac(int n) {int f;if(n<0)printf("Date error!")…...

递归方法求幂运算

编写一个函数实现n^k&#xff0c;使用递归实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h>int Power(int a, int b) {//当幂等于0时&#xff0c;返回1if (b 0){return 1;}//当幂为1时&#xff0c;返回它本身if (b 1){return a;}…...

python递归算法解决兔子繁殖问题_经典生兔子问题——递归方法

例题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子。假如兔子都不死&#xff0c;要求输出一年内兔子的数量是多少。分析&#xff1a;该题是典型的斐波那契数列的一个实例应用。我们可以先把前几月…...

数组与递归方法

7.24学习心得 1.数组&#xff08;重点&#xff09; 数组也是一种类型&#xff0c;下标从0开始。可存储基本类型&#xff0c;也可以存储引用类型。数组中元素具有相同的数据类型。定义方式&#xff08;2种&#xff09;&#xff1a;type[] arrayName; &#xff08;常用&#xf…...

用递归方法求解组合问题

【问题描述】 求从1~n的正整数中取k&#xff08;k<n)个不重复整数的所有组合 【问题求解】 求解k个数的不同组合&#xff0c;我们可以用一维数组a[0]~a[k-1]来保存其中的一个结果&#xff0c;因为组合元素是不重复的&#xff0c;我们约定其递增排列。 设 f&#xff08;n,k)-…...

探讨递归方法后面的语句是否执行

进入正题之前&#xff0c;小编先稍微说一下什么是递归。递归就是在运行的过程中调用自己。递归需要有一个出口&#xff0c;如果无限递归是没有意义的&#xff0c;而且递归到一定程度&#xff0c;程序就会由于栈内存溢出导致程序报错。 我们先来看段代码&#xff1a;建议大家先思…...

Java方法递归

方法递归 1.什么是方法递归 ​ 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion)。递归做为一种算法在程序设计语言中广泛应用。 2.递归的形式 2.1直接递归&#xff1a;方法自己调用自己 2.2间接递归&#xff1a;方法调用别的方法&#xff0c;别的方法又回…...