示例

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
       .maximumSize(1000)
       .expireAfterWrite(10, TimeUnit.MINUTES)
       .removalListener(MY_LISTENER)
       .build(
           new CacheLoader<Key, Graph>() {
             public Graph load(Key key) throws AnyException {
               return createExpensiveGraph(key);
             }
           });

适用性

缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。

- 阅读剩余部分 -

单例模式

单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。

- 阅读剩余部分 -

在 Windows 上安装完 VirtualBox, 需要在虚拟机内部启用虚拟化等等操作, 要打开 启用嵌套 VT-x/AMD-V 的配置, 发现该选项被置灰

VirtualBox VT-x

经过一番搜素后, 是因为从 Windows 8 开始已经默认启用 Hyper-V, 而 VirtualBox 和 Hyper-V 同时存在时有冲突, 导致 VirtualBox 关闭了部分增强功能, 启用嵌套 VT-x/AMD-V 也即在此列.

除了开启 BIOS Intel Virtualization Technology选项, 需要禁用掉 Hyper-V.

使用 Win + X 快捷键, 打开快捷面板, 选择 Windows Powershell(管理员)(A), 使用下述命令禁用掉 Hyper-V.

bcdedit /set hypervisorlaunchtype off 

- 阅读剩余部分 -

在使用 virt-install 创建虚拟机的过程中,出现下面的错误

ERROR internal error: qemu unexpectedly closed the monitor: 2019-01-23T11:02:36.048859Z qemu-kvm: -chardev pty,id=charserial0: Failed to create PTY: Operation not permitted

日志显示 chardev 设备创建错误, 确认 /dev/pts 设备不存在(也可能是权限错误), 因此解决办法是, 重新构建对应的设备描述文件.
/etc/fstab 配置/dev/pts设备的挂载信息,重新remount /dev/pts 设备.

添加下述内容到 /etc/fstab

devpts /dev/pts devpts gid=5,mode=620 0 0

- 阅读剩余部分 -

我们在使用 virt-install 构建虚拟机需要指定操作系统类型, 在配置之前, 我们需要了解到底有哪些可选值, 查阅了下, 可以使用 osinfo-query 来完成.

这里我们使用到了两个命令, 需要安装 virt-installosinfo-query

安装 virt-install

REHL/CentOS

yum -y install virt-install

Debian/Ubuntu

apt -y install virtinst

- 阅读剩余部分 -

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到 {\displaystyle O(1)} {\displaystyle O(1)}的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

概述

Insertion Sort和打扑克牌时,从牌桌上逐一拿起扑克牌,在手上排序的过程相同。

举例:

Input: {5 2 4 6 1 3}。

首先拿起第一张牌, 手上有 {5}。

拿起第二张牌 2, 把 2 insert 到手上的牌 {5}, 得到 {2 5}。

拿起第三张牌 4, 把 4 insert 到手上的牌 {2 5}, 得到 {2 4 5}。

以此类推。

- 阅读剩余部分 -

任何对 JDK 集合框架有经验的程序员都熟悉和喜欢 java.util.Collections 包含的工具方法。Guava 沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法。这是 Guava 最流行和成熟的部分之一。

我们用相对直观的方式把工具类与特定集合接口的对应关系归纳如下:

接口JDK or GuavaGuava工具类
CollectionJDKCollections2:不要和 java.util.Collections 混淆
ListJDKLists
SetJDKSets
SortedSetJDKSets
MapJDKMaps
SortedMapJDKMaps
QueueJDKQueues
MultisetGuavaMultisets
MultimapGuavaMultimaps
BiMapGuavaMaps
TableGuavaTables

- 阅读剩余部分 -

简介

有时候你需要实现自己的集合扩展。也许你想要在元素被添加到列表时增加特定的行为,或者你想实现一个Iterable,其底层实际上是遍历数据库查询的结果集。Guava为你,也为我们自己提供了若干工具方法,以便让类似的工作变得更简单。

Forwarding装饰器

针对所有类型的集合接口,Guava都提供了Forwarding抽象类以简化装饰者模式的使用。

Forwarding抽象类定义了一个抽象方法:delegate(),你可以覆盖这个方法来返回被装饰对象。所有其他方法都会直接委托给delegate()。例如说:ForwardingList.get(int)实际上执行了delegate().get(int)。

通过创建ForwardingXXX的子类并实现delegate()方法,可以选择性地覆盖子类的方法来增加装饰功能,而不需要自己委托每个方法——译者注:因为所有方法都默认委托给delegate()返回的对象,你可以只覆盖需要装饰的方法。

此外,很多集合方法都对应一个”标准方法[standardxxx]”实现,可以用来恢复被装饰对象的默认行为,以提供相同的优点。比如在扩展AbstractList 或JDK中的其他骨架类时,可以使用类似standardAddAll这样的方法。

让我们看看这个例子。假定你想装饰一个List,让其记录所有添加进来的元素。当然,无论元素是用什么方法——add(int, E), add(E), 或 addAll(Collection)——添加进来的,我们都希望进行记录,因此我们需要覆盖所有这些方法。

- 阅读剩余部分 -

Linux 命令行环境下, 文本终端一般为 Bash Shell, 而在图形环境下, 图形化的终端程序还可以给我们提供一些更加便利的快捷键, 便于我们和终端进程交互:

  • Ctrl + Shift + c 拷贝
  • Ctrl + Shift + v 粘贴
  • Shift + Page Up 终端界面向上滚动, 类似通过鼠标滚轮将终端往上滚动
  • Shift + Page Down 终端界面向下滚动, 类似通过鼠标滚轮将终端往下滚动
  • Shift + Home 跳转到终端历史最顶端
  • Shift + End 跳转熬终端界面最底部
  • Ctrl + Page Up 跳转到前一个终端
  • Ctrl + Page Down 跳转到下一个终端
  • Alt + 1 快速定位到第一个终端, 类似 Firefox/Chrome
  • Alt + 2 快速定位到第二个终端
  • Ctrl + Shift + t 打开新的终端
  • Ctrl + Shift + w 关闭当前终端

- 阅读剩余部分 -

在我们使用 Linux 系统中, 经常需要对机器进程关机/重启/休眠等等操作, 一般都是通过系统的关机/重启/休眠等指令来完成, 这样保证整个过程是系统优雅的关闭,类似编写代码的Graceful Code, 因为这样服务才能完整的走完生命周期, 比如启动后部分数据在内存, 通过系统内关机命令来优雅的关闭, 那进程收到这个信号后, 将内存的数据 flush 到磁盘甚至远端,以便数据安全完整的存储下来.如果强制关闭或者关闭电源, 那这部分为保存的数据就有可能丢失, 影响后续工作的完成.只有在极端情况下, OS 除了极端问题, 硬件除了极端问题,只能通过关闭电源才能进行后续操作, 才建议使用电源重置的模式来重启, 一般情况下, 还是尽量优美的关机吧.

- 阅读剩余部分 -