Java
fundroid
Android GDE(谷歌开发者专家)| 互联网大厂移动端架构师
展开
-
深入浅出Java字节码.class文件格式
1. 前言“一次编写,到处运行(Write Once, Run Anywhere)”,因为有虚拟机的机制。1.1 虚拟机与字节码的关系“同一份输入,不同的输出”,我们只需要生成一份字节码文件,然后同一份.class字节码文件在不同的操作系统中,由不同的虚拟机生成对应机器码。虚拟机和字节码是Java的两个最底层的原理。最简单的编译运行流程,实际情况比这个复杂的多1.2 HelloWorld万物皆可HelloWorld,字节码也不例外。HelloWorld.javaHelloWorld.转载 2020-12-31 23:37:21 · 1680 阅读 · 0 评论 -
正确理解RxJava的subscribeOn
使用RxJava的subscribeOn和observeOn可以方便地进行线程切换,但我发现很多人由于对subscribeOn的理解不到位,在使用中会发生意想不到的bug。subscribeOn提起subscribeOn,很多人都知道它可以用来切换上游线程,且只有第一次生效。这种理解明显是带有错误的,看一段代码val observable = Observable.create<Int> { emitter -> log("Subscribing") thread(.原创 2020-05-16 13:53:33 · 2258 阅读 · 0 评论 -
var关键字的比较:Java10 VS Kotlin
Java10之后的一个重要变化是引入了var关键字,在Kotlin中我们对它已经很熟悉了,那么Java中的var和Kotlin有哪些不同呢?1. 声明初始化Kotlinkotlin中我们声明同时初始化时,可以省略变量类型,当然也可以不省略//省略var myVariable = 1//不省略var myVariable : Int = 1当我们声明和初始化分开时,必行指定类型...原创 2020-03-31 20:34:48 · 197 阅读 · 0 评论 -
LiveData.observe在Kotlin中的优化
通过Kotlin的扩展函数优化LIveData的observe的使用原创 2020-03-22 20:30:42 · 3915 阅读 · 0 评论 -
getName(), getSimpleName(), getCanonicalName()的区别
Java中Class类名的获取有多个方法,如果错用可能得不到预期结果,我们拿出来简单对比一下:getName()以字符串的形式返回Class全名,包括包名+类名getSimpleName()仅仅返回类名,不返回包名getCanonicalName()Java SE Specifications中定义的Class全名,包括包名和类名Java Specifications中规定Cla...原创 2020-03-03 12:52:44 · 1576 阅读 · 0 评论 -
容易被忽略的Java知识点:静态初始化中的同步与死锁
Java静态初始化块(static block)中的同步与死锁原创 2020-03-01 19:15:10 · 638 阅读 · 0 评论 -
Guice vs Dagger
Guice和Dagger都是Java的依赖注入框架,他们有很多相似性,所以放到一起比较一下:相同点: 基于Java 由Google维护(Dagger最早是Square开发的,Dagger2已经过继给了Google) 兼容JSR-330注解规范 因为兼容JSR-330,所以需要修改源码添加注解实现注入,相对于Spring通过外部配置文件的方式对源码有侵入性 不同点 Guic...原创 2020-02-02 17:39:01 · 1298 阅读 · 0 评论 -
理解同步/异步/阻塞/非阻塞的区别
在异步编程中经常会遇到同步、异步、阻塞、非阻塞几个概念,本文对这几个概念做一个简单介绍。以下 , A:调用方, B:被调用方同步/异步:反映的A与B双方之间的关系,即A如何从B获取数据 同步:B被调用后待有结果之前不返回,A等待结果返回后再进行下一步操作。 异步:B被调用后立即返回,A立即进入下一步。B的结果准备后通过回调等方式发送给A 阻塞/非阻塞:反映的是某一时刻当前一方...原创 2020-02-01 11:58:58 · 692 阅读 · 0 评论