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 系统,不免会和用户权限打交道,本文介绍了根权限和文件的权限属性等概念和应用。

Linux - Iptable 的使用

ipatable 是 Linux 内核自带的防火墙解决方案。它通过对经由网络的每一个包进行一系列的规则验证来决定该如何处理。

我们可以匹配协议类型源地址目的地址或者端口、接口以及它们和之前的包的关系等等。这些规则会被进一步的结构化成为规则链,网络包将会顺序地被规则链中的规则一一检查。它们可以被按需生成,但是有3种默认的规则:

  • INPUT:处理流入服务器的流量。
  • OUTPUT:处理流出服务的流量。
  • FORWARD:处理流经服务器的流量而不停止它们。

Java - 在泛型中使用受限类型参数

许多时候在 Java 中使用泛型是非常方便且必要的,但是我们不可能接受所有类型的参数来确保泛型的每一个功能都能得到维护。

为了解决这个问题,我们可以使用受限类型参数来限制泛型只能接受特定类型的实参。

1
2
3
4
5
6
public <T extends Shape> 
void drawAll(List<T> shapes){
for (Shape s: shapes) {
s.draw(this);
}
}

上面这个方法是用来绘制一组形状(Shape)的,如果我们使用不受限类型参数的泛型来实现这个方法的话,有可能导致的问题是其他类型可能并不能并不具备 draw() 方法。

通过指定 <T extends Shape> 我们可以确保只有 Shape 的子类可以被传递到这个方法中来。

关于这一部分的更多内容,详见官方文档