有趣的算法 - 布隆过滤器

2019-10-30

引言

现在假设一个需求:设计一个 url 黑名单系统,需求是 1 亿个 url 黑名单,每个 url 平均长度 30 字节,判断当前的 url 是否在黑名单中。

我们最先想到的可能时 HashSet,如果少量的 url,HashSet 有着 O(1) 的查询效率是首选的方案。但是面对 1 亿个 url,单单存储 value 就需要 2861MB 内存,显然不可取。而如果放到硬盘上进行数据库查询,面对近 3GB 的数据库,每次匹配都要查询的话,IO 操作本身就是瓶颈。

所以这时候引入了布隆过滤器。

从阿里规约谈起 - Arrays.asList 三坑

前言

将数组转换成 List 是日常开发十分常见的操作,对此 JDK 提供了一个非常好用的工具类:

1List list = Arrays.asList(array);

但是如果操纵 List 的内容的话,阿里规约会给出一个提示:

使用 asList 的问题

于是深入看了下,发现 Arrays.asList 有三个日常开发中容易坑人的地方。

从阿里规约谈起 - HashMap 初始化和扩容相关

引言

日常开发中使用 HashMap 方法如下:

1Map<String, Object> HashMap = new HashMap<>();

但是阿里规约会提示有问题:

未指定初始化容量

由此我们可以看一下 HashMap 初始化和扩容相关。

注:本文涉及了少许 HashMap 基础,由于与主线无关,不详讲。源码均加了些注释,注释无法解释清楚的地方放在源码之后论述。

从阿里规约谈起 - 禁用 Executors 创建线程池

前言

Android 开发中耗时任务应该放在子线程中进行,否则会阻塞 UI 造成 ANR。但是如果直接创建子线程,阿里规约会提示:

直接使用子线程报错

关于禁止直接创建线程的原因如图,不再赘述。