如何求单链表的环入口点 - 龟兔赛跑法 - 动画解释

当单向链表中存在环的时候,遍历此链表会发生无限循环,无法到达末尾(入环后链表就不存在末尾了)的情况,所以在可能发生这种情况的时候,需要检查链表中是否存在一个环。

检查是链表是否存在环的方法就是「龟兔赛跑」法:乌龟和兔子同时从头节点开始遍历链表,兔子遍历的速度大于乌龟的速度,如果链表中存在环,兔子和乌龟就会先后进环,由于兔子的速度比乌龟快,他们必然会在环内相遇。

下面的动图解释了这一过程:

Linux 常用功能性命令

本文章用于检索在 Linux 系统下如何解决某一个问题,每个问题通常使用一个命令的不同参数或者多个命令的组合方式来实现,命令下方给出了简单的解释。可以通过每一个小标题来寻找自己的需求。

Linux 服务器/macOS 环境初始化

本手册适用于新创建的 Linux 服务器基本环境初始化,包括连接性能优化、Shell 脚本语言和 Vim 环境优化配置。

其中魔改 BBR 部分视情况开启,如果服务器需要用作高性能网络代理,可以开启提高性能,否则不必开启。BBR 开启只能在安装其他软件之前进行,若之后开启则会令安装的软件失效。

如只需要对服务器环境进行配置,不涉及到网络代理;以及本地环境的初始化配置。可直接跳转到 ¶环境配置:切换 Shell 部分开始。

Linux - 查看系统信息

在 Linux 系统下经常要查看各种信息,命令蛮多的,而且又是久不久用一次的那种,记不下来,每回找又麻烦,干脆自己写一份在博客里面,自己找起来也方便。

Linux - 进程管理

在 Linux 系统中,特别是没有 GUI 的发行版本里,与进程打交道是一件家常便饭的事情,能不能把进程管理玩溜了,完全可以决定你 Linux 系统的使用体验。今天,我们来看一看常见的进程管理工具和技巧。

Java - 对非不可变对象使用拷贝构造器

比起使用 clone 方法,在 Java 中拷贝一个对象更加简单的办法是使用拷贝构造器。比方说,我们的 Person 类中有如下的构造函数:

1
2
3
4
public Person(String name, int age) {
this.name = name;
this.age = age;
}

那么就可以有这样的拷贝构造器:

1
2
3
public Person(Person person) {
this(person.getName(), person.getAge());
}

该构造器可以使用和被拷贝对象同样的 nameage 属性,创建另一个 Person 对象。然而,必须要注意的是,拷贝不可变对象是完全没有必要的,所以我们只能用这种拷贝构造器来操作那些状态可变的对象。举例来说,只要 Person 类有这样的方法:

1
2
3
public void setName(String name) {
this.name = name;
}

那么就大可使用拷贝构造器。

更多资料,请参阅相关文档

Java - 双花括号初始化

相较于手动地初始化具有初始元素的 set、list 和 map,Java 提供了另外一种更直接和简便的方法来快速完成:双花括号初始化。例如下方的代码:

1
2
3
4
5
6
public Set<String> mySet = new HashSet<String>();
mySet.add("one");
mySet.add("two");
mySet.add("three");

someFunction(mySet);

就可以利用双花括号初始化简化成这样:

1
2
3
4
5
someFunction(new HashSet<String>() {{
add("one");
add("two");
add("three");
}});

更多资料,请查看相关文档

Java - 使用 WeakHashMap

WeakHashMap 是一种特别的 Map 实现,它的所有键都存储在 WeakReference 中。相较于 HashMapWeakHashMap 与其功能基本完全一致,除了唯一一个显著的差别:如果 Java 的内存管理器不再有某个键对象的强引用,那么这个条目就会被从该 Map 中移除。

我们这样来创建一个 WeakHashMap

1
HashMap map = new WeakHashMap();

我们可以通过引用某些对象的方式使用 WeakHashMap 来保存资源,但是同时允许这个资源在没有引用的时候被 Java 的垃圾回收器回收:

1
System.gc();

所以大家普遍认为,可以通过 WeakHashMap 来解决缓存问题,因为当引用过期之后就会被丢弃。

这个类的另一种用法是创建 canonical map,你可以存储额外的属性在某个对象里面,因为当它们过期之后,WeakHashMap 的相应条目就会立马被丢弃。

关于 WeakHashMap 的使用例子,请阅读参考资料

Java - 工具类和静态方法

工具类定义了一组通用的、功能复用的方法,它们不依赖于任何的对象,所以这些方法应该用 static 关键字声明成静态的

1
2
3
4
5
6
7
8
public class Utility {
private Utility() {
}
public static multiply(int a, int b) {
return a * b;
}
...
}

上面的例子中,multiply 方法就是静态的,所以我们不必生成任何 Utility 类的实例来调用该方法。

为了防止 Utility 类被调用于实例化,我们可以将构造函数private 关键字定义成私有的

更多关于静态方法的内容,请参阅相关文档

Linux - 用户与权限

使用 Linux 系统,不免会和用户权限打交道,本文介绍了根权限和文件的权限属性等概念和应用。