自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 Okhttp源码解析(四)

Okhttp源码解析(一)Okhttp源码解析(二)Okhttp源码解析(三)之前写了RetryAndFollowUpInterceptor拦截器,这里来跳过BridgeInterceptor拦截器因为我觉得这块没什么好写的(主要原因是懒)下面直接说一下CacheInterceptor拦截,缓存拦截器,这个拦截器很有意思,就是用来处理HTTP缓存的,Okhttp是基于Http协议的封装,那么这里的缓存原理其实就是利用的HTTP协议的缓存关于HTTP缓存可以看我写的这篇。HTTP缓存其实掌握了这

2021-07-07 15:57:03 136

原创 HTTP缓存

Http缓存缓存控制:控制缓存的开关,用于标识请求或访问中是否开启了缓存,使用了哪种缓存方式。缓存校验:如果缓存控制开关打开,如何校验缓存,比如怎么定义缓存的有效期,怎么确保缓存是最新的。缓存控制1. Expires2. Cache-Control3. PragmaExpiresExpires 响应头包含日期/时间, 即在此时候之后,响应过期。Expires因为是对时间设定的,且时间是Greenwich Mean Time (GMT),而不是本地时间,所以对时间要求较高。

2021-05-25 19:00:53 228

原创 Android消息处理机制(阻塞和唤醒)

前置知识1:学习任何知识都是要有一定的前置条件的,比如你要先识字才能“看懂”我这篇文章…在全面了解Android消息处理机制之前,我希望读者对该机制最好要有一定的了解,至少知道主要由哪些类实现了该机制。如果你还能看得懂c/c++代码,精通Linux内核,对pipe、eventfd和IO多路复用epoll机制都有深入的了解,那么我劝你就别看了…本文的侧重点主要在于消息机制中的阻塞和唤醒上,对于Java层面的组成关系会简单的带过,这部分的内容已经烂大街了,如果想对于Java层的源码逐行分析请看下面的源码

2021-04-26 15:59:39 1488

原创 弱引用发生GC后调用weakReference.get()返回null吗?

Java 弱引用先来看一个Demopublic class Demo { public static void main(String[] args) { WeakReference<Demo> weakReference = new WeakReference(new Demo()); System.out.println(weakReference.get()); System.gc(); System.out.

2021-03-09 14:44:42 1533 1

原创 Okhttp源码解析(三)

继上一篇Okhttp源码解析的博客已经过去一年多了,当时没有继续写下去的原因是因为本皇的小公主出生了!(借口,其实就是因为分析下去发现内容太多,画不动图了)做为一个小区No.1的好爸爸(邻居册封的,我姑娘小区No.1漂亮,这点随我)当然就没时间写了。那为什么又写了呢,原因是我现在在公司主攻网络框架…正好有时间写一波。书接上文,现在我们来看一下OkHttpClient源码中的第一个拦截器这个拦截叫:重试and重定向拦截器,顾名思义就是干名字上的这些事的,那么它是怎么实现的呢?这里注意我标红的部分稍后

2020-08-02 07:10:58 194

原创 算法系列------猜数字

小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。class Solution { public int game(int[] guess, in...

2019-10-31 22:29:54 161

原创 算法系列------N叉数前序遍历

给定一个 N 叉树,返回其节点值的前序遍历。例如,给定一个 3叉树 :返回其前序遍历: [1,3,5,6,2,4]。/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {} public Node...

2019-10-29 22:01:40 114

原创 算法系列------回文数

class Solution { public boolean isPalindrome(int x) { int j=0; if(x<0) return false; String xStr = x + ""; String yStr = reverse1(xStr); char...

2019-10-28 05:54:58 89

原创 算法系列------两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer...

2019-10-27 16:05:35 95

原创 算法系列------二叉树的中序遍历

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { publ...

2019-10-18 19:53:00 103

原创 算法系列------二叉树的前序遍历

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public List<Integer> preorderTraversal(TreeNode root)

2019-10-17 22:11:02 70

原创 算法系列------验证回文串

class Solution { public boolean isPalindrome(String s) { if (s == null) return true; s = s.toLowerCase(); int l = s.length(); StringBuilder str = new StringBuilder(l); for (char c : s.toCharArray()) {

2019-10-16 19:55:36 66

原创 算法系列------用队列实现栈

class MyStack { private Queue<Integer> a;//输入队列 private Queue<Integer> b;//输出队列 public MyStack() { a = new LinkedList<>(); b = new LinkedList<>(); } public void push(int x) { a.o

2019-10-15 21:47:11 84

原创 算法系列------利用栈实现队列

class MyQueue { private Stack<Integer> a;// 输入栈 private Stack<Integer> b;// 输出栈 public MyQueue() { a = new Stack<>(); b = new Stack<>(); } public void push(int x) { a.push(x);

2019-10-14 22:02:11 95

原创 算法系列------括号匹配算法

public static Boolean isV(String s){ Stack<Character> stack = new Stack<>(); for(int i=0;i<s.length();i++){ if(s.charAt(i)=='{' || s.charAt(i)=='['|| s.charAt(i)=='('){ stack...

2019-10-13 20:17:27 97

原创 算法系列------队列

// 用数组实现的队列public class ArrayQueue { // 数组:items,数组大小:n private String[] items; private int n = 0; // head 表示队头下标,tail 表示队尾下标 private int head = 0; private int tail = 0; // 申请一个大小为 cap...

2019-10-12 21:10:03 64

原创 算法系列------手写栈

class ArrayStack { private long[] a; private int size; //栈数组的大小 private int top; //栈顶 public ArrayStack(int maxSize) { this.size = maxSize; this.a = new long[size]; ...

2019-10-11 18:18:33 121

原创 算法系列------链表是否有环

/*** * 用快慢指针判断链表是否有环 * @param head * @return */public boolean isCircleLinkedListNode(ListNode head){ if(head == null){ return false; } ListNode slow = head,fast = head; if...

2019-10-10 20:58:28 63

原创 算法系列------反转链表2

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL/** * Definition for singly-linked list. * public c...

2019-10-09 21:20:48 65

原创 算法系列------合并两个有序链表

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode mergeTwoLis...

2019-10-08 22:12:50 65

原创 算法系列------反转链表

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode reverseList...

2019-10-07 21:14:47 62

原创 算法系列------单链表

public class LinkedList<E> { // 头节点 private Node top; // 链表长度 private int size; // 添加方法 public void add(E e) { Node newNode = new Node(); newNode.content = e; if (top == null) { ...

2019-10-06 22:50:44 56

原创 算法系列------快速排序

快速排序Public class QuickSort implements IArraySort { @Override public int[] sort(int[] sourceArray) throws Exception { // 对 arr 进行拷贝,不改变参数内容 int[] arr = Arrays.copyOf(sourceArr...

2019-10-05 21:05:17 192

原创 算法系列------插入排序

public int[] insertSort(int[] arr){ int n = arr.length; for(int i=1; i<n-1;i++){ // 记录要插入的数据 int tmp = arr[i]; // 从已经排序的序列最右边的开始比较,找到比其小的数 int j = i; ...

2019-10-04 22:37:05 49

原创 算法系列------选择排序

时间复杂度O(n²)原理选择排序public int[] selectSort(int[] arr) { //使用变量n存放集合长度 int n = arr.length; //遍历 for(int i=0; i<n-1; i++) { //纪录最小值下标位置 int min = i; for(int j=i+1; j<n;j++) { //通过比较...

2019-10-03 17:56:38 55

原创 算法系列------冒泡排序

这是我第一个知道的算法!冒泡排序public int[] bubbleShort(int[] arr) { for(int i=0; i<arr.length-1; i++) { for(int j=0; j<arr.length-1;j++) { if(arr[j]>arr[j+1]) { int temp = arr[j]; arr[j] = ...

2019-10-02 22:01:45 68

原创 算法系列------序(1)

时间复杂度和空间复杂度算法追求“快”和“省”,而“快”就是时间复杂度,“省”就是空间复杂度。用大O表示复杂度数据结构数据结构的含义1 代表了储存数据的集合2 代表了储存数据之间的特定关系8种数据结构初阶数据结构(4种)数组(Array)链表(Linked list)堆栈(Stack)队列(Queue)共同的名字线性表高阶数据结构(4种)树(Tree)集(Set)...

2019-10-01 22:10:51 84

原创 算法系列------引言

最近连续两次在算法上栽了跟头,甚是狼狈,算法对于我这个非计算机专业的程序员来说,在最初知道算法存在的时候,一直认为这是一个需要很高深的数学知识才能了解的知识,随着知识的累积,也逐渐认清了算法的一些面目。从实用角度来出发,我个人觉得我并不需要具备什么高深的数学基础,那么算法是什么,我决定通过我个人的理解,帮助自己也帮助对于算法不了解的程序员童鞋们,认识算法,我的目的就是不要在面试中因为算法再栽跟头...

2019-09-30 19:23:05 125

原创 猫眼Android面试感悟分享

前言从公开简历以来也面试了4家,猫眼是第四家,这里也是通过了技术二面,再等三面和hr,首先先说点个人的面试感受吧,谈不上经验,因为面的次数比较少。场景化问题增多很多技术点不再是单纯的原理或者api层面的东西,很多都是结合一定的应用场景让你来说实现方案,甚至部分代码细节,举个例子大概就类似问Activity的生命周期,不在是简单的说出几个回调而是结合app日常操作的场景来说。当然这个例子比...

2019-09-04 15:23:48 407 1

原创 一次面试总结

本篇基本不涵盖技术解析,只是我个人久违的一次面试总结。早在5月份就离职了,上家公司P2P行业,至于为什么离职相比了解P2P的都应该能猜个大概,从5月一直到8月 这3个月基本上就处于放飞自我的过程,为什么没有急着找工作,因为我有了一个女儿,这是我今年最开心的事情了,在家做一个全职奶爸,感觉特别的美妙,当然会很辛苦,但是育儿真的是一件很有乐趣的事情。转眼就到了8月份 宝宝6个多月了,坐的比较稳当了...

2019-08-26 20:50:06 152

原创 Android系统启动

Boot ROMROM是只读存储器(Read-OnlyMemory)的简称,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电子或电脑系统中,并且资料不会因为电源关闭而消失。BootLoader参考计算的BIOS,系统启动加载器。Linux Kernel (Linux内核)init.rc文件创建Android系统...

2019-08-22 10:50:12 74

原创 Java线程----安全篇

本篇是Java线程系列的第三篇,前两篇地址如下Java线程----实现篇Java线程----调度篇线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额进行额外的同步,或者在调用方进行任何其他的协调操作,调用对象的行为都可以获得正确的结果,那这个对象是线程安全的。以上是引用自《Java Concurrency In Practice》的作...

2019-08-07 11:28:05 323

原创 Java线程----调度篇

线程调度是指系统为线程分配处理器使用权的工程,主要调度方式有两种:协同式线程调度(Cooperative Threads-Scheduling)如果使用协同式调度的多线程系统,线程的执行时间由线程本身控制,线程把自己的工作执行完成之后,要主动通知系统切换到另外一个线程上。优点:实现简单,切换操作对线程自己是可知的,所以没有什么线程同步的问题。缺点:线程执行时间不可控,甚至如果一个线程编...

2019-08-07 09:11:25 122

原创 Java线程----实现篇

线程线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源,又可以独立调度。线程的实现实现线程主要有3种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。使用内核线程实现内核线程(Kernel-Level Thread,KLT)就是直接由操作系统内核支持的线程,并负责将线程的任务映射到各个处理器上。...

2019-08-06 15:37:31 108

原创 Okhttp源码解析(二)

在上一章的结尾我们遗留了一个很重要的方法Response response = getResponseWithInterceptorChain();该方法返回的是一个Response对象,相信使用过OkHttp的童鞋对于这个对象应该不陌生,这个就是Http网络请求最终的响应对象。那么getResponseWithInterceptorChain()是如何获取到响应对象的。在分析该方法前我们先...

2019-01-08 16:28:35 375 3

原创 Glide源码解析---缓存篇

Glide的缓存分为两部分内存缓存硬盘缓存今天我们从源码的角度来分析。Glide.with(context).load(url).into(imageView);上面一行代码我们就可以实现图片的加载,这一行代码背后进行了成吨的工作,我们今天只来看看它关于缓存的部分。Engine load()public &amp;amp;amp;amp;lt;T, Z, R&amp;amp;amp;amp;gt; LoadStatus load(Key s...

2019-01-02 10:29:59 186

原创 算法系列-----树的遍历

@Override public void preOrder(BaseTreeNode node) { if(node == null){ return; }else{ System.out.println(&amp;amp;amp;amp;amp;quot;前序递归: &amp;amp;amp;amp;amp;quot; + node.getNode()); pr

2018-12-27 14:13:19 135

原创 Android事件分发总结

dispatchTouchEvent() 返回true 消费事件 dispatchTouchEvent() 返回false 不分发事件 由上层OnTouchEvent()处理 dispatchTouchEvent() 返回super 默认逻辑向下分发事件onTouchEvent() 返回true 消费事件 onTouchEvent() 返回false 向上回溯事件,交由上层onTouch...

2018-09-06 15:08:18 119

原创 Okhttp源码解析(一)

一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient。我将通过一系列的文章来分析okhttp的源码:如何引入在app的build.gradle文件中dependencies { &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;amp;amp;a

2018-08-17 18:04:32 3402 8

原创 Context使用

Context使用

2018-05-15 14:20:51 198

空空如也

空空如也

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

TA关注的人

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