有趣的算法 - 布隆过滤器
现在假设一个需求:设计一个 url 黑名单系统,需求是 1 亿个 url 黑名单,每个 url 平均长度 30 字节,判断当前的 url 是否在黑名单中。
我们最先想到的可能时 HashSet,如果少量的 url,HashSet 有着 O(1) 的查询效率是首选的方案。但是面对 1 亿个 url,单单存储 value 就需要 2861MB 内存,显然不可取。而如果放到硬盘上进行数据库查询,面对近 3GB 的数据库,每次匹配都要查询的话,IO 操作本身就是瓶颈。
所以这时候引入了布隆过滤器。
将数组转换成 List 是日常开发十分常见的操作,对此 JDK 提供了一个非常好用的工具类:
1List list = Arrays.asList(array);
但是如果操纵 List 的内容的话,阿里规约会给出一个提示:
于是深入看了下,发现 Arrays.asList
有三个日常开发中容易坑人的地方。
日常开发中使用 HashMap 方法如下:
1Map<String, Object> HashMap = new HashMap<>();
但是阿里规约会提示有问题:
由此我们可以看一下 HashMap 初始化和扩容相关。
注:本文涉及了少许 HashMap 基础,由于与主线无关,不详讲。源码均加了些注释,注释无法解释清楚的地方放在源码之后论述。
Android 开发中耗时任务应该放在子线程中进行,否则会阻塞 UI 造成 ANR。但是如果直接创建子线程,阿里规约会提示:
关于禁止直接创建线程的原因如图,不再赘述。