自定义博客皮肤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)
  • 收藏
  • 关注

原创 面试:by lazy和lateInit区别

lateinit 和 lazy 是 Kotlin 中的两种不同的延迟初始化的实现lateinit 只用于变量 var,而 lazy 只用于常量 vallazy 应用于单例模式(if-null-then-init-else-return),而且当且仅当变量被第一次调用的时候,委托方法才会执行。lateinit var只是让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化还需要开发者自己决定。  而by lazy真正做到了声明的同时也指定了延迟初始化时的行为,在属性被第...

2021-12-17 17:52:31 679

原创 面试:内部类为什么会持有外部类的引用

问题1:内部类为什么会持有外部类的引用这是因为内部类虽然和外部类写在同一个文件中,但是编译后还是会生成不同的class文件,其中内部类的构造函数中会传入外部类的实例,然后就可以通过this$0访问外部类的成员。其实也挺好理解的吧,因为在内部类中可以调用外部类的方法,变量等等,所以肯定会持有外部类的引用的。贴一段内部类在编译后用JD-GUI查看的class代码,也许你能更好的理解://原代码class InnerClassOutClass{ class InnerUser {

2021-12-17 17:13:16 3355

原创 面试:Handler内存泄露的原因是什么?

前言嗨,大家好,问大家一个“简单”的问题:Handler内存泄露的原因是什么?你会怎么答呢?这是错误的回答有的朋友看到这个题表示,就这?太简单了吧。"内部类持有了外部类的引用,也就是Hanlder持有了Activity的引用,从而导致无法被回收呗。"其实这样回答是错误的,或者说没回答到点子上。总结Handler内存泄露的原因是什么?1、原因一延迟消息Handler导致内存泄漏一般发生在发送延迟消息的时候,当Activity关闭之后,延迟消息还没发出,那么主线程中的

2021-12-17 17:08:40 2593 1

原创 面试:Kotlin 扩展函数实现原理分析

Kotlin 扩展函数实现原理分析Kotlin 的扩展函数非常的方便好用,支持给现有的java类增加函数,代码如下:fun String.hello(world : String) : String { return "hello " + world + this.length;}fun main(args: Array<String>) { System.out.println("abc".hello("world")); // 打印 hello worl

2021-12-16 21:52:55 562

原创 面试:LayoutInflater加载布局流程原理

在创建控件实例时,首先判断该控件是否为系统自带控件,如果是系统自带控件,则调用onCreateView方法,否则直接调用createView方法。确实如此,在createViewFromTag()方法的内部又会去调用createView()方法,然后使用反射的方式创建出View的实例并返回。可以看到,在第21行同样是createViewFromTag()方法来创建View的实例,然后还会在第24行递归调用rInflate()方法来查找这个View下的子元素,每次递归完成后则将这个View添加到父布局当中。

2021-12-16 12:59:48 684

原创 面试:ConstraintLayout约束性布局和RelativeLayout对比

首先看下测试结果,完全一样的两个布局的性能对比,使用trace检测:Android约束性布局ConstraintLayout性能真的比RelativeLayout高吗?-CSDN论坛ConstraintLayout的测试结果:RelativeLayout的测试结果:所以,我的结论就是RelativeLayout比ConstraintLayout高,why?不是说好的ConstraintLayout性能高吗,怎么回事呢?ConstraintLayout的优点:Constra.

2021-12-16 12:43:19 1103

原创 面试:如何侦测应用的帧率FPS

有两种常用方式360 ArgusAPM类实现方式: 监测Choreographer两次Vsync时间差 BlockCanary的实现方式:监测UI线程单条Message执行时间方案一:使用Choreographer的VSYNC回调依赖Choreographer VSYNC回调,具体实现如下:循环添加Choreographer.FrameCallbackChoreographer.getInstance().postFrameCallback(new Choreographer.FrameC

2021-12-16 12:32:48 805

原创 面试:java面向对象设计程序的6大原则

前言从面向过程到面向对象是软件设计诞生以来的迈出的最伟大的一步,使用面向对象设计,可以设计出优秀的软件,同样也可以设计出糟糕的软件。只有遵循一些特定的原则,才能设计出复用性高灵活性好的软件来。在运用面向对象的思想进行软件设计时,需要遵循的原则一共有6个,他们是:1. 单一职责原则(Single Responsibility Principle)2. 里氏替换原则(Liskov Substitution Principle)3. 依赖倒置原则(Dependence Inversion Pr

2021-12-16 10:26:09 294

转载 面试:Kotlin class、data class、object、companion object区别

一、data class:kotlin中的数据类,只保存一些数据字段,类似于java bean,oc中的model。写法:注意后面是() ,不是{}data class yourClassName( val name: String, val age: Int, val sex: Boolean)二、Class:class这个很简单。class MineActivity : AppCompatActivity() { val subName =

2021-12-16 09:32:27 738

原创 面试:Android数据库升级给表增加字段

一、升级数据库的方式升级数据库注意:修改数据库后,一定要记得增加数据库版本号 +1 . 否则不会走onUpgrade方法.最残暴的方法:@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists Book"); onCreate(db); } 直接删表, 数据全都没了.在正常的产品项

2021-12-16 09:17:13 2109

原创 面试:MediaPlayer相关

Surface展示视频图像的时候,是不会去主动保证和呈现出来的图像和原始图像的宽高比例是一致的,所以我们需要自己去设置展示视频的View的宽高,以保证视频图像展示出来的时候不会变形。* 再者,你没有给展示视频的view设置合适的大小,比如都设置wrap_content,或者都设置0,也会导致SurfaceHolder不能被创建,视频也就没有图像了。视频准备完成后,调用play进行播放视频,承载视频播放的View会是黑屏状态,我们只需要在播放前,给对应的Surface绘制一张图即可。

2021-12-15 22:54:12 498

原创 面试:LiveData的坑数据丢失问题

//主线程更新数据调用sampleLiveData.setValue(data);//子线程更新数据调用sampleLiveData.postValue(data);参考:Android开发把 LiveData 用于事件传递那些坑_chuhe1989的博客-CSDN博客_android livedata 混淆LiveData会造成数据丢失在我的前一篇文章中也提到过,大家也可以直接看源码。postValue 只是把传进来的数据先存到 mPendingData,然后往主线程抛一个 Run..

2021-12-15 20:17:09 4220 2

原创 面试:SpareArray的优缺点

SparseArray优势:1、避免了对key的自动装箱(int转为Integer类型)它内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value2、压缩的方式来表示稀疏数组的数据,从而节约内存空间。SparseArray比HashMap更省内存,在某些条件下性能更好,主要是因为它避免了对key的自动装箱(int转为Integer类型),它内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的

2021-12-14 22:00:29 630

原创 面试:APK安装的过程

主要步骤列出来:将apk文件复制到data/app目录 解析apk信息 dexopt操作 更新权限信息 完成安装,发送Intent.ACTION_PACKAGE_ADDED广播1. 将apk文件copy至data/app目录1.1 安装来源,包括adb,shell,all_user,然后向PMS的mHandler发送INIT_COPY的消息1.2handleStartCopy的核心就是copyApk,顺便进行存储空间检查,权限检查等等安全校验2 .解析apk信息完成ap..

2021-12-14 12:17:52 1568

原创 面试:如何保证ArrayList在多线程环境下的线程安全性

方式一:使用synchronized来同步所有的ArrayList操作方法方式二:Collections.synchronizedList()方法其实底层也是在集合的所有方法之上加上了synchronized方式三:CopyOnWriteListCopy On Write 也是一种重要的思想,在写少读多的场景下,为了保证集合的线程安全性,我们完全可以在当前线程中得到原始数据的一份拷贝,然后进行操作。JDK集合框架中为我们提供了 ArrayList 的这样一个实现:CopyOnWriteA

2021-12-13 21:41:44 1594

转载 面试:Handler.postDelayed()精确延迟指定时间的原理

使用handler发送消息时有两种方式,post(Runnable r)和post(Runnable r, long delayMillis)都是将指定Runnable(包装成PostMessage)加入到MessageQueue中,然后Looper不断从MessageQueue中读取Message进行处理。然而我在使用的时候就一直有一个疑问,类似Looper这种「轮询」的工作方式,如果在每次读取时判断时间,是无论如何都会有误差的。但是在测试中发现Delay的误差并没有大于我使用System.out.p

2021-12-13 20:37:31 2285

原创 Android面试:binder相关

写给 Android 应用工程师的 Binder 原理剖析 - 知乎

2021-12-13 17:49:49 1243

原创 面试:Rxjava线程切换原理

子线程切换主线程:给主线程所在的Handler发消息,然后就把逻辑切换过去了。主线程切换子线程:把任务放到线程池中执行就能把执行逻辑切换到子线程子线程切换子线程:把任务分别扔进两个线程就行了。

2021-12-13 12:36:11 3782

原创 面试:Rxjava线程调度使用

RxJava2线程调度使用:最简单易懂的RxJava2.0学习教程之RxJava2的线程调度(二)_简简单单_zz的博客-CSDN博客使用RxJava的时候,在没有切换线程的情况下, 上游==被观察者(observable)和下游==观察者(observer)是工作在同一个线程中的,即都在主线程中。话不多说上代码:Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Int

2021-12-13 12:06:21 1080

原创 面试:Activity之间传递大数据

方法一:将需要传递的数据写在临时文件或者数据库中,再跳转到另外一个组件的时候再去读取这些数据信息,这种处理方式会由于读写文件较为耗时导致程序运行效率较低;方法二:将需要传递的数据信息封装在一个静态的类中。方式二的代码:以后我们在要传递大数据时,则可以用DataHolder.setData(name, value)进行传递,然后在目标Activity中使用DataHolder.getData(name)进行获取。我们自定义了一个静态类DataHolder,并且设置setData和getData

2021-12-13 09:12:04 1423

原创 面试:java如何终止线程

停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作。在 Java 中有以下 3 种方法可以终止正在运行的线程:使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止。 使用 stop() 方法强行终止线程,但是不推荐使用这个方法,该方法已被弃用。 使用 interrupt 方法中断线程。1. 使用标志位终止线程在 run() 方法执行完毕后,该线程就终止了。但是在某些特殊的情况下,run() 方法会被一直执行;比如在服务端程序中可能会使用w.

2021-12-13 09:04:40 705

原创 面试:线程同步的几种方式

1、Synchronize2、Lock、ReentrantLock3、wait/notify4、阻塞队列:LinkedBlockingQueue,ArrayBlockingQueue,SynchronousQueue5、ThreadLocal6、volatile7、原子变量 AtomicBoolean

2021-12-12 22:41:53 318

原创 面试:类相关---类的加载过程

概述一个 class 文件被加载到内存中需要经过三大步:装载、链接、初始化。其中链接又可以细分为:验证、准备、解析三小步。如图所示:装载装载是指JVM找到class文件生成字节流,然后根据字节流创建java.lang.Class对象的过程。过程如下: ClassLoader通过一个类的包名+类型来查找.class文件。并生成二进制字节流。 把class文件解析为JVM内部的数据结构,并存储在方法区。(这种解析类似json文件解析成运行时的bean类) .

2021-12-11 21:49:42 272

原创 面试:Jetpack相关

一、LifeCycle原理​​​​​​Lifecycle 使用与源码分析——彻底搞懂Lifecycle原理_薛瑄的博客-CSDN博客_lifecycle原理生命周期事件管理利器 —— Lifecycle 原理详解 - 简书二、ViewModel原理整体流程比较清楚:​​​​​​Android ViewModel 实现原理 - 知乎Android Jetpack(二)ViewModel 组件原理剖析_Chiclaim-CSDN博客ViewModel 的基本原理就是:在 conf

2021-12-11 21:41:25 1164

原创 面试:kotlin协程的原理

Kotlin Coroutines(协程) 完全解析(二),深入理解协程的挂起、恢复与调度 - 简书1. 挂起函数的工作原理协程的内部实现使用了 Kotlin 编译器的一些编译技术,当挂起函数调用时,背后大致细节如下:挂起函数或挂起 lambda 表达式调用时,都有一个隐式的参数额外传入,这个参数是Continuation类型,封装了协程恢复后的执行的代码逻辑。用前文中的一个挂起函数为例:suspend fun requestToken(): Token { ... }实际上在

2021-12-11 17:07:54 2008

转载 面试:Art虚拟机和Davlik虚拟机简要对比

Android 4.4以后推出了ART虚拟机,它与Davlik虚拟机最大的不同在于,系统在安装应用时会对其进行预编译一次,将字节码转换成机器指令,以后每次启动不会重新编译,直接运行本地机器码。直接上图:Art与Davlik加载过程.pngJava虚拟机首先先来说一下java虚拟机,不管是Art虚拟机还是Davlik虚拟机,首先第一步需要得到.class字节码。 Java虚拟机加载的是.class字节码,所以需要将.java文件编译成.class文件; 它是基于栈结构的

2021-12-11 15:39:33 1726 2

原创 面试:kotlin相关拾遗

1、Kotlin中const 修饰的常量Kotlin中const 修饰的常量 - 简书想要实现真正的常量其实不难,方法有两种,一种是const,另一个使用@JvmField注解constconst,顾名思义,就是常量的单词简写,使用它可以声明常量,不过仅限于在top-level和object中。 //top-level const val name = "Kotlin" //object中 class DemoConstant { compa

2021-12-11 15:29:06 357

转载 面试:Android Context全解

网上关于 Context 的文章也已经有不少了,比如值得参考的有:Android Context完全解析,你所不知道的Context的各种细节Android Context 到底是什么?但看了一下,发现还有值得讨论的地方,比如这个等式:Context个数 = Service 个数 + Activity 个数 + 1老实说,我不明白这个等式有什么意义,而且还是错的。首先多进程情况下,Application 对象就不止一个;

2021-12-11 09:11:46 738

原创 面试:AsyncTask 的原理和缺陷

AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UL从实现上来说,AsyncTask封装了Thread和Handler,通过AsyncTask可以更加方便地执行后台任务以及在主线程中访问UI,但是AsyncTask并不适合进行特别耗时的后台任务,对于特别耗时的任务来说,建议使用线程池。一个进程中所有的AsyncTask全部在这个串行的线程池中排队执行。在默认情况下,AsyncTask是串行执行的。

2021-12-11 09:03:41 657

转载 面试:JAR 和 AAR 的生成、使用方法及场景概论

JAR 和 AAR 区别以及使用场景 ?JAR(Jave Archive) 是一种与平台无关的文件格式,允许将许多文件组合成一个压缩文件。 只包含 class 文件和清单文件,不包含资源文件。打 JAR 包,项目里面的 res 文件不可用,如果想用图片文件,可将图片放进 assets 文件打进 jar 包,但注意 jar 文件夹里面的文件不能和调用项目里面的 assets 文件里面的文件重名。aar 是 Android 库项目的二进制归档文件,包含所有资源,class 以及 res 资源文件。将 aa

2021-12-11 08:55:17 547

原创 面试:Android为每个应用分配多少内存

熟悉Android内存分配机制的朋友都知道,Android为每个进程分配内存时,采用弹性的分配方式,即刚开始并不会给应用分配很多的内存,而是给每一个进程分配一个“够用”的内存大小。那Android到底为每个应用分配多少内存呢?我们可以实际测试一下:以本人手上的努比亚NX510J手机为例: private void getMaxMemoryInfo(){ Runtime rt = Runtime.getRuntime(); long maxMemory .

2021-12-11 08:50:43 1717

原创 Viewstub 以及 view.setVisible(GONE/VISIBLE) 的实现原理

前言最近在面试的时候被面试官问到ViewStub内部是如何使用占位的时候,我是一脸懵逼,说实话我之前对UI上的一些控件内部的代码看的非常少,所以一时答不上来,这个东西其实并不说有多难,而是我们平时在开发的过程中只是简单的去调用了一下但是并没有深入的去了解其内部的原理。其实面试的过程就是我们一个查漏补缺的过程中,让我们的各个知识面都更加的能提高,同时做到知其然更知其所以然。介绍一些布局控件在开始时并不需要显示,在程序启动后再根据业务逻辑进行显示,通常的做法是在 xml中将其定义为不可见,然后在代码

2021-12-11 08:39:37 1719

原创 面试:事件分发中,有哪些会发送cancel事件

1、父容器拦截了事件。2、viewgroup移除当前view。3、window移除当前view如果ViewGroup拦截了Move事件,那么这个Move事件将会转化为Cancel事件传递给子view。ACTION_CANCEL作用我们知道如果某一个子View处理了Down事件,那么随之而来的Move和Up事件也会交给它处理。但是交给它处理之前,父View还是可以拦截事件的,如果拦截了事件,那么子View就会收到一个Cancel事件,并且不会收到后续的Move和Up事件。FLAG_

2021-12-10 18:48:54 1137

原创 面试:Android网络优化

优化点1、DNS优化,使用HttpDNS由于进行网络请求,可能会遇到DNS被劫持和DNS解析缓慢,造成网络请求过于耗时。 这里就可以采用HTTPDNS来绕过运营商服务器解析过程,从而降低平均访问时长,提高连接率,进而提高网络访问的速度。 这里的HTTPDNS不是使用传统的DNS协议向服务器的53端口发送请求,而是使用Http协议向服务器的80端口发送请求。DNS解析的失败率占联网失败中很大一种,而且首次域名解析一般需要几百毫秒。针对此,我们可以不用域名,才用IP直连省去 DNS 解析过程,节省这部.

2021-12-10 18:37:02 3098

原创 面试:AsyncTask如何中断

在java的线程中,没有办法停止一个正在运行中的线程。在Android的AsyncTask中也是一样的。如果必须要停止一个线程,可以采用这个线程中设置一个标志位,然后在线程run方法或AsyncTask的doInBackground方法中的关键步骤判断这个标志位以决定是否继续执行。然后在需要终止此线程的地方改变这个标志位以达到停止线程的目的。当我们加载一张图片的时候,加载的过程中我们想要取消操作,该怎么办呢?调用Asynctask的cancel()方法就可以了;我们调用cancel后发现后台进..

2021-12-10 15:25:00 875

原创 面试:Android补间动画、属性动画的原理

Q1:Animation 动画的原理:Animation 动画内部其实是通过 ViewRootImpl 来监听下一个屏幕刷新信号,并且当接收到信号时,从 DecorView 开始遍历 View 树的绘制过程中顺带将 View 绑定的动画执行。那么,属性动画(Animator)原理也是这样么?如果不是,那么它又是怎么实现的?我们知道,Android 每隔 16.6ms 会刷新一次屏幕,也就是每过 16.6ms 底层会发出一个屏幕刷新信号,当我们的 app 接收到这个屏幕刷新信号时,就会去计算屏幕数据

2021-12-10 15:18:10 1007

转载 面试:Android Bitmap 内存存储在JVM还是在native

Android Bitmap 内存存储所在之争(Java(Dalvik) Heap And Native Heap)在Android 3.0(API level 11) ~ Android 7.1(API level 25)中无论是Bitmap对象还是像素点数据(Pixel Data),都统一存储在Dalvik Heap。 然而从Android 8.0(API level 26) 开始,截至到2018年3月的版本,素点数据(Pixel Data)被存储到Native Heap。Bitmap的一些问.

2021-12-10 09:28:28 1992 2

原创 面试:[Android] Bitmap的内存计算

本文聚焦的问题1、Bitmap中像素数据占用多大内存?如何计算?2、不同图片来源对内存大小有什么影响?Bitmap bitmap = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);依然以如此声明一个bitmap为例,参数就决定了bitmap的大小。(以Android 8.0+平台为例,这行代码执行后占用的总内存大小=bitmap在栈上的引用大小+bitmap指向的堆中的对象大小+指向的对象持有的native像素数据大小,先只关注像素数据

2021-12-10 09:17:30 789

原创 面试:枚举单例从JVM角度分析下,以及线程安全的单例几种写法

一、枚举单例从JVM角度分析下单例模式有以下特点:  1、单例类只能有一个实例。  2、单例类必须自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。《Effective Java》一书有一句话:单元素的枚举类型已经成为实现Singleton的最佳方法。因此下次面试官让大家写单例模式的时候直接把他甩给面试官就可以啦!并且这种单例模式是线程安全的。在不考虑反射机制和序列化机制的情况下实现的单例模式,但是如果考虑了反射,则上面的单例就无法做到单例类只能有一个实例这种说法了

2021-12-09 22:08:45 2951

原创 面试:WebSocket相关

一、WebSocket原理及运行机制与HTTP关系以下简要介绍一下WebSocket的原理及运行机制。WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是:WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样; WebSocket需要像TCP一样,先建立连接,

2021-12-09 21:22:23 4560

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关注的人

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