<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cp_Mark的博客]]></title><description><![CDATA[脚踏实地，耐心学习]]></description><link>https://blog.youkuaiyun.com/cp_Mark</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cp_Mark]]></copyright><item><title><![CDATA[Java虚拟机学习笔记（四）：内存分配与回收策略]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/83758995</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/83758995</guid><author>cp_Mark</author><pubDate>Tue, 06 Nov 2018 23:25:51 +0800</pubDate><description><![CDATA[Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题：给对象分配内存以及回收分配给对象的内存。
对象的内存分配，往大方向讲，就是在堆上分配，对象主要分配在新生代的Eden区上，如果启动了本地线程分配缓冲，将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中，分配的规则并不是百分之百固定的，其细节取决于当前使用的是哪一种垃圾收集器组合，还有虚拟机中与内存相关的参数...]]></description><category></category></item><item><title><![CDATA[Java虚拟机学习笔记（三）：垃圾收集器]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/83753371</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/83753371</guid><author>cp_Mark</author><pubDate>Mon, 05 Nov 2018 23:39:08 +0800</pubDate><description><![CDATA[垃圾收集器
我们讨论的收集器基于JDK1.7 Update14之后的HotSpot虚拟机，这个虚拟机包含的所有收集器如图：


连线说明可以搭配使用

Serial收集器
Serial是最基本、发展历史最悠久的收集器，在JDK1.3之前是虚拟机新生代收集的唯一选择。Serial收集器是一个单线程的收集器，单线程的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作，更重要的是在它进...]]></description><category></category></item><item><title><![CDATA[Java虚拟机学习笔记（二）：垃圾收集算法及HotSpot的算法实现]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/83628655</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/83628655</guid><author>cp_Mark</author><pubDate>Mon, 05 Nov 2018 22:32:37 +0800</pubDate><description><![CDATA[概述
垃圾收集（GC）需要考虑3件事情：
（1）哪些内存需要回收？
（2）什么时候回收？
（3）如何回收？
前面我们已经提及程序计数器、虚拟机栈、本地方法栈3个区域随线程而生，随线程而灭；栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈的操作，每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知。而Java堆和方法区则不一样，一个接口中的多个实现类需要的内存可能不一样，一个方法中的多...]]></description><category></category></item><item><title><![CDATA[Java虚拟机学习笔记（一）：内存区域与HotSpot虚拟机对象探秘]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/83387757</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/83387757</guid><author>cp_Mark</author><pubDate>Mon, 05 Nov 2018 18:35:23 +0800</pubDate><description><![CDATA[Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途，以及创建和销毁的时间，有的区域随着虚拟机进程的启动而存在，有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范（Java SE 7版）》的规定，Java虚拟机所管理的内存将会包括以下几个运行时数据区域：

程序计数器（线程私有）
程序计数器是一块较小的内存空间，它可以看...]]></description><category></category></item><item><title><![CDATA[图]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/82930111</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/82930111</guid><author>cp_Mark</author><pubDate>Wed, 03 Oct 2018 17:13:38 +0800</pubDate><description><![CDATA[定义：图（Graph）是由顶点的有穷非空集合和顶点之间的集合组成，通常表示为：G(V、E)，其中G表示一个图，V是图G中顶点的集合，E是图G中边的集合。下图就是一个图的示例：

在图的定义过程中，有几点我们需要注意的：
（1）在图中数据元素，我们称之为顶点
（2）在图结构中，不允许没有顶点
（3）图中，任意两个顶点之间都可能有关系，顶点之间的逻辑关系用边来表示，边集可以是空的
各种图的定义

...]]></description><category></category></item><item><title><![CDATA[串（字符串）]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/82779635</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/82779635</guid><author>cp_Mark</author><pubDate>Wed, 03 Oct 2018 09:49:26 +0800</pubDate><description><![CDATA[串的定义
串是由零个或多个字符组成的有限序列，又名叫字符串。一般记为s=“a1a2…an”（n&amp;amp;amp;amp;gt;=0），其中s是串的名称，用双引号括起来的字符序列是串的值，注意引号不属于串的内容。串中的字符数目n称为串的长度。零个字符的串称为空串。
下面是一些需要注意的基本概念：
（1）序列：说明串的相邻字符之间具有前驱和后继的关系
（2）空格串：是只包含空格的串。它和空串是不同的，有内容，有长度，而且可以...]]></description><category></category></item><item><title><![CDATA[树、二叉树]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/81610363</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/81610363</guid><author>cp_Mark</author><pubDate>Tue, 18 Sep 2018 21:31:56 +0800</pubDate><description><![CDATA[树的定义

定义： 树是n（n&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;=0）个结点的有限集。n=0时称为空树。在任意一棵非空树中： 
（1）有且仅有一个特定的称为根的结点 
（2）当n &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; 1时，其余结点可分为m（m &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp]]></description><category></category></item><item><title><![CDATA[栈和队列（顺序栈、链栈、队列、循环队列、链队列）]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/81591269</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/81591269</guid><author>cp_Mark</author><pubDate>Tue, 18 Sep 2018 21:31:41 +0800</pubDate><description><![CDATA[栈的定义

定义：栈是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶，另一端称为栈底，不含任何数据元素的栈称为空栈。栈又称后进先出(Last In First Out)的线性表，简称LIFO结构。

栈的插入操作，叫作进栈（Push），也称压栈、入栈。栈的删除操作，叫作出栈（Pop），也有的叫作弹栈。示意图如下：



栈的抽象数据类型

栈本身就是一个线性表，所以关于...]]></description><category></category></item><item><title><![CDATA[线性表（数组、单链表、静态链表、循环链表、双向链表）]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/81590670</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/81590670</guid><author>cp_Mark</author><pubDate>Tue, 18 Sep 2018 21:31:26 +0800</pubDate><description><![CDATA[线性表的定义

线性表（List）：零个或多个数据元素的有限序列。

有几个地方需要强调：


首先它是一个序列，也就是说元素之间是有顺序的，若元素存在多个，则第一个元素无前驱，最后一个元素无后继，其他每个元素都有且只有一个前驱和后继。
然后线性表强调的是有限的。
最后线性表中的数据元素必须是相同类型。


如果用数据语言来定义，可如下（配合下图理解）：



数学语言定义： 若将线性表记为（a1...]]></description><category></category></item><item><title><![CDATA[数据结构绪论]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/81590283</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/81590283</guid><author>cp_Mark</author><pubDate>Tue, 18 Sep 2018 21:31:02 +0800</pubDate><description><![CDATA[程序设计的实质是对确定的问题选择一种好的结构，加上设计一种好的算法。


  程序设计=数据结构+算法




基本概念和术语

数据：是描述客观事物的符号，是计算机中可以操作的对象，是能被计算机识别，并输入计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型，还包括字符及声音、图像、视频等非数值类型。

数据元素（记录）：是组成数据的、有一定意义的基本单位，在计算机中通常作为整体处理。比如畜...]]></description><category></category></item><item><title><![CDATA[Android-自定义Annotation注解]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/82709475</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/82709475</guid><author>cp_Mark</author><pubDate>Mon, 17 Sep 2018 22:31:45 +0800</pubDate><description><![CDATA[序

现在市面上越来越多的基于注解的框架出现，它们可能或多或少的存在一些问题，但是确实是在某些方面大大简化了我们的开发周期和难度，也使得有些代码更加优雅。

为了进一步提升自己（装逼中。。。），就决定去了解一下到底什么是注解，它们有几种类型，它的实现原理，它是怎么起到简化代码的作用的。

我们以Android中权限的动态申请为示例，分别以运行时注解和编译时注解两种形式来实现。如有不足，还请指出！！...]]></description><category></category></item><item><title><![CDATA[Android入坑react-native：关于从原生数据流到flux、redux的演化]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/81013662</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/81013662</guid><author>cp_Mark</author><pubDate>Sat, 14 Jul 2018 21:02:19 +0800</pubDate><description><![CDATA[最近入坑React-Native，买了些参考书，撸了一个玩Android的react-native版本，对于参考书里面关于flux和redux是一脸的懵逼，后面在豆瓣上搜了redux相关的书籍，发现一本不错的入坑书深入浅出React和Redux，里面讲解了原生prop和state的不足，以及一步步演化到redux框架，这里作一下总结。...]]></description><category></category></item><item><title><![CDATA[RxJava2.1.14源码学习（三）线程切换observerOn]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/80707331</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/80707331</guid><author>cp_Mark</author><pubDate>Tue, 19 Jun 2018 10:49:13 +0800</pubDate><description><![CDATA[在上一篇我们已经介绍了线程切换两大操作符中的subscribeOn了，这一片我们来分析一下observerOn。本文重点是： 
（1）observeOn是如何实现的，它是如何影响事件流的， 
（2）如果我们使用多次会是什么结果，为什么？ 
（3）subscribeOn和observeOn的混合使用效果

如果对整体流程还不清晰的最好先去看看前面两篇：


  RxJava2.1.14源码学习（一）...]]></description><category></category></item><item><title><![CDATA[RxJava2.1.14源码学习（二）线程切换subscribeOn]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/80694434</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/80694434</guid><author>cp_Mark</author><pubDate>Fri, 15 Jun 2018 16:17:49 +0800</pubDate><description><![CDATA[在上一篇我们只是简单的介绍RxJava的订阅和事件流，这一篇我们要分析的是RxJava最流弊的地方：线程切换。相信使用过RxJava的人都会被它优雅的线程操作所折服，好了不废话了，我们先说一下本文的重点： 
（1）subscribeOn是如何实现的，它是如何影响事件流的，如果我们使用多次会是什么结果，为什么？ 
（2）observeOn是如何实现的，它是如何影响事件流的，如果我们使用多次会是什么结...]]></description><category></category></item><item><title><![CDATA[RxJava2.1.14源码学习（一）基本流程（附带装饰者模式、观察者模式说明）]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/80684066</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/80684066</guid><author>cp_Mark</author><pubDate>Thu, 14 Jun 2018 15:58:41 +0800</pubDate><description><![CDATA[RxJava已经是日常开发必备的技能，连带面试也是常问的知识点]]></description><category></category></item><item><title><![CDATA[记Google Play应用签名计划带来的问题]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/80674533</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/80674533</guid><author>cp_Mark</author><pubDate>Wed, 13 Jun 2018 09:48:27 +0800</pubDate><description><![CDATA[在某些特殊的情况，我们的应用需要强制升级（比如重大bug），以前上架小米、华为、360等国内市场一切都是正常的，但是这次上架Google Play发现升级会失败，提示签名不一致，同时原来正常的定位功能，上传到Google play也无法正常使用，提示key验证失败。一脸懵逼，上网去查资料，发现Google Play在你首次上传应用的时候有一个Google Play应用签名计划（为了保证安全），如下...]]></description><category></category></item><item><title><![CDATA[记上架GooglePlay提升targetSdkVersion导致的适配问题]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/80652935</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/80652935</guid><author>cp_Mark</author><pubDate>Mon, 11 Jun 2018 17:26:38 +0800</pubDate><description><![CDATA[升了targetSdkVersion，出现了一些适配的问题，还有权限的问题，实在是不想升，但是没办法Google爸爸要求必须要升，硬着头皮上了。

我主要是面临两个方面的问题： 
（1）权限的动态申请 
（2）应用升级、拍照获取图片异常（这两个是同一个问题）

对于权限问题，相对来说还是比较简单的，我是采用了RxPermissions来做的。对于运行时权限有兴趣的可以去了解一下。主要是说第二个问题...]]></description><category></category></item><item><title><![CDATA[记Paypal支付小坑]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/80652032</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/80652032</guid><author>cp_Mark</author><pubDate>Mon, 11 Jun 2018 15:17:08 +0800</pubDate><description><![CDATA[因为业务需求，需要接入Paypal，总体来说也是比较简单的，但是陌生的东西总是免不了要躺坑的，这里做一下记录。 
首先是一波官方的资料： 
Paypal Android sdk github地址 
Paypal 开发者首页

在开始之前你需要一个Paypal的账号。

接入的大致步骤如下： 
（1）新建测试账号，分别是PERSONAL、BUSINESS身份 
 
（2）以刚才新建的BUSINESS...]]></description><category></category></item><item><title><![CDATA[记Google应用内商品（消耗品）支付小坑]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/80649746</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/80649746</guid><author>cp_Mark</author><pubDate>Mon, 11 Jun 2018 14:36:06 +0800</pubDate><description><![CDATA[因为应用要上架Google Play，所以需要接入Google支付和Paypal支付，本篇先记录一下Google支付接入流程。首先来一波定心丸，Google支付的接入还是很简单的；然后就是官方文档啦实现应用内购买结算。

个人理解，购买流程大致如下： 
（1）查询当前设备是否支持应用内购买 
（2）在支持的情况下，通过商品id查询拥有，未消耗的商品。 
（3）如果没有，可以直接调起购买支付；如果有...]]></description><category></category></item><item><title><![CDATA[记Google Play上架及测试注意点]]></title><link>https://blog.youkuaiyun.com/cp_Mark/article/details/80647718</link><guid>https://blog.youkuaiyun.com/cp_Mark/article/details/80647718</guid><author>cp_Mark</author><pubDate>Mon, 11 Jun 2018 11:08:51 +0800</pubDate><description><![CDATA[在要开始上架流程之前，有一些东西要准备好： 
（1）Google的开发者账号（需要付费） 
（2）一款FQ工具 
（3）手机要有Google Play应用商店和Google Play服务（测试时使用，因为国内手机大部分都是没有的，自己想办法搞定）

做好上面这些准备，就开始正式的流程了。

发布流程


首先登陆Google Play Console，然后可以看见下图： 

点击右侧的创建应用（选...]]></description><category></category></item></channel></rss>