Java
文章平均质量分 86
非著名程序员:张张
为移动端着迷,Android、ReactNative、Flutter、wxProgram
展开
-
Handler 原理
Handler是一套Android消息传递机制。原创 2022-11-25 11:16:39 · 1687 阅读 · 0 评论 -
ARouter详解
ARouter跳转到其他moudle时,需要注意的是,moudle中的目标Activity或者service服务类上使用@Route(path = “xx/xxx”) 与 app moudle中使用的@Route里的path路径不能相同,否则会报错,找不到索引。即会拦截跳转时的Path 和 Url (app内部跳转,以及页面跳转到app页面) ,拦截之后可以重新定义跳转路径,改变跳转的目标页面。通俗的讲,降级就是,在使用ARouter实现跳转的时候,如果发生错误,而进行相应的逻辑处理,原创 2022-11-11 13:12:03 · 6051 阅读 · 0 评论 -
leakCanary原理
LeakCanary的原理是什么?(针对Activity来说)LeakCanary通过监听Activity生命周期,在Activity onDestroy的时候,创建一个弱引用,key跟当前Activity绑定,将key保存到set里面,并且关联一个引用队列,然后在主线程空闲5秒后,开始检测是否内存泄漏,具体检测步骤:1:判断引用队列中是否有该Activity的引用,有则说明Activity被回收了,移除Set里面对应的key。原创 2022-11-09 23:16:53 · 382 阅读 · 0 评论 -
String中的compareTo()
可以认为是是一个外比较器,一个对象不支持自己和自己比较(没有实现。接口强制了实现类对象列表的排序。其排序称为自然顺序,其。是一种内比较,即支持跟当前对象比较。接口),但是又想对两个对象进行比较。在String内部还有个静态内部类。所以从上面的源码中可以看到,对象的大小写不敏感比较方法。方法,称为自然比较法。原创 2022-11-08 13:39:48 · 712 阅读 · 0 评论 -
数据结构之 LinkedHashMap 与 TreeMap
LinkedHashMap和HashMap区别?LinkedHashMap底层实现?利用LinkedHashMap实现LRU缓存?大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会带来困扰,因为有些场景,我们期待一个有序的Map.这就是我们的LinkedHashMap,看个小Demo:可以看到,在使用上,LinkedHashMap和HashMap的原创 2022-11-08 13:30:57 · 1930 阅读 · 0 评论 -
重识HashMap
尽管我们在进行get和put操作的时候,使用的key从逻辑上讲是等值的(通过equals比较是相等的),但由于没有重写hashCode方法,所以put操作时,key(hashcode1)–>hash–>indexFor–>最终索引位置 ,而通过key取出value的时候 key(hashcode2)–>hash–>indexFor–>最终索引位置,由于hashcode1不等于hashcode2,导致没有定位到一个数组位置而返回逻辑上错误的值null。如果使用默认的规则,是比较两个对象的地址。原创 2022-11-08 11:35:34 · 398 阅读 · 0 评论 -
HandlerThread 简介
可以使用HandlerThread来处理本地的IO读写的工作,因为本地IO操作大多数耗时都是毫秒级的,所以对于HandlerThread这种单线程 + 队列的形式,不会产生阻塞。优先级越高的线程,获的的CPU资源越多,反之越少。所以如果其中某一个线程 任务执行时间过长,就会导致后续的任务都会被延迟处理。由于HandlerThread是单线程同步队列的,所以不适合处理网络IO的操作。是没有必要设置这么高的优先级的,因而需要我们根据需求,来设置合理的优先级别。线程的优先级,一定程度的优化线程。原创 2022-10-11 20:47:08 · 507 阅读 · 0 评论 -
解耦的方式
上面这段代码就是适配器模式进行解耦的代码例子,可能有人会很疑惑这样解耦有什么意义,以上代码只做演示确实看不出这种解耦的好处,但是在实际的项目开发过程中,如果有关A类的一些需求发生改变,我们可能只需要修改Base中的相关代码就可以进行整体需求的改变,否则的话,我们不仅要 修改A,还很有可能会导致B的修改。解耦的本质就是将类之间的直接关系转换成间接关系,不管是类向上转型,接口回调还是适配器模式都是在类之间加了一层,将原来的直接关系变成间接关系,使得两类对中间层是强耦合,两类之间变成弱耦合关系。转载 2022-09-27 00:13:17 · 500 阅读 · 0 评论 -
Http中的Content-Type详解
首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。它用来告诉服务端如何处理请求的数据,以及告诉客户端如何解析响应的数据,比如显示图片,解析并展示html等等。与application/json类似,这里用的是xml格式的数据,text/xml的话,将忽略xml数据里的编码格式,参考。上面的Content-Type,我们只认得就好,但是下面有4种是需要我们清楚他们的区别及牢记在心的。原创 2022-09-26 16:53:31 · 11797 阅读 · 0 评论 -
RxJava2.0 (八) Flowable
给叶问, 然后就在边上看热闹, 看叶问能不能打死十个鬼子, 等叶问打死十个鬼子后再继续要鬼子接着打。先来回顾一下上上节,我们讲Flowable的时候,说它采用了。给叶问, 让他打, 等叶问打死这个鬼子之后, 再次调用。先暂停,工作来了,抱歉。的例子,再来回顾一下吧,我们说把。的方式,我们还举了个。转载 2022-09-22 17:36:11 · 119 阅读 · 0 评论 -
RxJava2.0 (六) 背压策略Flowable
异常, 这是因为下游没有调用request, 上游就认为下游没有处理事件的能力, 而这又是一个同步的订阅, 既然下游处理不了, 那上游不可能一直等待吧, 如果是这样, 万一这两根水管工作在主线程里, 界面不就卡死了吗, 因此只能抛个异常来提醒我们. 那如何解决这种情况呢, 很简单啦, 下游直接调用request(Long.MAX_VALUE)就行了, 或者根据上游发送事件的数量来request就行了, 比如这里request(3)就可以了.这种想法, 这是万万不可的, 它们都有各自的优势和不足.转载 2022-09-22 17:02:20 · 208 阅读 · 0 评论 -
RxJava2.0 (五) 背压策略
在上一节中, 我们找到了上下游流速不均衡的源头 , 在这一节里我们将学习如何去治理它 . 可能很多看过其他人写的文章的朋友都会觉得只有Flowable才能解决 , 所以大家对这个Flowable都抱有很大的期许。今天我们先抛开Flowable, 仅仅依靠我们自己的双手和智慧, 来看看我们如何去治理 , 通过本节的学习之后我们再来看Flowable, 你会发现它其实并没有想象中那么牛叉, 它只是被其他人过度神化了.转载 2022-09-22 16:34:39 · 160 阅读 · 0 评论 -
RxJava2.0 (四) Backpressure背压
大家期待已久的来啦.这一节中我们将来学习. 我看好多吃瓜群众早已坐不住了, 别急, 我们先来回顾一下上一节讲的Zip.上一节中我们说到Zip可以将多个上游发送的事件组合起来发送给下游, 那大家有没有想过一个问题, 如果其中一个水管A发送事件特别快, 而另一个水管B发送事件特别慢, 那就可能出现这种情况, 发得快的水管A已经发送了1000个事件了, 而发的慢的水管B才发一个出来, 组合了一个之后水管A还剩999个事件, 这些事件需要继续等待水管B发送事件出来组合, 那么这么多的事件是放在哪里的呢?转载 2022-09-22 16:10:38 · 122 阅读 · 0 评论 -
RxJava2.0(三)强大的操作符
上一节讲解了线程调度, 并且举了两个实际中的例子, 其中有一个登录的例子, 不知大家有没有想过这么一个问题, 如果是一个新用户, 必须先注册, 等注册成功之后再自动登录该怎么做呢.很明显, 这是一个嵌套的网络请求, 首先需要去请求注册, 待注册成功回调了再去请求登录的接口..subscribeOn(Schedulers.io()) //在IO线程进行网络请求.observeOn(AndroidSchedulers.mainThread()) //回到主线程去处理请求结果@Override。原创 2022-09-22 15:16:20 · 804 阅读 · 0 评论 -
RxJava2.0(二)Schedulers线程调度器
上一节教程讲解了最基本的RxJava2的使用, 在本节中, 我们将学习RxJava强大的线程控制Schedulers.转载 2022-09-22 12:31:39 · 814 阅读 · 0 评论 -
RxJava2.0(一)
首先需要说明的是,RxJava2.0和RxJava1.0是不冲突的,如果学过RxJava1.0,那么只需要在关注下更新内容即可。不过如果没学过RxJava1.0也没关系,直接学习RxJava2.0也是一样的,本文中所有的名词都属于RxJava2.0,并不涉及RxJava1。转载 2022-09-22 11:46:49 · 149 阅读 · 0 评论 -
Java基础知识(四)
一、值传递 & 引用传递值传递:方法接收的是实参值的拷贝,会创建副本,对形参的修改不会影响到实参。 引用传递:方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。二、为什么Java只有值传递?...原创 2022-05-23 14:17:57 · 78 阅读 · 0 评论 -
Java基础知识(三)
一、I/O 什么是序列化?什么是反序列化?如果我们需要持久化一个 Java 对象:比如将Java对象存储到文件中,或者将Java对象实现在网络中传输等,这些场景都需要用到序列化。序列化: 将Java对象,转换成二进制字节流的过程。 反序列化:将在序列化过程中所生成的二进制字节流,转换成Java对象的过程。二、Java序列化时如何禁止某些字段参与序列化?对于不想进行序列化的变量,可以使用transient关键字修饰。transient关键字的作用是:阻止实例中那些用此关键字修饰的的变...原创 2022-05-18 17:21:44 · 56 阅读 · 0 评论 -
Java基础知识(二)
一、面向对象和面向过程的区别两者的主要区别在于解决问题的方式不同:面向过程把解决问题的过程,拆成一个个方法,通过这些方法的执行来解决问题。 面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。另外,面向对象开发的程序一般更易维护、易复用、易扩展。二、成员变量和局部变量的区别语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被public、private、static等修饰符所修饰,而局部变量不能被访问控制修饰符及...原创 2022-05-17 17:34:20 · 290 阅读 · 0 评论 -
Java基础知识(一)
一、 JVM 虚拟机JVM是运行Java字节码的虚拟机。而基于不同平台,相同的Java字节码,执行之后会产生相同的结果,这也是实现跨平台的关键。JVM 并不是特有的,只要满足JVM规范,每个公司或组织或者个人,都可以开发自己专属的JVM。二、JDK 和 JREJDK是 Java Development Kit 的缩写,是功能齐全的 SDK。它包含 JRE 所拥有一切,还包括: javac、javadoc、jdb。它能够创建程序、编译程序。JRE是Java运行时环境。用来运行已编译好的Ja原创 2022-05-07 15:51:40 · 240 阅读 · 0 评论 -
网络协议 (六) TCP与UDP的区别
一、TCP与UDP对比:UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 却是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等。TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。由于 TCP 要提供可靠的,面向连接的传输服务,这难免增加了许多开销。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输原创 2022-04-29 19:25:23 · 257 阅读 · 0 评论 -
网络协议 (五) TCP握手建立连接
一、握手策略为了可以准确的将数据准确无误地送达目标主机,所有基于 TCP 实现的协议,都需要先完成 TCP 协议的三次握手策略。原创 2022-04-27 17:54:30 · 2787 阅读 · 0 评论 -
网络协议 (四) 计算机网络常识
一、应用层有哪些协议?HTTP 超文本传输协议; SMTP 简单邮件传输(发送)协议; POP3/IMAP 邮件接收协议; FTP 文件传输协议; Telnet 远程登陆协议; SSH 安全网络传输协议;1.1 Http协议Http 协议是基于TCP协议的,发送Http请求之前,首先需要建立一个 TCP 连接,也就是所谓的 3 次握手。目前使用的 HTTP 协议版本大部分都是 1.1。而在 Http1.1里,默认是开启 Keep-Alive 的,这样的情况下建立的链接就可以在多次的请求中原创 2022-04-24 18:04:51 · 2527 阅读 · 0 评论 -
网络协议 (三) Http1.0 vs Http1.1 vs Http2.0 (应用层)
这篇文章会从下面几个维度来对比 HTTP 1.0 和 HTTP 1.1:响应状态码 缓存处理 连接方式 Host头处理 带宽优化1. 响应状态码Http1.1 与 Http1.0 相比,新加入了大量的状态码。2. 缓存处理Http1.0 中的缓存机制非常简单,服务端使用 Expires 标签来标识一个相应体,在 Expires 标志的时间内的所有请求,获得的都会是缓存。服务端 初次返回给 客户端 的响应体中,会有一个 Last-Modified 标签,该标签标记了被请求资源在原创 2022-04-21 22:01:43 · 2187 阅读 · 0 评论 -
网络协议 (二) Http vs Https (应用层)
一、Http 协议1. Http 协议介绍HTTP 协议,全称超文本传输协议。顾名思义,HTTP 协议就是用来规范超文本的传输的。超文本:也就是网络上的包括文本在内的各式各样的消息。HTTP 是一个无状态协议(stateless),也就是说服务器不维护任何有关客户端过去所发请求的消息。这其实是一种懒政,有状态协议会更加复杂,需要维护历史信息,而且如果客户或服务器失效,会产生状态的不一致,解决这种不一致的代价更高。2. HTTP 协议通信过程HTTP 是应用层协议,它以 TCP(传输层)作原创 2022-04-18 17:40:35 · 1798 阅读 · 0 评论 -
数据结构(五)红黑树
讲红黑树之前,我们先来回顾一下 二叉查找树 (BST) ,先来看一下二叉查找树的特性:左子树上所有结点的值均小于或等于它的根结点的值。 右子树上所有结点的值均大于或等于它的根结点的值。 左、右子树也分别为二叉排序树。我们来看一个典型的二叉查找树:这样的数据结构有什么好处呢?首先我们来测试一下,试着查找一下值为 10 的节点。1. 查看根节点 9 。2.由于10 > 9,因此查看右孩子13。3.由于10 < 13,因此查看左孩子11。4.由于10 < 11.原创 2022-03-11 17:14:31 · 623 阅读 · 0 评论 -
数据结构(四)堆
堆也是一种树,但是它需要满足以下条件:堆中的每一个节点值 都大于等于 或者 都小于等于 该节点下子树中所有节点的值。或者说,任意一个节点的值都大于等于 (或小于等于) 所有子节点的值。注意⚠️很多博客说堆是完全二叉树,其实并非如此,堆不一定是完全二叉树,只是为了方便存储和索引,我们通常用完全二叉树的形式来表示堆。事实上,广为人知的斐波那契堆和二项堆就不是完全二叉树,它们甚至都不是二叉树。 (二叉)堆是一个数组,它可以被看成是一个近似的完全二叉树。1 堆的用途当我们只关心所有数据中的 最.原创 2022-03-11 17:12:46 · 344 阅读 · 0 评论 -
数据结构(三)树
树就是一种类似现实生活中树 (倒置的树) 的数据结构。对于任何一个非空树来说,它只有一个根节点。树的特点如下:一棵树中的任意两个结点有且仅有唯一的一条路径连通。 一棵树如果有 n 个结点,那么它一定恰好有 n-1 条边。 一棵树不包含回路。1 树中常用的概念下图就是一颗树,并且是一颗二叉树:节点:树中的每个元素都可以统称为节点。 根节点:顶层节点或没有父节点的节点。 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点。 子节点:一个节点下的节点称为该节...原创 2022-03-11 17:10:57 · 1507 阅读 · 0 评论 -
数据结构(二)图
图就是由 顶点的有穷非空集合 和 顶点之间的边 组成的集合。通常表示为:G(V,E),其中,G表示一个图,V表示顶点的集合,E表示边的集合。1 线性结构、树形结构、图三者的区别:线性数据结构的元素满足唯一的线性关系,每个元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继。 树形数据结构的元素之间有着明显的层次关系。 图形结构的元素之间的关系是任意的。2 图的基本概念图的应用非常广泛,比如在社交软件上的好友关系,就可以用图来表示。2.1 顶点图中的数据元素,我们称之为顶点原创 2022-03-11 17:08:48 · 1475 阅读 · 0 评论 -
数据结构(一)线性数据结构
1. 数组数组(Array) 是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。我们可以直接利用元素的索引(index)来计算出该元素对应的存储地址。数组的特点:容量有限,因为数组需要一块连续的内存空间; 插入 / 删除,分两种情况,如果发生在数组头部,则由于需要将整个数组中的元素向后 / 向前移动,所以效率低下;如果发生在数组尾部,则不需要移动数组中的元素,为此效率很高; 改 / 查时,由于是按照数组下标执行的,为此效率很高;操作数组时的复原创 2022-03-11 17:06:16 · 1393 阅读 · 0 评论 -
时间复杂度与空间复杂度
算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?衡量代码好坏有两个非常重要的标准:运行时间 (时间复杂度),是指执行当前算法所消耗的时间变化趋势; 占用内存 (空间复杂度),是指执行当前算法需要占用的内存空间的变化趋势;因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是「鱼和熊掌..原创 2022-03-11 16:57:32 · 213 阅读 · 0 评论 -
ArrayList动态扩容原理&深拷贝与浅拷贝
ArrayList由数组实现,当增加或删除数据元素时,除了最后位置的元素外, ArrayList需要移动其被添加或删除的元素后面的全部元素。对于遍历所有的元素,ArrayList是具有良好的效率的。特点:查、改效率高:直接通过下标获取元素,直接通过下标设置元素。因为数组元素在物理上是连续的,知道其中一个的内存地址,就可以推算出其他元素的内存地址。 尾部增、删效率高:每次增加或删除,都需要移动指定位置后面的元素,所以增删的位置越靠前,需要移动的元素就越多,效率就越低;反之,效率就...原创 2022-03-07 11:29:43 · 1787 阅读 · 0 评论 -
Java多线程(一站式学习就在这里)
一、什么是线程? 现代操作系统(Windows,macOS,Linux)都可以执行多任务,即同时运行多个任务。CPU执行代码都是一条一条顺序执行的,但是,即使是单核CPU,也可以同时运行多个任务。因为操作系统执行多任务实际上就是让CPU对多个任务轮流交替执行。例如,让浏览器执行0.001秒,让QQ执行0.001秒,再让音乐播放器执行0.001秒,在人看来,CPU就是在同时执行多个任务。即使是多核CPU,因为通常任务的数量远远多于CPU的核数,所以任务也是交替执行的。 ...原创 2022-03-05 00:01:35 · 274 阅读 · 0 评论 -
ThreadLocal详解
一、ThreadLocal 原理 首先我们要知道的是,ThreadLocal 是什么?它是一个工具类,是用来封装线程中本地变量的。它的数据结构如下: Thread类中有一个变量 threadLocals ,它是ThreadLocal内部类ThreadLocalMap类型的变量,我们通过查看内部类ThreadLocalMap可以发现实际上它类似于一个HashMap。在默认情况下,每个线程中的这个变量都为null。ThreadLocal.ThreadLocalMap th...原创 2022-03-02 18:29:08 · 3112 阅读 · 0 评论 -
Java正则表达式
1. 匹配规则正则表达式的匹配规则是从左到右按规则匹配。1.1 \ 匹配特殊字符如果正则表达式有特殊字符,那就需要用\转义。比如:正则表达式a\&c,其中\&是用来匹配特殊字符&的,它能精确匹配字符串"a&c",但不能匹配"ac"、"a-c"、"a&&c"等。注意正则表达式在Java代码中也是一个字符串,所以,对于正则表达式a\&c来说,对应的Java字符串是"a\\&c",因为\也是Java字符串的转义字符,两个原创 2022-02-26 13:30:32 · 1178 阅读 · 0 评论 -
Java注解
注解,也被称为元数据,为我们在代码中添加信息提供了一种形式化的方式,使我们可以在某个时刻可以非常方便地使用这些数据。很多文章都是讲述java注解的,而且很多例子虽然有和Android互通的部分,但是Android开发中也扩展了很多单纯Java中没有的注解。所以这里主要介绍Android开发中的注解,当然包括Java注解。 目前很多框架开发或者Android开发中都用到了注解,SDK开发中也有很多可以对接口添加限制以规范用户使用的规则,这些都是值得我们去学习的。一、Java...原创 2022-02-24 19:58:53 · 1718 阅读 · 0 评论