自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

王温暖的博客

这货太懒了

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

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

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

2022-11-19 14:48:56 861

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

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

2022-11-19 12:27:55 1729

原创 面试:ThreadLocal相关

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

2022-11-19 12:24:08 1872

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

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

2022-11-17 17:29:04 507

原创 面试:recyclerview的优化方案

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

2022-11-17 14:53:29 541

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

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

2022-11-16 17:12:27 763

原创 面试:硬件加速相关

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

2022-11-14 21:38:50 514

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

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

2022-11-14 21:00:44 569

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

js native

2022-11-13 21:32:17 117

原创 面试: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 2449

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

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

2022-11-13 20:13:34 1233

原创 面试:Android gradle编译流程

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

2022-11-13 20:08:27 937

原创 面试: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 765

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

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

2022-11-13 17:15:14 260

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

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

2022-11-13 16:15:45 966

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

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

2022-11-13 15:53:38 425

原创 面试:Glide和Fresco的对比,自己设计图片加载框架

对于一般App来说,Glide完全够用,而对于图片需求比较大的App,为了防止加载大量图片导致OOM,Fresco 会更合适一些。并不是说用Glide会导致OOM,Glide默认用的内存缓存是LruCache,内存不会一直往上涨。Glide。

2022-11-13 14:06:55 1170

原创 面试:OkHttp相关

1、请求正常返回:网络获取到response并传递给下一级拦截器,然后没有其他情况 ,followUpRequest==null 就返回response;2、需要重定向:若返回需要重定向,也就是拿新的Request去获取Response,当然这里有一个最大重定向次数限制20次3、发生异常且需要恢复:①判断 OkHttpClient 是否支持失败重连的机制;如果不支持重连,就表示请求失败就失败了,不能再重试了;②协议错误、中断异常、SSL握手错误、certificate pinning错误。

2022-11-13 11:09:32 383

原创 面试:Android中的一些小问题随笔

死锁、锁定后操作异常导致锁没有释放、各种系统资源占用之后没有释放或者异常导致资源操作释放未执行、递归方法导致死循环,循环语句条件判断错误导致死循环、短时间内大量生成对象、大尺寸 Bitmap 并且没有办法回收导致内存溢出、主线程执行耗时操作或者上述错误操作在主线程执行导致超时、debug 模式下断点调试导致 ui 响应超时、在主线程调用第三方同步方法、native 方法,但由于第三方、native 调用时间超出预期导致无响应,所以对于自己不了解或者不可控的操作在工作线程调用比较好,保持 ui 主线程畅通。

2022-11-12 21:02:20 560

原创 面试:锁对比CountDownLatch、CyclicBarrier

是利用AQS的state来做计数器功能,当初始化时,会将state值进行初始化,让调用的awit时,会判断state计数器是否已经变为0,如果没有变为0则挂起当前线程,并加入到AQS的阻塞队列中,如果有线程调用了的countDown时,这时的操作是将state计数器进行减少1,每当减少操作时都会唤醒阻塞队列中的线程,线程会判断此时state计数器是否已经都执行完了,如果还没有执行完则继续挂起当前线程,直到state计数器清零或线程被中断为止。

2022-11-12 20:16:24 440

原创 面试:short最大值加1的结果

它的算法很简单:用最左边的一个二进制位表示数字的正负,0表示正数,1表示负数,我们把表示符号的这个二进制位叫做“符号位”,而剩余的二进制位表示数字本身。一部分人都会认为这段程序压根就无法通过编译,也有人认为,这段程序能够通过编译,但在运行时会抛出异常,但更多的人面对这道题目根本就无从下手。一、用补码表示出这个数的绝对值,之后把每个位上的数字(连同符号位上的数字在内)按位取反,所谓按位取反就是如果这个位上原来是0,那么就变成1,如果原来这个位上原来是1,那么就变成0。short类型占2个字节,16位。

2022-11-11 21:40:01 960

原创 面试:int和Integer值是否相等

integer实际是对象的引用,当new一个integer时,实际上是生成一个指针指向此对象,而int是直接存储数据值。false不相等,a和b的区别是,a是new生成的Integer变量,指向堆中新建的对象,b是非new生成的integer变量,指向Java常量池中的对象,两者在内存中地址不同。true相等,当包装类integer和基本数据对象int比较时,java会自动拆箱valueOf方法,实际上比较的就是两个int变量,只要值相等就相等。true相等,同上一组,根据integer的自动拆箱。

2022-11-11 20:34:11 3141 1

原创 面试:flow原理解析

利用扩展函数的性质,调用到flow的block进而调用了SafeCollector的emit,而这里的emit会调用到传进来的FlowCollector的emit,而传进来的emit函数被重写调用block,所以就会调用到collect的block。由于后一个操作符是前一个操作符返回的Flow对象的扩展方法,因此后一个操作符会持有前一个Flow对象的引用,因此可以通过调用上一个Flow对象的collect方法,触发上游Flow对象的执行。这样,通过扩展方法与返回对象的统一,实现了链式调用。

2022-11-11 20:15:23 288

原创 面试:dex文件结构

dex文件 - 简书浅谈 Android Dex 文件 dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。  当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,dex文件是传统jar文件大小的50%左右。  dex 文件可以分为3个模块,、、。头文件概况的描述了整个 dex 文件的分布,包括每一个索引区的大小跟偏移。索引区

2022-11-10 18:16:25 750

原创 面试:ANR相关---原因、源码、监控

需要注意的是,所有应用发生 ANR 的时候都会进行回调,因此需要做一些过滤与判断,如包名、进程号等。最大的困难是兼容性问题,这个方案受限于 Android 系统的 SELinux 机制,5.0 以后基本已经使低权限应用无法监听到 trace 文件了,但是可以在开发内测阶段通过 root 手机修改 app 对应的 te 文件提权进行监控。在 Message 消息分发前后,大部分的性能卡顿问题都是在这里发生的,监控这两个逻辑之间的时间差就可以得到当前主线程的卡顿状态,如果超时则获取 trace 信息并上报。

2022-11-10 16:23:50 643

原创 面试:Android的16ms、垂直同步、三重缓存

三者互不干扰,一切正常。不过,仔细琢磨图2却会发现一个新问题:图2中,CPU和GPU处理数据的速度似乎都能在16ms内完成,而且还有时间空余,也就是说,CPU/GPU的FPS(帧率,Frames Per Second)要高于Display的FPS。但是CPU/GPU写数据是不可控的,所以会出现buffer里有些数据根本没显示出来就被重写了,即buffer里的数据可能是来自不同的帧的, 当屏幕刷新时,此时它并不知道buffer的状态,因此从buffer抓取的帧并不是完整的一帧画面,即出现画面撕裂。

2022-11-10 14:57:39 395

原创 面试:Service及生命周期相关问题

Q1:Service的两种启动方式:1.startService2.bindService(有回调可以和activity进行通信)注意:在Android 5.0之后google出于安全的角度禁止了隐式声明Intent来启动Service,也禁止使用Intent filter,否则就会抛出异常 Q2:启动与停止Service两种方式第一种:通过startService()与stopService()启动和停止服务,Service与启动它的Activity无法进行通信和数据交换第二种:通过bindServi

2022-11-09 17:56:05 639

原创 面试:activity生命周期

整个 UI 绘制流程的知识点很多,仅靠以上简单一段文字肯定是无法完全概括的,感兴趣的读者可以自己去翻翻源码。对于系统来说,无论是手机还是 PC ,同一个时间一定只有一个处于前台,获取焦点,且可与用户交互的活动窗口,所以。中不建议进行重量级的耗时操作,因为在 Activity 跳转过程中,前一个 Activity 的。其实也很简单,类似 PC 的多窗口,Android 系统也是有多窗口模式的。是一个很短暂的过程,之后如果用户返回了之前的 Activity,则会回调。是真正进行 UI 绘制以及显示的地方。

2022-11-07 16:23:22 236

原创 面试:说说 HTTP1.0/1.1/2.0 的区别

浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个 TCP 连接引入了持久连接,即 TCP 连接默认不关闭,可以被多个请求复用在同一个 TCP 连接里面,客户端可以同时发送多个请求虽然允许复用 TCP 连接,但是同一个 TCP 连接里面,所有的数据通信是按次序进行的,服务器只有处理完一个请求,才会接着处理下一个请求。如果前面的处理特别慢,后面就会有许多请求排队等着新增了一些请求方法新增了一些请求头和响应头采用二进制格式而非文本格式。

2022-11-07 15:27:41 208

原创 面试:锁对比ReentrantLock、Synchronized

其原理大致为:当某一线程获取锁后,将state值+1,并记录下当前持有锁的线程,再有线程来获取锁时,判断这个线程与持有锁的线程是否是同一个线程,如果是,将state值再+1,如果不是,阻塞线程。方法比较特殊,当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。ReentrantLock是一种可重入的,可实现公平性的互斥锁,它的设计基于AQS框架,可重入和公平性的实现逻辑都不难理解,每重入一次,state就加1,当然在释放的时候,也得一层一层释放。

2022-11-05 18:04:31 743

原创 面试:List View和RecyclerView缓存策略对比

ListView二级缓存RecyclerView四级缓存【Android面试】Listview和Recyclerview的区别_Rose J的博客-CSDN博客_android listview和recyclerviewAndroid:ListView 和RecyclerView区别 - 夜空中最亮的盖子 - 博客园Android 实习生面试经历记录_code小生_的博客-CSDN博客。

2022-11-05 16:18:50 898

原创 面试:Sqlite的线程、进程安全性

对数据库的操作 (绝大部分) 会被打包成一个事务进行提交,需要注意的是,这里的打包成事务是自动开启的。但需要注意的是事务是非常耗时的,一般而言, SQLite 每秒能够轻松支持 50000 条的数据插入,但是每秒仅能够支持几十个事务。SQLite的并发性允许多个进程一次打开数据库文件,并允许多个进程一次读取数据库。我的应用是一个读(读完一条记录删一条),一个写,应该会触发sqlite的文件读写锁吧。多线程访问数据库的时候会出现这样的异常,Sqlite 自身是不支持多线程同时操作的。设计上就不是干这事的。

2022-11-04 10:19:33 1493

原创 面试:concurrentHashmap实际使用场景

binder的server端是一个线程池,可以接受多个客户端的请求,此时客户端如果同时请求修改server的变量时,需要线程同步操作,可以使用。例如某个页面或者操作可能是多个线程同时操作,要改变某一个变量的值时,可以使用。

2022-11-03 21:47:59 1874

原创 面试:Android多进程问题

在android中多进程是指一个应用中存在多个进程的情况。在Android中使用多进程只有一种方法,就是在AndroidMenifest中指定android:process属性。所谓的进程就是一个jvm虚拟机。jvm虚拟机讲内存分为四大区,其中方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2022-11-03 11:10:27 351

原创 面试:Android广播相关

Android中的广播可以跨进程甚至跨App直接通信,可能会收到其他app发送的相同的自定义广播,也可能被其他app收到并获取其中信息。发送自定义广播时,intent.setPackage(packageName)指定包名,这样此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。静态注册自定义广播时 android:exported="false" 属性设置false,不接收其他App内部发出的此广播。1.LocalBroadcast是APP内部维护的一套广播机制,有很高的安全性和高效性。

2022-11-03 10:33:23 722

原创 面试:fragment相关

viewModel是jetPack中一个非常好用的工具,假设您有一个 Fragment,在该 Fragment 中,用户从列表中选择一项,还有另一个 Fragment,用于显示选定项的内容。此外,这两个 Fragment 都必须处理另一个 Fragment 尚未创建或不可见的情况。这种方式在Android中非常普遍,这里也不详细的介绍了,一般就是在Activity中实现一个回调接口,然后将该接口注册到Fragment中,Fragment中就可以通过该接口与Activity通信了。

2022-11-02 18:14:41 179

原创 面试:死锁的条件以及解除方法

所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。

2022-11-02 17:01:48 1019

原创 面试:线程安全的集合

Vector和CopyOnWriteArrayList都是线程安全的List,底层都是数组实现的,Vector的每个方法都进行了加锁,而CopyOnWriteArrayList的读操作是不加锁的,因此CopyOnWriteArrayList的读性能远高于Vector,Vector每次扩容的大小都是原来数组大小的2倍,而CopyOnWriteArrayList不需要扩容,通过COW思想就能使数组容量满足要求。这样做的好处是,在高并发情况下,读取元素时就不用加锁,写数据时才加锁,大大提升了读取性能。

2022-11-02 16:37:22 4972

原创 面试:CAS算法原理

CAS:Compare and Swap,即比较再交换。jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。

2022-11-02 14:59:58 233

原创 面试:bundle传输相关

Bundle内部是由ArrayMap实现的,ArrayMap的内部实现是两个数组,一个int数组是存储对象数据对应下标,一个对象数组保存key和value,内部使用二分法对key进行排序,所以在添加、删除、查找数据的时候,都会使用二分法查找,只适合于小数据量操作,如果在数据量比较大的情况下,那么它的性能将退化。5、使⽤static,我在项⽬中使⽤的这种⽅式,个⼈觉得从原理上跟单例类似,static代码块是程序初始化的时候最先初始化的,位于常量池,相⽐⽽⾔是速度最快,效率最⾼的⽅式。那么如何解决这个问题呢?

2022-11-02 12:19:16 735

matjava1.8.rar

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

2021-09-14

PixelRulers.rar

PixelRulers.rar

2021-01-20

Windows环境下32位汇编语言

2016-06-09

登陆成功界面

登陆成功界面

2015-07-21

bootstrap首页制作

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

2015-07-21

空空如也

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

TA关注的人

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