猫侠的小窝

一步一步,盖个大房子……

冒泡排序

冒泡排序

思路 确定第1位:从后向前两两比较,把较小的放在前,较大的放在后。结束后,最小的已经在第1位了。 确定第2位:从后向前两两比较,把较小的放在前,较大的放在后。直到第2位。结束后,第2小的已经在第2位了。 …… 确定第n-1位:…… 平均时间复杂度:O(n2) 实现 void bubble_sort(const int* a, int length){ bool...

生产者消费者模型显式锁版

生产者消费者模型显式锁版

缓冲区 public class Storage { // 仓库最大存储量 private final int MAX_SIZE = 100; // 仓库存储的载体 private LinkedList<Object> list = new LinkedList<Object>(); // 锁 private final...

生产者消费者模型内置锁版

生产者消费者模型内置锁版

缓冲区 public class Storage { // 仓库最大存储量 private final int MAX_SIZE = 100; // 仓库存储的载体 private LinkedList<Object> list = new LinkedList<Object>(); // 生产产品 public v...

ConcurrentHashMap原理与使用

ConcurrentHashMap原理与使用

原理 ConcurrentHashMap采用分段锁,每一把锁锁住一段数据,这样在多线程访问不同段的数据时,不会存在锁竞争。 ConcurrentHashMap内部维护一个Segment数组segments和一个Node数组table。 Segment继承自ReentrantLock,代表一把重入锁。segments就是table所用到的所有锁。一个锁管理几个Node。 Node实现了M...

JNI原理与使用

JNI原理与使用

Java调用C++ Java调用C++的关键在于建立Java方法与C++方法的对应关系。这个关系建立在C++层。一般会在C++层中再抽象出一个JNI层,实际也是C++的代码。也就是JNI层的代码只负责建立对应关系,且在方法实现中转调实现具体逻辑的C++代码。 JNINativeMethod 结构体JNINativeMethod用来描述对应关系: typedef struct { ...

Android数据库

SQLite及其封装

SQLite 数据类型 NULL: 空值 VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。 CHAR(n):长度固定为n的字串,n不能超过 254。 INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8. REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号. TEXT: 值...

Android并发工具

HandlerThread、AsyncTask、IntentService

HandlerThread 原理 HandlerThread继承自Thread,在其执行体内会创建一个消息队列。 public void run() { // 创建MessageQueue Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); // 与...

Glide缓存

内存缓存、磁盘缓存、BitmapPool

内存缓存 接口MemoryCache。默认实现LruResourceCache。 public class LruResourceCache <Key, Resource> { // 缓存的容器。Linkedxxx.accessOrder置为true,天生带Lru性质。 private final LinkedHashMap<Key, Resource&...

Glide第三个过程

ResourceType -> TranscodeType

缩放 居中剪裁 TransformationUtils.centerCrop(): public static Bitmap centerCrop(Bitmap recycled, Bitmap toCrop, int width, int height) { if (toCrop == null) { return null; } else if (toC...

Glide第二个过程

DataType -> ResourceType

要缓存 首先获取缓存文件输出流os,把DataType(InputStream、或Bitmap、或GifDrawable)写入os;再获得文件输入流is,从中读出ResourceType。 将InputStream写入os public boolean encode(InputStream data, OutputStream os) { // ByteArrayPool是字节数组...