自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

王温暖的博客

这货太懒了

  • 博客(649)
  • 资源 (6)
  • 收藏
  • 关注

原创 面试:时间复杂度

Hash Map:O(1),若发生hash碰撞,则可能需要进行遍历寻找,n个元素的情况下,链表时间复杂度为O(n)、红黑树为O(logn)ArrayMap二分查找时间复杂度 O(logn)

2022-11-27 17:24:42 1

原创 面试:static静态方法为什么不能被重写

当父类 Father 的引用 father 想要调用子类Son “重写” 的静态方法时,调用的是 Father 类中的静态方法,不会通过所指向的对象(Son类的对象)来调用,所以static修饰的方法没办法达到重写的目的。这是因为静态方法只能被继承,不能被重写,如果子类有和父类相同的静态方法,那么父类的静态方法将会被隐藏,对于子类不可见,也就是说,子类和父类中相同的静态方法是没有关系的方法,他们的行为不具有多态性。

2022-11-27 15:45:52

原创 面试:抽象类和接口

Java8 之后 在接口中可以使用default和static关键字来修饰接口中定义的普通方法}}}

2022-11-27 15:39:04 9

原创 面试:MVC、MVP、MVVM区别

Presenter中除了业务逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,造成Presenter比较笨重,维护起来会比较困难。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。为了解决MVC的缺点,MVP 框架被提出来。

2022-11-27 15:00:40 5

原创 面试:dumpsys meminfo 内存信息含义

【代码】面试:dumpsys meminfo 内存信息含义。

2022-11-25 15:28:53 174

原创 面试:binder、bundle传输的数据大小限制

虽然APP开发时候,Binder对程序员几乎不可见,但是作为Android的数据运输系统,Binder的影响是全面性的,所以有时候如果不了解Binder的一些限制,在出现问题的时候往往是没有任何头绪,比如在Activity之间传输BitMap的时候,如果Bitmap过大,就会引起问题,比如崩溃等,这其实就跟Binder传输数据大小的限制有关系,在上面的一次拷贝中分析过,mmap函数会为Binder数据传递映射一块连续的虚拟地址,这块虚拟内存空间其实是有大小限制的,不同的进程可能还不一样。

2022-11-25 14:16:22 39

原创 面试:SurfaceView 和 TextureView

Surface的渲染可以放到单独线程去做,渲染复杂的动画不会影响主线程的的响应。因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。

2022-11-24 22:38:34 286

原创 面试:Activity、Dialog、PopupWindow、Toast比较

代表着四种典型Window形式。对应的是WindowToken。对应一个自己的token,的Window类型也是。的Window类型是。的Window类型是。的Window类型是。

2022-11-24 22:25:30 110

原创 面试:Android卡顿监控方案

② 使用Epic hook框架,打印sendMessage、dispatchMessage之间的时间差。三种方案:① 继承handler,重写sendMessage、dispatchMessage。③ 打开一个线程,在printer开头和结束发送消息,监控消息执行时长,打印线程的堆栈信息。通过Choreographer.FrameCallback回调来实现帧率监控。

2022-11-23 13:52:47 37

原创 面试:Hprof文件的裁剪

Matrix方案裁剪的是HEAP_DUMP、HEAP_DUMP_SEGMENT里面的PRIMITIVE_ARRAY_DUMP段。该方案仅仅会保存字符串的数据以及重复的那一份Bitmap的buffer数据,其他基本类型数组会被剔除。

2022-11-22 22:22:17 116

原创 面试:Zygote通信为什么用Socket,而不是Binder?

虽然Init进程是先创建ServiceManager,后创建Zygote进程的。7. zygote功成身退,调用runSelectLoop(),随时待命,当接收到请求创建新进程请求时立即唤醒并执行相应工作。Linux中,fork进程是不推荐fork一个多线程的进程的,因为如果存在锁的情况下,会导致锁异常。而如果自身作为binder机制的接收者,就会创建一个额外的线程来进行处理(发送者进程是无影响的)。所以,如果使用binder机制,就会导致去fork一个多线程的进程,这是原因之二。注册时间点无法保证,

2022-11-22 21:56:12 26

原创 面试:系统启动流程简介

SystemServer是Android系统的一个核心进程,它是由zygote进程创建的,因此在android的启动过程中位于zygote之后。android的所有服务循环都是建立在 SystemServer之上的。在SystemServer中,将可以看到它建立了android中的大部分服务,并通过ServerManager的add_service方法把这些服务加入到了ServiceManager的svclist中。从而完成ServcieManager对服务的管理。

2022-11-22 21:46:34 144

原创 面试:Java中的指令重排以及引起的问题

单线程的重排序很简单,因为可以通过语义分析就能知道前后代码的依赖性,但是多线程就不一样了,多线程环境里编译器和CPU指令优化根本无法识别多个线程之间存在的数据依赖性,比如说下面的程序代码如果两个方法在l两个不同的线程里面调用就可能出现问题。编译器和处理指令也并非什么场景都会进行指令重排序的优化,而是会遵循一定的原则,只有在它们认为重排序后不会对程序结果产生影响的时候才会进行重排序的优化,如果重排序会改变程序的结果,那这样的性能优化显然是没有意义的。1属于编译器重排序,2和3属于处理器重排序。

2022-11-21 21:38:39 27

原创 面试:KOOM内存泄漏的监控

默认heapRatio的设置,会根据最大内存来调整设置更合理的值。当内存异常时,采集内存镜像、分析之后会生成一份json文件报告。自定义需求,配置KConfig设置需要的各项参数。Java-OOM报告获取。设置Uploader。

2022-11-21 18:05:47 356

原创 面试:Kotlin执行

由于等了20ms,会阻塞主线程执行,此时会优先执行协程中1,delay会阻塞协程,此时sleep 20ms执行完后会继续执行主线程3,sleep 2秒,协程会继续执行2,最后执行4。delay()函数是一个非阻塞式的挂起函数,它只会挂起当前协程,并不会影响其他协程的运行。sleep() 函数会阻塞当前的线程,这样运行在该线程下的所有协程都会被阻塞。因为需要启动协程,因此主线程中的3会先执行,然后执行协程中的1和2。delay:协程的延时是不会阻塞线程的,只会延时当前协程。sleep:阻塞线程。

2022-11-21 17:43:12 36

原创 面试:Fragment懒加载

以前处理 Fragment 的懒加载,我们通常会在 Fragment 中处理)这两个函数,而在 Androidx 模式下,我们可以使用的方式来处理 Fragment 的懒加载。

2022-11-21 09:41:10 101

原创 面试:HTTP缓存机制

强制缓存由,Exipres(HTTP1.0)控制。浏览器直接读本地缓存,不会再跟服务器端交互,状态码 200。协商缓存由/,Etag/实现,每次请求需要让服务器判断一下资源是否更新过,从而决定浏览器是否使用缓存,如果是,则返回 304,否则重新完整响应。

2022-11-20 22:29:05 16

原创 面试:HTTP 的长连接和短连接

SYN 洪水(半开连接攻击)是一种拒绝服务 (DDoS) 攻击,旨在耗尽可用服务器资源,致使服务器无法传输合法流量。通过重复发送初始连接请求 (SYN) 数据包,攻击者将可击垮目标服务器计算机上的所有可用端口,导致目标设备在响应合法流量时表现迟钝乃至全无响应。

2022-11-20 21:24:47 186

原创 java sleep yield join区别

Thread类的方法,必须带一个时间参数。,执行yield()的线程有可能在进入到可执行状态后马上又被执行,另外yield()方法只能使同优先级或者高优先级的线程得到执行机会,这也和sleep()方法不同。yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。调用yield方法只是一个建议,告诉线程调度器我的工作已经做的差不多了,可以让别的相同优先级的线程使用CPU了,没有任何机制保证采纳。

2022-11-20 18:02:16 196

原创 面试:类相关---Java、Android有哪些类加载器

类加载器(Class Loader):顾名思义,指的是可以加载类的工具。前面JVM类加载机制——类的生命周期加载、验证、准备、解析、初始化,而类加载器的任务是根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例,在虚拟机提供了3种类加载器,启动(Bootstrap)类加载器、扩展(Extension)类加载器、系统(System)类加载器(也称应用类加载器),下面分别介绍。

2022-11-20 16:58:05 291

原创 面试:线程池核心线程如何保持一直运行的

对于Java中 Thread 对象,同一个线程对象调用 start 方法后,会在执行完run 后走向终止(TERMINATED)状态,也就是说一个线程对象是不可以通过多次调用 start 方法重复执行 run 方法内容的。通过队列的 take 方法阻塞核心线程(Worker)的 run 方法从而保证核心线程不被销毁的,这样也就间接达到了核心线程数不会被回收的效果。如果没有设置 allowCoreThreadTimeOut 为 True, 以及当前线程池内线程数量不大于核心线程。

2022-11-19 20:07:04 466

原创 面试:外层ViewGroup为wrap,内层为match,如何测量

在测量期间,有child的LayoutParams.width为MATCH_PARENT,且LinearLayout的宽度测量规格不为EXACTLY。意味着child需要依赖父布局的宽度,但父布局此时宽度尚不明确。因此在LinearLayout设置完自身尺寸后,还会对这些child调用测量。例如本例中,父布局是LinearLayout宽度wrap_content,内部有两个TextView宽度match_parent,最终会以最宽的子view的宽度作为整个ViewGroup的宽度。

2022-11-19 18:07:01 8

原创 面试:内存划分及GC算法与种类

HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是说,每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的空间会被浪费。在标记阶段,通过根节点,标记所有从根节点开始的可达对象,因此没有被标记的就是没有被引用的垃圾对象,然后在清除阶段,清除所有没有被标记的对象。标记/整理算法不仅可以弥补标记/清除算法当中,内存区域分散的缺点,也消除了复制算法当中,内存减半的高额代价。的对象作为起始点,向下搜索走过的路径称为。空间是不连续的,这样内存的布局就会乱七八糟。

2022-11-19 17:08:30 352

原创 面试:常用的设计模式总结

Context(抽象构件):它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作。ContextImpl(具体构件):它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)。门面模式的定义:提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。在父类中定义好具体要执行的类的方法。

2022-11-19 16:05:26 218

原创 面试:关于static静态变量的问题

关于Android 使用静态变量,我遇到过的情况是:当应用不处于与当前用户交互的情况时(例如回到HOME,跳到其他应用),离开的时间比较长时,应用的静态变量有可能被置null, 是不保险的。由于 Android 具有相应的生命周期的特征,因此Android 程序不应该使用任何 static 变量,不应该并不是说不能,而是说使用static 变量很可能会导致bug。在Android中不应该使用static变量,static本身依赖进程模型,而Android力图屏蔽进程的细节。,使用static的场景一般是。

2022-11-19 14:48:56 381

原创 面试:java中的各种锁对比

自旋锁指的是当线程获取不到资源时,不是进入阻塞状态,而是让当前的线程不停地执行空循环,直到循环条件被其他线程改变,进入临界区。自旋锁:竞争锁的失败的线程,并不会真实的在操作系统层面挂起等待,而是JVM会让线程做 几个空循环(基于预测在不久的将来就能获得),在经过若干次循环后,如果可以获得锁,那么进入临界区,如果还不能获得锁,才会真实的将线程在操作系统层面进行挂起。

2022-11-19 12:27:55 160

原创 面试:ThreadLocal相关

ThreadLocal可以用来解决多线程程序的并发问题,ThreadLocal并不是一个Thread,而是Thread的局部变量,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。对 ThreadLocal 的操作见第 3 点,可以看到 ThreadLocal 每次 set 方法都是对同个 key(因为是同个 ThreadLocal 对象,所以 key 肯定都是一样的)进行操作。

2022-11-19 12:24:08 152

原创 面试:单例模式VS静态方法

如果你的单例类并没有保存任何状态性质的属性,而只是提供了一些公共方法,那么就应该考虑包含静态方法的类,因为 Java 在编译期的静态绑定特性,静态方法比单例类要快很多。但是请记住,在静态类中维护状态并不是一种推荐的做法,尤其是在并发执行的环境中,因为在多线程运行修改静态变量的状态时,如果不能正确地处理线程之间的关系,这可能会导致由于条件竞争而出现莫名其妙的问题。我之前说过,他们之间最本质的区别就是,一个代表对象,而另一个代表方法。当你需要一个具有面向对象特性的类的时候,就用单例模式;

2022-11-17 17:29:04 182

原创 面试:recyclerview的优化

cacheViews中的缓存只能position相同才可得用,且不会重新bindView,CacheViews满了后移除到RecyclerPool中,并重置ViewHolder,如果对于可能来回滑动的RecyclerView,把CacheViews的缓存数量设置大一些,可以减少bindView的时间,加快布局显示。此属性是用来告诉LayoutManager从RecyclerView分离时,是否要回收所有的item,如果项目中复用RecycledViewPool时,开启该功能会更好的实现复用。

2022-11-17 14:53:29 110

原创 面试:自定义view / viewgroup 相关问题

一:测量和布局阶段都是深度优先遍历,先执行子 View 再执行 ViewGroup 自身,而绘制是先执行 ViewGroup 绘制流程,再执行子 View 的绘制流程二:绘制流程涉及到其他硬件(GPU),启用硬件加速和关闭硬件加速方法走的是两条完全不同的路线ViewGroup 会先执行自己的 onDraw()方法执行绘图,之后才会执行第3步调用 dispatchDraw()方法通知子 View 执行绘制流程。

2022-11-16 17:12:27 286

原创 面试:硬件加速相关

对于 Android 来说,硬件加速有它专属的意思:在 Android 里,硬件加速专指把View中绘制的计算工作交给 GPU来处理。进一步地明确一下,这个绘制的计算工作指的就是把绘制方法中的那些 Canvas.drawXXX() 变成实际的像素。

2022-11-14 21:38:50 14

原创 面试:聊聊阻塞和非阻塞、协程非阻塞式挂起

前面有障碍物,你过不去(线程卡了)需要等障碍物清除后才能过去(耗时任务结束)除非你绕道而行(切到别的线程)「非阻塞式」这个是挂起的一个特点,协程的挂起,就是非阻塞式的,而不是传统的「阻塞式的挂起」。阻塞不阻塞,都是针对单线程讲的,切了线程,肯定是免谈的,你TM都跑到别的线程了,之前的线程就自由了,可以继续做别的事情了。「非阻塞式」的挂起就是协程在挂起的同时切线程这个概念。main {}}}

2022-11-14 21:00:44 258

原创 面试:JS和Java相互调用方法有哪些

js native

2022-11-13 21:32:17 37

原创 面试:Android 签名校验机制 v1、v2、v3

2. 对MAINFEST.MF整个文件做一次算法(数据摘要+Base64编码),存放到CERT.SF文件的头属性中,在对MAINFEST.MF文件中各个属性块做一次算法(数据摘要+Base64编码),存放到一个属性块中。:由于开发商可能通过使用相同的package name来混淆替换已经安装的程序,以此保证签名不同的包不被替换。2. 保证信息传输的完成性:签名对于包中的每个文件进行处理,以此确保包中内容不被替换。3. 对CERT.SF文件做签名,内容存档到CERT.RSA中。

2022-11-13 21:03:37 298

原创 面试:gradle添加自定义task

我们知道,Gradle 的构建流程是通过执行一系列的 Task 任务来完成的,每一个Task完成自己独特的工作之后,就根据Task的依赖关系,执行下一个 Task 任务。preBuild(开始构建之前执行的Task任务)->(合并资源文件的Task任务)->(生成debug包的任务)。如果想把自己写的Task也插入到构建流程中,在运行的时候自动执行我们的Task任务,又该如何做呢?明确自己的任务需要插入到哪个任务之后或者之前,接着找到这个任务,并把自己的任务插入到这个任务的前面或者后面。

2022-11-13 20:13:34 291

原创 面试:Android gradle编译流程

这里在总结下gradle的大体流程:1、开始build的时,会创建一个Gradle对象,这个对象是唯一的,全局共享;2、Gradle对象创建完后,接下来就是去怎么组合整个工程了,为了知道需要组合那些project,这时就需要去读取settings.gradle文件了,这时就会创建一个Settings对象,这个对象中就会包含组合工程所需的各个project,以及各个project的地址(其实就是在那个文件夹下),这个地址我们是可以修改的,具体怎么修改,下一遍再说;

2022-11-13 20:08:27 18

原创 面试:Android应用编译打包流程

打包生成 APK 文件,现在都已经通过 sdklib.jar 的 ApkBuilder 类进行打包了,输入为我们之前生成的包含 resources.arsc 的 .ap_ 文件,上一步生成的 dex 文件,以及其他资源如 jni、jar 包内的资源。有了 R.java 和 aidl 生成的 Java 文件,再加上工程的源代码,现在就可以使用 javac 进行正常的 java 编译生成 class 文件了。使用 dx/d8 工具将 class 文件转化为 dex 文件,生成常量池,消除冗余数据等。

2022-11-13 19:47:30 247

原创 面试:AOP实现方式总结

在运行前,目标加载前,将切面逻辑加到目标字节码中。可以考虑javassist来实现。Javassist 是一个编辑字节码的框架,可以让你很简单地操作字节码。它可以在运行期定义或修改Class。使用Javassist实现AOP的原理是在字节码加载前直接修改需要切入的方法。优点:可以对绝大部分类织入。缺点:如果用到了其他类加载器,则这些类将不被织入。

2022-11-13 17:15:14 16

原创 面试:TCP 滑动窗口(流量控制)、拥塞窗口

请注意,TCP的窗口单位是字节,不是报文段。无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。另,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。

2022-11-13 16:15:45 40

原创 面试:注解类型有哪些,如何自定义注解

自定义运行时注解分为两步:声明注解、解析注解。(1)声明注解}上面是自己定义了一个注解Animal,Animal含有一个int类型的属性,该属性的名称为value,默认值为5。该注解主要用来注解成员变量,作用于运行期。(2)解析注解try {System.out.println(animal.value()+"===岁===");}}}上面通过类的反射机制解析注解,先拿到TestMain类里面的age成员变量,再通过成员变量调用getAnnotation方法拿到该成员变量的注解。

2022-11-13 15:53:38 111

matjava1.8.rar

MAT旧版本可以用java1.8打开

2021-09-14

PixelRulers.rar

PixelRulers.rar

2021-01-20

0day安全:软件漏洞分析技术(第2版).pdf (部分章节)

0day安全:软件漏洞分析技术(第2版).pdf 部分章节 高清版

2016-10-05

Windows环境下32位汇编语言

2016-06-09

登陆成功界面

登陆成功界面

2015-07-21

bootstrap首页制作

bootstrap首页制作,酷炫效果,可以学习使用。

2015-07-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除