- 博客(37)
- 收藏
- 关注
原创 Android 三种方式实现三角形气泡效果、自定义View、shape、点9图
背景这期需求中,项目需要这样一个情况 乍一看,用个图片就可以解决,一个线性布局、垂直摆下去,所以一开始我是这样尝试的,后来发现美工给我切的图很不合适,不同手机显示效果也不一样,所以后来放弃了。以下是解决方案使用.9图这个就不用说了,继续找美工小姐姐切一个.9图,即可,但因为之前麻烦了她挺多,然后我就不想再麻烦她了,而且这种方式图片也要占一定体积。后来考虑自己自定义一个自定...
2018-08-28 19:41:39
9979
1
原创 如何给女朋友解释清楚Synchronized的三种应用方式
事情的起因是这样的,女友面试的时候被面试官问到了一个问题就是关于synchronized的几种应用方式,她没理解,于是我决定给他理一理,就有了这篇博客。synchronized的三种应用方式修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要...
2018-08-10 18:00:38
874
1
原创 结合源码理解RecyclerView的四级缓存机制
很多人提起RecycleView和ListView的时候必定会提起两者的差异,都说RecycleView好,多布局,多缓存,等等。今天我们结合下源码理清一下RecycleView的多级缓存机制,我研究代码喜欢先从宏观了解下整体,然后再分个进入。所以等会先介绍下管理RecycleView的缓存类,然后会从某个类开始切入,分析。Recyclerview的缓存类RecycleView的四级缓存是...
2018-08-07 17:44:58
4846
原创 Volatile 以DCL失效谈内存屏障用来禁止指令重排序的原理
引言大家都知道volatile关键字具有两重语义即:1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。2)禁止进行指令重排序。 第一个好理解,也就是说每次修改都立即更新到主内存,那么禁止重排序这个在网上更多的解释是说使用了内存屏障,使得前后的指令无法进行重排序。(关于volatile详解) 那么问题来了,什么是内存屏障?...
2018-06-16 16:45:22
2301
5
原创 你真的了解Java引入异常机制的作用么?
前两天腾讯面试官问了我这样一个问题,为什么java要引入异常处理机制,让程序崩溃不是很不友好么?我之前也没思考过这个问题,临场发挥,想了想给出了这么一个回答:“发生了异常,说明程序已经发生错误了,如果不及时处理异常,错误将会方法,发生不可预期的损失,最好就是在源头掐灭它,而让程序崩溃也是无可奈何的事情,相比较损失,崩溃APP可能会让损失小点”。面试过后,我回头总结这次面试的时候又想起了这个点,觉得...
2018-06-07 17:39:18
2543
原创 利用Synchronized、wait和notify简单实现生产者消费者模型
什么是生产者消费者模型生产者和消费者之间通过一个容器解决耦合,两者之间不直接通讯,每当消费者消费,都直接从容器中取,相当于找了个代理一样,每当生产者生产完不用等待消费者消费,消费者消费完也不用等待生产者生产,直接挂起即可。解决了消费与生产直接的不平衡,高效利用了资源。有哪些应用?比如java中的线程池、生产者把任务丢给线程池,线程池创建线程并处理任务,如果将要运行的任务数大于线程池的基...
2018-05-30 15:41:24
2321
2
原创 图解数字签名过程
数字签名,它的作用跟手写签名其实是一样的,用来证明某个消息或者文件是本人发出/认同的,利用公钥加密系统保证不可伪造和不可抵赖两个特性 使用的签名算法有:RSA,基于大整数分解问题DSA,基于离散对数问题ECDSA,属于DSA的一个变种,基于椭圆曲线上的离散对数问题我们以RSA做简单分析,如果你生成了一对RSA密钥,你把公钥公布出去,并告诉别人这个公钥是你的。之后你只要在发送的消息后面...
2018-05-27 20:58:13
9620
2
原创 Android8.0 对重复代码行的处理
问题public class MainActivity extends AppCompatActivity {public static String TAG ="TAG"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance...
2018-05-25 14:19:59
644
2
原创 设计模式之代理模式总结
代理模式目前我已知的实现有三种:静态代理、动态代理、Cglib代理,只对常用的前两种做一个总结,后面那种了解下,用的不多。定义代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改...
2018-05-21 10:55:20
297
原创 Android 事件总线 EventBus入门及使用
何为事件总线?是对发布-订阅模式的一种实现。 它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。学习它之前最好先了解下观察者模式 说白了就是不同组件间通信的一种标准也可以用于异步线程与主线程通信,相比于传统的Handler、BroadcastReceiver、接口回调,它更加简洁,使用简单,而且解耦。基本上是人见人爱的。可以应用于Activit...
2018-05-14 21:30:21
352
原创 Java Observer与Observable源码解析
前言Observer与Observable是JDK中内置的类型,是实现观察者模式重要的两个类,学习设计模式的时候只是简单的知晓这两个类中的一些方法使用,并不知道具体是咋样的,所以特地研究了一下其源码实现,如果需要知道怎么使用,请移步 设计模式总结Observer先来看下源码//此类位于util包中 package java.util; public interface O...
2018-05-14 16:14:49
435
原创 设计模式之观察者模式总结
快速引入观察者模式又名订阅模式,使用率非常高,以至于JDK都内置了实现观察模式所用到的Observer和Observable,这个模式中有两个角色,一个是观察者,一个是被观察者。拿学校中的广播来说,广播发送者是被观察者,而你是观察者,发送一条广播,所有观察者都会知道。实现就拿上面的学校广播,我们来实现一个简单的观察者模式的例子。 例子中用到的Observer和Observable请查...
2018-05-14 14:18:15
293
原创 设计模式之命令模式总结
快速切入命令模式,顾名思义是对命令的封装,其实也就是一个个行为,同属于行为模式中你的一种,我们平时处理一个命令是这样的,将各种命令写入一个类中,然后客户端直接调用即可。这样的话其实一个类就职责不明,干了很多事,代码也非常多,维护困难。如果用命令模式的话会被分解成这样:请求者(调用命令执行操作)类,然后是命令(定义所有的具体命令及其实现)类,最后是接收者(接收请求并执行请求)类,这样分成三步它的...
2018-05-13 17:10:40
272
原创 设计模式之责任链模式总结
快速引入责任链模式,首先肯定是一条链,然后链上每个节点都有他的责任,任务在链上传递,假设从第一个开始传递,传递到下一个时候如果他有责任处理这个事情就处理,没责任,或者不能处理就传递下去,依次这样。直到传到最后一个或者事情被处理完。这个非常好理解,跟日常公司中报销一样,如果你要报销5w,如果你的直接领导没权限报5w,就会转交给经理,经理没有就转给总经理,总经理没有就转到老板,然后批复。实...
2018-05-13 13:49:21
534
2
原创 设计模式之状态模式总结
快速解释定义是这么写的,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。仔细揣摩这段定义,可以得出这么些细节,能使用状态模式的首先得有状态,有行为,而且状态不同,行为也不同,状态是可以改变的。老方法,我们举例说明,比如我们人,有生病和健康两种状态,在生病状态的时候我们除了卧床休息啥也干不了,行为可以是治疗。在健康的时候,我们可以有的行为可以是工作,学习等。但我们健康的时...
2018-05-12 18:28:36
292
原创 设计模式之策略模式总结
快速引入在做项目中经常会遇到,实现某一个功能有多种算法或者策略,我们可以根据应用场景的不同选择不同的算法或者策略来完成该功能。比如我对一个数组排序,有时候想用冒泡排,有时候想用快排排序,那么这个排序功能就有多种算法和策略。如果没学习此设计模式之前我们可能会这么实现,把所有的算法写进一个类中,然后在类中判断使用什么方法,例如使用if else 或者其他条件判断语句来进行选择,但是这种方法会让类变...
2018-05-12 15:05:24
320
原创 设计模式之工厂方法模式总结
名词快速解释如果我们做某件事,把他交给另外一个人做完,而我只要得到答案即可,并不想知道过程,而且有可能这些事的细节不同,但是总归是一类事,你都得给我完成。就好像你是个土豪,去买车,我今年想要定制版的林肯加长,你造车厂给我造好就行了,明年又想要兰博基尼,你工厂又给我弄好就行了,我也不想知道你怎么弄好的,虽然我要的车都是不同的,但是你都得给我处理好。这个时候工厂可能就忙不过来了,就会把业务线发给旗...
2018-05-11 21:31:00
301
原创 Java -克隆实现方式 深克隆与浅克隆
我们平时复制一个值类型数据直接复制就好了,但是复制一个引用类型比如对象的时候就无从下手了,因为赋值只能赋引用,而如果手动操作把里面的值取出赋给新对象又太麻烦耗时了,有没有好办法?java提供了clone。克隆类型在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类
2018-05-10 16:43:43
3086
原创 设计模式之原型模式总结
其实原型模式说白了就是克隆,用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。为什么能保证性能?是因为,原型模式是在内存中的二进制流的拷贝要比直接new好,特别是要在一个很大的循环体中产生大量对象的时候,你觉得是直接复制好,还是执行一次循环再获取一次要来的快?答案显而易见。但
2018-05-10 16:08:24
472
原创 APP token机制 - 安全的自动登录
为什么引入token?在做项目的时候遇到了自动登录问题,如果自动登录的话之前设想是第一次登录时保存用户名和密码到本地,启动APP的时候自动调用登录接口,可是这样一来用户数据就很危险,很容易被盗取,所以网上查找了下解决方法,一般现在web都是使用cookie在APP中我们一般叫做token,就是在用户第一次登录的时候向服务器发送请求,服务器验证后返回一个特定字符串作为token,APP保存好这个tok
2018-05-07 22:08:53
6121
原创 React Native入门以及资源
React Native学习需要的知识储备:ES6基础JavaScript基础React基础、React基础视频HTML基础+CSS基础Android基础和IOS基础(最好具备其中一个)为什么学习RN现在很多应用都有RN的影子,比如知乎、京东等,发展到现在组件很丰富能快速开发,跨平台的特点使他能节省很多成本,目前的跨平台框架很多,但是RN更贴近原生,用户体验更好。我是如何学习首先熟悉前
2018-05-03 19:49:28
328
原创 为什么程序员都推荐Google搜索而不是百度?
你真的知道为什么选择谷歌吗?相信大部分人只是跟风。只是知道用谷歌广告少点,搜索出来的内容准确点。确实如此,使用百度搜索出来的大部分内容其实不是你想要的,而是百度想给你看的,太多广告了,但是除了广告为什么会觉得搜索出来的内容准确些呢?这就涉及到了两家搜索公司的核心搜索引擎技术了。
2018-04-17 14:18:18
11417
6
原创 LeetCode 416. Partition Equal Subset Sum-0-1背包变型
Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.Note: Each of the array element
2018-03-04 17:55:46
253
原创 LeetCode 376. Wiggle Subsequence -动态规划解法
A sequence of numbers is called a wiggle sequence if the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either posi
2018-03-02 16:51:45
344
原创 LeetCode 300. Longest Increasing Subsequence -动态规划的使用
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, Given [10, 9, 2, 5, 3, 7, 101, 18], The longest increasing subsequence is [2, 3, 7, 101]...
2018-03-02 16:40:55
356
原创 LeetCode 64. Minimum Path Sum -备忘录法
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.Note: You can only move either down or right at a...
2018-02-22 22:35:47
247
原创 并查集实现-(秩优化+路径压缩+java)
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行
2018-02-09 02:44:33
870
原创 二叉搜索树非递归实现-java版
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。其实说白点就是一颗二叉树满足了左子节点小于根节点元素,右子节点大于根节点元素,这样的...
2018-02-08 20:45:36
1223
原创 LeetCode 215. Kth Largest Element in an Array-快速排序的灵活使用
在LeetCode上看到一个题目,第一眼看的感觉就是排序解决,然后思考了下堆排序不太合适,而快排速度很快,然后在快速排序的基础上进行了优化,写下来记录一下。题目Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, no
2018-02-03 23:44:46
377
原创 排序算法总结-Shell排序、归并排序、快排、堆排
本章是对排序算法的一个总结,包括原理,代码,时间复杂度,空间复杂度等,总结内容不包括基础算法,如冒泡排序,插入排序,选择排序,另外文中代码均为手打,只展示核心思想,未经编译器测试。 对此约定一些基础函数:void swap(num,a,b); //交换数组num中序号为a,b的数组元素int max(a,b);//返回a,b中较大值。Shell排序shell排序基于插入排序
2017-11-15 20:22:16
1040
2
原创 数据结构与算法-堆、基于堆实现的优先队列、堆排序
堆的概念堆是一种树形数据结构,每个节点都有一个值,通常我们说的堆是指二叉堆,是一种完全二叉树结构,堆的特点是根结点的值最小(或最大),根节点大的称为大顶堆、根节点小的称为小顶堆,且根结点的两个子树也是一个堆,这里的堆区别于内存中的堆。堆可用于堆排序、优先队列等。在这里我们使用数组存储,在数组中按层级储存(不使用数组第一个位置)。 如何构造堆?如何构造堆就是如何让堆有序化,因为刚开始输入数组中的数字
2017-11-11 17:25:45
685
原创 动态规划之线性动规钢条切割问题
问题描述线性规划是一类问题。目标函数为特定变量的线性函数,约束是这些变量的线性不等式(standard form)或等式(slack form),目的是求目标函数的最大值或最小值。这类动态规划是平时比较常见的一类动态规划问题。假设公司出售一段长度为i英寸的钢条的价格为Pi(i = 1, 2, …单位:美元),下面给出了价格表样例: 切割钢条的问题是这样的:给定一段长度为n英寸的钢条和一个价格表Pi
2017-10-26 16:33:59
968
原创 利用0-1背包问题谈动态规划
动态规划解释维基百科的定义: - 动态规划的本质,是对问题状态的定义和状态转移方程的定义。引自维基百科dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems.动态规划是通过拆分问题,定义问题状态和状
2017-10-23 15:13:51
439
原创 Android IPC多进程通信总结
IPC(Inter-Process Communication) 进程间通信,是指两个不同进程之间数据交换的过程。一般在Android程序中一个进程就是一个程序(无特别代码实现的情况下),而一个程序分配的是单独的虚拟机,一个进程可以包含多个线程。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region),那
2017-09-26 19:54:34
534
原创 Android 浅析Context
我们平时在开发Android应用程序时一直都在使用Context比如启动一个Activity,大部分人不知道为什么要使用context来启动Activity,不能直接new一个activity而要使用context来启动,一个App到底有多少个Context等等的细节,尤其是Context使用不当还会造成内存泄漏,所以有必要写篇文章总结下。Android应用模型磨刀不误砍柴工,先介绍一下Androi
2017-09-25 14:28:19
345
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人