自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

智障儿童欢乐多

数载咸鱼,step by step 18 22 27 30 35 40 。

  • 博客(43)
  • 收藏
  • 关注

原创 常见基础算法

滑动窗口无法解决存在负值的问题,存在负值的问题,可以考虑使用前缀和方法进行求解。这个题目中,最长子串就是要满足的条件,同时也满足连续子数组的要求。双指针求最大值,始终按照固定的规则来选择移动其中一个指针。双指针的题型是不固定的,题型多变,需要灵活的运用。相邻的数据进行比较。每次遍历找到一个最大值。用于求解满足特定条件的连续子数组问题。双指针就是通过移动指针来。面试常见动态规划问题。

2023-05-15 01:37:55 534

原创 多线程并发问题分析与总结

多线程并发问题分析与总结

2022-12-11 00:00:00 1582

原创 架构模式 MVC MVP MVVM

MVC、MVP、MVVM模式的简单介绍

2022-07-23 16:25:43 1041

原创 从Launcher启动一个APP流程 Android 12

Android 应用启动流程

2022-06-08 00:42:02 2969

原创 OkHttp连接拦截器篇

文章目录缓存篇流程图`ConnectInterceptor`详解ExchangeFinder`ExchangeFinder#findConnection`源码分析RealConnection连接池ConnectionPoolTransmitter代理和DNSJava定义的代理类型三种`DIRECT`、`HTTP`、`SOCKS`DNS解析缓存篇https://blog.youkuaiyun.com/followYouself/article/details/121086502流程图ConnectInter

2021-11-01 19:40:34 1796

原创 OkHttp缓存篇

文章目录OkHttp设计模式 & 关键点Demo代码拦截器 InterceptorRetryAndFollowUpInterceptorBridgeInterceptorCacheInterceptorConnectInterceptornetworkInterceptorsCallServerInterceptor`CacheInterceptor`缓存详解Cache.javaCacheStrategy.java 缓存策略okhttp3.Dispatcher 异步请求调度Http Header配置

2021-11-01 19:17:42 2428 2

原创 Retrofit & Rxjava3 & RxAndroid

Retrofit & Rxjava3Retrofit:https://blog.youkuaiyun.com/followYouself/article/details/120317044引用库本文主要分析 implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'的源码implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.squareu

2021-09-30 18:11:44 719

原创 Rxjava3 & RxAndroid

Rxjava && Rxandroid引用方式implementation "io.reactivex.rxjava3:rxjava:3.1.1"implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'概念Observable是被观察者,也是生产者,也是source类型。Observer是观察者,也是消费者。被观察者、生产者、source、上游、upstream 是一类概念。在subscribeOn和observeOn经常会看

2021-09-30 18:10:05 628

原创 Retrofit

Retrofit 实现一次网络请求流程定义抽象网络请求接口new Retrofit对象。配置baseUrl。调用retrofit.create函数,生成代理类对象。GitHubService service = retrofit.create(GitHubService.class)。调用抽象网络接口对象,生成retrofit2.Call对象。这个对象的默认实际类型是retrofit2.DefaultCallAdapterFactory.ExecutorCallbackCall。调用retrof

2021-09-15 21:17:48 411

原创 动态代理简析

代理模式一个抽象接口,一个功能类,一个功能类的代理类。代理类组合功能类。功能类和功能类的代理均实现了抽象接口。调用者通过代理类调用实际功能类。代理分为静态代理和动态代理。动态代理的经典使用:Retrofit开源库。1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。应用场景:远程代理(服务器和客户端)、安全代理(安全控制)、虚拟代理、延迟加载、智能指引。动态代理动态代理实现

2021-09-11 20:31:05 242

原创 EventBus

EventBus配置android { defaultConfig { javaCompileOptions { annotationProcessorOptions { // 生成的Index类的名称 arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ] } } }

2021-09-08 19:57:59 186

原创 ThreadLocal

ThreadLocal顾名思义:线程本地的对象。一个ThreadLocal对象,在不同线程中,通过public T get() 函数返回的value是不同的。在Android的Looper.java中,使用了ThreadLocal对象存储线程自己的Looper对象,通过myLooper函数获取looper对象。ThreadLocal存储的对象类型是T,ThreadLocal<T>. 一个ThreadLocal在每个线程中只能存储一个T类型的value值。ThreadLocal对象是存储

2021-09-08 19:35:51 193

原创 阅读过的书籍

有纪念意义的书籍书名时间Head First Java2015Java核心技术卷12015第一行代码2016Effective java2018Java并发编程的艺术2018深入Java虚拟机2019重构,改善既有的代码设计2020Android进阶解密2021其他书名时间啊哈!算法2016编程珠玑2016Android 群英传2017...

2021-09-06 00:33:41 125

原创 ConcurrentHashMap(2)

transfer 扩容函数MIN_TRANSFER_STRIDE 每次至少扩容 16个hash桶,所以当table的长度小于等于 16时,只会有一个线程在进行扩容工作。支持多线程进行扩容。如果在扩容过程中,进行get函数操作,每个bin桶扩容完成后,旧tab的节点位置都会被设置为ForwardingNode(hash值为负)。ForwardingNode 重写了Node节点的find方法,会在NextTable中寻找正确的hash对象。参考资料https://juejin.cn/post/6844

2021-08-23 10:37:52 222

原创 ConcurrentHashMap(1)

android-29\java\util\concurrent\ConcurrentHashMap.java不支持key 或者 value 为null它是线程安全的,但不是锁(synchronization details)安全的。This class is fully interoperable with {@code Hashtable} in programs that rely on its thread safety but not on its synchronization detai

2021-08-23 10:35:34 303

原创 Java虚拟机

深入理解java虚拟机java体现架构可以分为:java设计语言、java API、class文件、虚拟机一个java程序都有一个java虚拟机实例.一个java虚拟机实例有单独的堆、方法区、栈等.双亲委派模型类装载器优先使用双亲装载器去装载类型,如果双亲装载器装载失败,那么类装载器才会尝试自己装载类.启动类装载器是根类装载器,由native方法实现.每一个类装载器都有一个唯一的命名空间,通过命名空间控制了类的访问权限.装载、连接、初始化.内存相关方法区. 装载的类信息存放在方.

2021-08-22 16:12:00 158

原创 书籍: Android进阶解密

Android系统启动流程启动电源以及系统启动引导程序BootLoader执行启动Linux内核.启动pid为 0 的进程 swapperinit进程启动,pid 为 1. 引导孵化出Zygote进程(Java进程).启动Native层的Media Server、Service Manager(binder 服务管家)、开机动画.Zygote 进程. 第一个java进程,加载虚拟机SystemServer进程. framework进程,包含多种服务.AMS,WMS 等等Launcher进程.

2021-08-22 14:59:07 1350 2

原创 HashMap

HashMapHashMap 是一个Node<K,V>数组(table) 和 链表(或者红黑树) 结构组成。 /** * The table, initialized on first use, and resized as * necessary. When allocated, length is always a power of two. */ transient Node<K,V>[] table; // Node数组声

2021-08-18 12:13:27 164

原创 沪江 AOP 切片 API使用说明

官方参考https://github.com/HujiangTechnology/gradle_plugin_android_aspectjxAOP 切片编程 SDK使用build.gradlebuildscript { repositories { mavenLocal() google() jcenter() } dependencies { classpath 'com.android.tools.bu

2021-08-03 18:19:41 318

原创 简单的对象池(ObjectPool)实现

package chenggong.test;import java.util.Objects;/** * 对象池。用了一个简单的链表来实现 * * @since 2021-07-25 */public class ObjectPool { private static final String TAG = "ObjectPool"; private static final Object POOL_LOCK = new Object(); private st.

2021-07-25 17:39:03 407

原创 AIDL 跨进程调用 Java代码

2021-06-13 00:07:20 125

原创 重构

重构的目标最主要也是最重要的目标是为了加快开发速度,用最少的开发工作量创造更大的经济价值.其次目的才是为了代码的优雅,整洁.(尽管如此,整洁的代码目的应该也是为了加快开发速度)重构的思想和思路如果想要用一个新的库,替换掉一个正在使用的库,可以先引入一层新的抽象,使其兼容新旧两个库的接口.一旦调用方已经完全使用这层抽象,那么替换库会容易的多.(通常叫做 New Branch By Abstraction)如果有一块很糟糕的代码,但是我可以从来不修改他,那么这段代码就是不需要重构的. 只有当需要理解

2021-03-20 21:45:31 100

原创 泛型说明

java 泛型的几点说明泛型有三种:泛型类,泛型接口,泛型方法。这三种泛型声明的位置是不同的。泛型类是在创造类实例的时候需要指明泛型,泛型方法时在调用方法的时候需要指明泛型。泛型又有字母泛型 T 和泛型通配符 ?。通配符 ? 在编译器中不是Java的实际类型,编译器将把? 类型识别为临时类型,比如“CAP#1”。这种类型是无法用于任何变量的赋值的。extends和super关键字更常和泛型通配符 ? 使用。<? extends Object> 常常有用于函数入参的声明。 extend

2020-06-18 12:13:23 444

原创 设计模式和编码原则

编码六原则引用自:http://c.biancheng.net/view/1324.html开闭原则Software entities should be open for extension,but closed for modification。软件实体应当对扩展开放,对修改关闭,这就是开闭原则的经典定义。当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模...

2020-06-18 12:10:36 256

原创 Android make file语法

cc_defaults 是当前模块的父模块cc_binary 代表可以生成二进制库文件,生成的文件在/system/bincc_library cc_library_shared 代表一个c++可编译库,生成的so库在/system/framework/libjava_library 是一个java库,编译出jar包shared_libs 依赖库subdirs 子...

2019-09-07 17:17:21 1754

原创 shell脚本

注释单行注释 #多行注释 :&lt;&lt;!和!这个叹号可以是任何内容,例如:&lt;&lt;something和something:&lt;&lt;!code line 1code line 2!可以把多行代码封装成为一个函数,进而通过函数的是否调用,实现多行注释变量 $变量通过花括号{}标定范围。也可以不写花括号,但是可能不能正确识别变量定义变量的方式 v...

2019-03-18 10:57:20 189

原创 正则表达式

正则表达式类常见符号* :代表前面的字符出现0次或者多次,最少0次+ :代表前面的字符出现一次或者多次,最少一次? :代表前面的字符出现0次或者一次. :匹配任意字符,处理换行符\n^ :匹配字符串的开始位置,在中括号中是匹配取反的字符集{} :匹配字符串的次数.形式入{n},{n,},{n,m}() :一个子表达式,也是一个子模式组\b :匹配单词边界.单词边界是空格和字母之...

2019-03-10 02:13:34 218

原创 Handler、Looper、Message简易实现

简述Handler 处理类Looper 循环类,包含消息队列,包含一个循环线程Message 消息类实现可以发送消息,会在一个子线程中处理消息内容,需要手动调用quit停止线程工作.可以发送runnable执行任务,可以延时.Message类public class Message { public String name; public int what;...

2018-12-23 23:13:16 227

原创 树的遍历——深度优先遍历、广度优先遍历

遍历遍历可以分为深度优先遍历、广度优先遍历.这两种遍历有分为递归和非递归的方案遍历有对二叉树的遍历和对多叉树的遍历二叉树遍历分为先根遍历、中根遍历、后根遍历...

2018-12-09 00:03:06 1485

原创 HandlerThread

HandlerThreadhandlerThread就是一个包含looper的Thread.使用方法 HandlerThread handlerThread = new HandlerThread(&quot;handlerThread&quot;); //handlerThread.getLooper()获取Looper Handler handler = new Han...

2018-11-11 22:24:31 365

原创 Java中的锁—类锁、对象锁. synchronized 偏向锁 实现

规律总结并发。首先应该意识到只有在多线程(并发)的情况下才会有锁的竞争、获取的问题,单线程根本是不需要考虑锁的。同步。一个非同步的操作,在任何情况下都是可以被无阻塞执行的,无论对象或者是否处于锁状态。例如:对象A被锁住,但是这时对象A仍然可以被调用进行任何非同步操作。synchronized。synchronized修饰的代码块必须执行完(退出)才会释放锁。 synchronized修饰的...

2018-11-11 21:13:27 240

原创 Toolbar and DrawerLayout

Toolbar去掉actionbar的方式supportRequestWindowFeature(Window.FEATURE_NO_TITLE)用于AppCompatActivity继承的Activity去除actionbar,在onCreate方法的setContentView(R.layout.activity_main)方法之前.(RequestWindowFeature(Window...

2018-11-11 20:55:17 165

原创 Socket、read函数、http中headers

Socket、read函数、http中headers说明Socket1. Socket中几个函数setSoTimeout(int time)。设置read函数的阻塞时长,超过时长抛出SocketTimeoutException。shutdownOutput() / shutdownInput()。shutdownOutput()函数是关闭输出流,例如在客户端调用,此时代表客户端输出流关闭,不能再向...

2018-07-05 18:08:53 1100

原创 Fastjson解析Json

基本的解析操作JsonString解析成为JsonObjectJsonString解析成为某Bean类的一个实例JsonString解析成为JsonArrayJsonString解析成为一个列表List&amp;amp;amp;amp;amp;lt; T&amp;amp;amp;amp;amp;gt;JsonObject、Bean类、JsonArray、List &amp;amp;amp;amp;amp;lt; T&amp;amp;amp;amp;amp;gt;

2018-06-26 21:04:30 279

原创 软件文档、注释规范

软件文档需求 必要的功能可选的功能设计方案 可能选取的各种方案实现说明 架构说明, 解耦, 模块说明网络接口数据库设计说明重要的类,方法 测试...

2018-06-25 23:58:20 604

原创 软件安装

Ubuntu 软件 安装方式 备注 Mysql 安装方式 Nginx tomcat Mysql 安装Windowsmac

2018-06-17 13:40:06 232

原创 Linux使用的问题

关于电脑双显卡安装Ubuntu适配的问题可能导致的问题现象不能正常的开机和关机,不能开机,或者需要强制断电关机。界面出现界面出现错误日志,类似于 nouveau 000:01:00.0: fifo: SCHED_ERROR 08 []循环登录的问题,在登录界面循环登录,不能进入系统问题的原因nouveau 是Ubuntu社区开发的开源的显卡驱动,它对NVIDIA显...

2018-03-22 10:40:02 327

原创 未解决的问题和散乱的知识点

未解决的问题Android Android问题 备注 代码混淆 代码混淆配置操作,需要彻底弄清楚 gradle Gradle脚本编程,主要还是在工程中的配置常用的操作应该学会 maven maven常规使用方式,Gradle和maven结合使用的方式 内存 private dirty,shared dirty fra...

2017-12-11 16:40:40 455

原创 Android中的一些开源库、开源工具

开源库和工具

2017-12-10 19:28:28 349

原创 Git使用记录

提交代码前—rebase操作背景当多人开发一个工程的是时候,个人提交代码前一定要进行rebase操作。rebase的意义就是把自己的提交(commit)先取消,然后拉取(pull)最新远程分支(最新的远程分支可能包含本地没有的提交记录),之后把自己的提交应用到这个新的远程分支上,git的历史记录就没有merge操作。如何操作最简洁的方法 git pull --rebase...

2017-11-12 23:26:18 1093

空空如也

空空如也

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

TA关注的人

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