Home

Java 里的构造函数需要加锁吗

写 Java 代码时,我们经常会用到 synchronized 关键字。synchronized 是一种相对重量级的锁,常见用法有两种。 对一个具体的变量加锁。 12345678Logger l = LoggerFactory.getLogger(getClass().getName());synchronized (l) { // do something}synch

双向链表和哈希表实现 LRUCache

背景LRUCache 是一个很常用的缓存实现,本文会首先介绍一下 LRUCache 的定义,然后尝试用 Python 实现它。 定义LRUCache 首先是一个 Cache,那么对于一个 Cache 而言,肯定需要提供 get 和 set 两个方法,而且,这两个方法的时间复杂度越低越好,最好达到 O(1) 级别。 LRU 是 Least Recently Used 的缩写,近期最少使用策略。LRU

Android 中设置界面的思考

引言在 Android™ 中大部分应用都需要一个 系统设置 界面,有很多开发者(或者开发组)都喜欢自己做一个 Activity 或者 Fragment 作为设置界面。但是谷歌本来就为 Android™ 的设置界面提供了一个解决方案,那就是 PreferenceFragment(PreferenceActivity 已经不推荐使用)。 遗憾的是,由于 Android™ 设备的碎片化,同样的代码,在不

在Ubuntu下录制屏幕GIF

Ubuntu 是一个十分完善的 Linux 发行版,目前也是我的主要生产力工具栖息的地方,不像 Windows 或者 OS X,Ubuntu 现在没有一种非常完备的屏幕 GIF 录制工具,今天稍微折腾了一小会,总结一套比较方便完美的解决方案 安装 byzanz在我的 Ubuntu 14.04 LTS 当中,byzanz 不需要添加源1sudo apt-get install byzanz 如果

简明数据结构

数据结构是一门重要的计算机基础课,知识点多且难度不小,这里整理了数据结构中比较容易遗忘的内容。 在这篇博客中,我尽量用我认为最容易理解的方式描述算法,力求简明扼要;相关代码可能不完整,如有兴趣欢迎访问我的 GitHub。 字符串快速匹配 - KMP 求解 next 数组(即部分匹配值) 123456789int q = 1, k = 0;next[0] = 0;for (q = 1; q &l

记一次使用 RxJava 重构的经历

前言垃圾代码时常会出现在时间不够的情况下,所以重构是一件非常重要非常有意义的事情。 需求我们的 Studio 项目中需要上传头像的功能,所以选择了一个开源库 PhotoPicker 来做图片的选择。通过这个库我们就可以在Activity # onActivityResult 方法来获取用户选择的图片地址,然后通过 LeanCloud 的 AVFile 来进行上传。 原来的实现12345678910

使用二分法求整数幂

引言在实际应用中,求幂是一种常用的运算。那么在求幂时,我们是不是经常这样写: 1234567int power(int x, int n){ int result = 1; while (n--) result *= x; return result;} 这种写法简单直观,但时间复杂度较高。 解决思路为了降低时间开销,我们可以使用二分法。 举个