西维蜀黍

🐒 Software engineer | 📷Photographer | 👹Urban explorer

  • 主页
  • 所有文章
Tag Friends

西维蜀黍

🐒 Software engineer | 📷Photographer | 👹Urban explorer

  • 主页
  • 所有文章

【Java】装箱(Boxing)与拆箱(Unboxing)

2019-03-11

背景

基本数据类型

基本类型,或者叫做内置类型,是 Java 中不同于类(Class)的特殊类型。它们是我们编程中使用最频繁的类型。

Java 是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化。

Java 基本类型共有八种,基本类型可以分为三类:

  • 字符类型 char
  • 布尔类型 boolean
  • 数值类型:
    • 整型:byte、short、int、long
    • 浮点型:float、double

Java 中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。

实际上,Java 中还存在另外一种基本类型 void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。

基本数据类型有什么好处

我们都知道在 Java 语言中,new 一个对象是存储在堆里的,我们通过栈中的引用来使用这些对象;所以,对象本身来说是比较消耗资源的。

对于经常用到的类型,如 int 等,如果我们每次使用这种变量的时候都需要 new 一个 Java 对象的话,就会比较笨重。所以,和 C++ 一样,Java 提供了基本数据类型,这种数据的变量不需要使用 new 创建,他们不会在堆上创建,而是直接在栈内存中存储,因此会更加高效。

包装类(Wrapper Class)

Java 语言是一个面向对象的语言,但是 Java 中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。

包装类均位于 java.lang 包,包装类和基本数据类型的对应关系如下表所示

基本数据类型 包装类
byte Byte
boolean Boolean
short Short
char Character
int Integer
long Long
float Float
double Double

在这八个类名中,除了 Integer 和 Character 类以后,其它六个类的类名和基本数据类型一致,只是类名的第一个字母大写即可。

为什么需要包装类

很多人会有疑问,既然 Java 中为了提高效率,提供了八种基本数据类型,为什么还要提供包装类呢?

这个问题,其实前面已经有了答案,因为 Java 是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型。比如,在集合类中,我们是无法将 int 、double 等类型放进去的。因为集合的容器要求元素是 Object 类型。

为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型 “包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

什么是装箱(Boxing)和拆箱(Unboxing)?

那么,有了基本数据类型和包装类,肯定有些时候要在他们之间进行转换。比如把一个基本数据类型的 int 转换成一个包装类型的 Integer 对象。

我们认为包装类是对基本类型的包装,所以,把基本数据类型转换成包装类的过程就是打包装,英文对应于 boxing,中文翻译为装箱。

反之,把包装类转换成基本数据类型的过程就是拆包装,英文对应于 unboxing,中文翻译为拆箱。


在 Java SE5 之前,如果要生成一个数值为 10 的 Integer 对象,必须这样进行:

1
Integer i = new Integer(10);

自动拆箱与自动装箱

而在从 Java SE5 开始就提供了自动装箱的特性,如果要生成一个数值为 10 的 Integer 对象,只需要这样就可以了:

1
Integer i = 10;

这个过程中会自动根据数值创建对应的 Integer 对象,这就是自动装箱(auto-boxing)。

那什么是自动拆箱(auto-unboxing)呢?顾名思义,跟装箱对应,就是自动将包装器类型转换为基本数据类型。

比如

1
2
Integer i = 10;  //自动装箱
int n = i; //自动拆箱

简单一点说,

  • 自动装箱就是自动将基本数据类型转换为包装器类型;
  • 自动拆箱就是自动将包装器类型转换为基本数据类型。

自动装箱和自动拆箱的实现原理

Interger 类的自动装箱 / 拆箱

我们以 Interger 类为例,下面看一段代码:

1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
Integer i = 10;
int n = i;
}
}

对 .class 文件进行 javap 之后得到如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class com.concretepage.lang.VolatileTest {
public com.concretepage.lang.VolatileTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
0: bipush 10
2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: aload_1
7: invokevirtual #3 // Method java/lang/Integer.intValue:()I
10: istore_2
11: return
}

从反编译得到的字节码内容可以看出,int 的自动装箱都是通过 Integer.valueOf() 方法来实现的,Integer 的自动拆箱都是通过 integer.intValue 来实现的。

对源代码进行反编译后,可以得到以下代码:

1
2
3
4
public static  void main(String[]args){
Integer integer=Integer.valueOf(1);
int i=integer.intValue();
}

这也应证了我们上面的分析。

其他包装类的自动装箱 / 拆箱

其他的也类似,比如 Double、Character,不相信的朋友可以自己手动尝试一下。

因此可以用一句话总结装箱和拆箱的实现过程:

装箱过程是通过调用包装器的 valueOf 方法实现的,而拆箱过程是通过调用包装器的 xxxValue 方法实现的(xxx 代表对应的基本数据类型)。

哪些地方会自动拆 / 装箱

下表是基本数据类型对应的包装器类型:

int(4 字节) Integer
byte(1 字节) Byte
short(2 字节) Short
long(8 字节) Long
float(4 字节) Float
double(8 字节) Double
char(2 字节) Character
boolean(未定) Boolean

当表格中左边列出的基础类型与它们的包装类有如下几种情况时,编译器会自动帮我们进行装箱或拆箱:

  • 进行 = 赋值操作(装箱或拆箱)
  • 进行 +,-,*,/ 混合运算 (拆箱)
  • 进行 >,<,== 比较运算(拆箱)
  • 调用 equals 进行比较(装箱)
  • 对 ArrayList,HashMap 等集合类的添加基础类型数据时(装箱)

场景一 将基本数据类型放入集合类

我们知道,Java 中的集合类只能接收对象类型,那么以下代码为什么会不报错呢?

1
2
3
4
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i ++){
li.add(i);
}

将上面代码进行反编译,可以得到以下代码:

1
2
3
4
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2){
li.add(Integer.valueOf(i));
}

以上,我们可以得出结论,当我们把基本数据类型放入集合类中的时候,会进行自动装箱。

场景二 包装类型和基本类型的大小比较

有没有人想过,当我们对 Integer 对象与基本类型进行大小比较的时候,实际上比较的是什么内容呢?看以下代码:

1
2
3
4
Integer a=1;
System.out.println(a==1?"等于":"不等于");
Boolean bool=false;
System.out.println(bool?"真":"假");

对以上代码进行反编译,得到以下代码:

1
2
3
4
Integer a=1;
System.out.println(a.intValue()==1?"等于":"不等于");
Boolean bool=false;
System.out.println(bool.booleanValue?"真":"假");

可以看到,包装类与基本数据类型进行比较运算,是先将包装类进行拆箱成基本数据类型,然后进行比较的。

场景三 包装类型的运算

有没有人想过,当我们对 Integer 对象进行四则运算的时候,是如何进行的呢?看以下代码:

1
2
3
Integer i = 10;
Integer j = 20;
System.out.println(i+j);

反编译后代码如下:

1
2
3
Integer i = Integer.valueOf(10);
Integer j = Integer.valueOf(20);
System.out.println(i.intValue() + j.intValue());

我们发现,两个包装类型之间的运算,会被自动拆箱成基本类型进行。

场景四 三目运算符的使用

这是很多人不知道的一个场景,作者也是一次线上的血淋淋的 Bug 发生后才了解到的一种案例。看一个简单的三目运算符的代码:

1
2
3
4
boolean flag = true;
Integer i = 0;
int j = 1;
int k = flag ? i : j;

很多人不知道,其实在 int k = flag ? i : j; 这一行,会发生自动拆箱。反编译后代码如下:

1
2
3
4
5
boolean flag = true;
Integer i = Integer.valueOf(0);
int j = 1;
int k = flag ? i.intValue() : j;
System.out.println(k);

这其实是三目运算符的语法规范。当第二,第三位操作数分别为基本类型和对象时,其中的对象就会拆箱为基本类型进行操作。

因为例子中,flag ? i : j; 片段中,第二段的 i 是一个包装类型的对象,而第三段的 j 是一个基本类型,所以会对包装类进行自动拆箱。如果这个时候 i 的值为 null,那么久会发生 NullPointerException。

场景五、函数参数与返回值

这个比较容易理解,直接上代码了:

1
2
3
4
5
6
7
8
//自动拆箱
public int getNum1(Integer num) {
return num;
}
//自动装箱
public Integer getNum2(int num) {
return num;
}

缓存池

new Integer (123) 与 Integer.valueOf (123) 的区别在于:

  • new Integer (123) 每次都会新建一个对象;
  • Integer.valueOf (123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
1
2
3
4
5
6
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // trueCopy to clipboardErrorCopied

valueOf () 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。

自动拆装箱与缓存

Java SE 的自动拆装箱还提供了一个和缓存有关的功能,我们先来看以下代码,猜测一下输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String... strings) {

Integer integer1 = 3;
Integer integer2 = 3;

if (integer1 == integer2)
System.out.println("integer1 == integer2");
else
System.out.println("integer1 != integer2");

Integer integer3 = 300;
Integer integer4 = 300;

if (integer3 == integer4)
System.out.println("integer3 == integer4");
else
System.out.println("integer3 != integer4");
}

我们普遍认为上面的两个判断的结果都是 false。虽然比较的值是相等的,但是由于比较的是对象,而对象的引用不一样,所以会认为两个 if 判断都是 false 的。在 Java 中,== 比较的是对象应用,而 equals 比较的是值。所以,在这个例子中,不同的对象有不同的引用,所以在进行比较的时候都将返回 false。奇怪的是,这里两个类似的 if 条件判断返回不同的布尔值。

上面这段代码真正的输出结果:

1
2
integer1 == integer2
integer3 != integer4

原因就和 Integer 中的缓存机制有关。在 Java 5 中,在 Integer 的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用:

  • 适用于整数值区间 - 128 至 +127。
  • 只适用于自动装箱。使用构造函数创建对象不适用。

我们只需要知道,当需要进行自动装箱时,如果数字在 - 128 至 127 之间时,会直接使用缓存中的对象,而不是重新创建一个对象。

其中的 javadoc 详细的说明了缓存支持 - 128 到 127 之间的自动装箱过程。最大值 127 可以通过 -XX:AutoBoxCacheMax=size 修改。

实际上这个功能在 Java 5 中引入的时候,范围是固定的 - 128 至 +127。后来在 Java 6 中,可以通过 java.lang.Integer.IntegerCache.high 设置最大值。

这使我们可以根据应用程序的实际情况灵活地调整来提高性能。到底是什么原因选择这个 - 128 到 127 范围呢?因为这个范围的数字是最被广泛使用的。 在程序中,第一次使用 Integer 的时候也需要一定的额外时间来初始化这个缓存。

面试中相关的问题

虽然大多数人对装箱和拆箱的概念都清楚,但是在面试和笔试中遇到了与装箱和拆箱的问题却不一定会答得上来。下面列举一些常见的与装箱 / 拆箱有关的面试题。

问题 1

下面这段代码的输出结果是什么?

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
public static void main(String[] args) {

Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;

System.out.println(i1==i2);
System.out.println(i3==i4);
}
}

事实上输出结果是:

1
2
true
false

为什么会出现这样的结果?输出结果表明 i1 和 i2 指向的是同一个对象,而 i3 和 i4 指向的是不同的对象。此时只需一看源码便知究竟,下面这段代码是 Integer 的 valueOf 方法的具体实现:

1
2
3
4
5
6
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}

而其中 IntegerCache 类的实现为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private static class IntegerCache {
static final int high;
static final Integer cache[];

static {
final int low = -128;

// high value may be configured by property
int h = 127;
if (integerCacheHighPropValue != null) {
// Use Long.decode here to avoid invoking methods that
// require Integer's autoboxing cache to be initialized
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}

private IntegerCache() {}
}

从这 2 段代码可以看出,在通过 valueOf 方法创建 Integer 对象的时候,如果数值在 [-128,127] 之间,便返回指向 IntegerCache.cache 中已经存在的对象的引用;否则创建一个新的 Integer 对象。

上面的代码中 i1 和 i2 的数值为 100,因此会直接从 cache 中取已经存在的对象,所以 i1 和 i2 指向的是同一个对象,而 i3 和 i4 则是分别指向不同的对象。

问题 2

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
public static void main(String[] args) {

Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;

System.out.println(i1==i2);
System.out.println(i3==i4);
}
}

实际输出结果为:

1
2
false
false

为什么 Double 类的 valueOf 方法会采用与 Integer 类的 valueOf 方法不同的实现?

很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。

注意,Integer、Short、Byte、Character、Long 这几个类的 valueOf 方法的实现是类似的。

Double、Float 的 valueOf 方法的实现是类似的。

问题 3

下面这段代码输出结果是什么:

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
public static void main(String[] args) {

Boolean i1 = false;
Boolean i2 = false;
Boolean i3 = true;
Boolean i4 = true;

System.out.println(i1==i2);
System.out.println(i3==i4);
}
}s

输出结果是:

1
2
true
true

至于为什么是这个结果,同样地,看了 Boolean 类的源码也会一目了然。下面是 Boolean 的 valueOf 方法的具体实现:

1
2
3
4
5
6
7
8
9
10
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
public static final Boolean TRUE = new Boolean(true);

/**
* The <code>Boolean</code> object corresponding to the primitive
* value <code>false</code>.
*/
public static final Boolean FALSE = new Boolean(false);

问题 4 - ”==“的含义

这是一个比较容易出错的地方,”==“可以用于字面量的比较,也可以用于对象的比较。

当用于字面量与字面量之间比较时,比较的是字面量值本身是否相等。

当用于字面量与对象之间比较时,会先将包装类对象进行自动拆箱(autounboxing)操作,此后比较的是字面量值本身是否相等。

而当用于对象与对象之间比较时,比较的不是对象代表的值,而是检查两个对象(在堆中)是否是同一对象,这个比较过程中没有自动装箱发生。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class AutoboxingTest {

public static void main(String args[]) {

// Example 1: == comparison pure primitive – no autoboxing
int i1 = 1;
int i2 = 1;
System.out.println("i1==i2 : " + (i1 == i2)); // true

// Example 2: equality operator mixing object and primitive
Integer num1 = 1; // autoboxing
int num2 = 1;
System.out.println("num1 == num2 : " + (num1 == num2)); // true

// Example 3: special case - arises due to autoboxing in Java
Integer obj1 = 1; // autoboxing will call Integer.valueOf()
Integer obj2 = 1; // same call to Integer.valueOf() will return same
// cached Object

System.out.println("obj1 == obj2 : " + (obj1 == obj2)); // true

// Example 4: equality operator - pure object comparison
Integer one = new Integer(1); // no autoboxing
Integer anotherOne = new Integer(1);
System.out.println("one == anotherOne : " + (one == anotherOne)); // false

}
}

自动装 / 拆箱的性能问题

我们来看看 Integer i = new Integer (xxx) 和 Integer i =xxx; 这两种方式的区别:

  • 第一种方式不会触发自动装箱的过程;而第二种方式会触发;
  • 在执行效率和资源占用上的区别。第二种方式的执行效率和资源占用在一般性情况下要优于第一种情况(注意这并不是绝对的)。

例子

如果我告诉你:“只要修改一个字符,下面这段代码的运行速度就能提高 5 倍。”,你觉得可能么?

1
2
3
4
5
6
7
long t = System.currentTimeMillis();
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println("total:" + sum);
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms");

输出结果:

总数:2305843005992468481
处理时间:6756 ms


仔细琢磨一下,你可能会想到下面这种执行速度更快的实现方法:

1
2
3
4
5
6
7
8
long t = System.currentTimeMillis();
//Long sum = 0L;
long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println("total:" + sum);
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms") ;

输出结果:

总数:2305843005992468481
处理时间:1248 ms

分析

事实上,第一段代码段会自动转化为如下代码。所以,导致处理时间较长的原因也就水落石出了:不必要地创建了 2147483647 个”Long“类型实例。

1
2
3
4
5
6
7
long t = System.currentTimeMillis();
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += new Long(i);
}
System.out.println("total:" + sum);
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms") ;

Reference

  • 深入剖析 Java 中的装箱和拆箱 - https://www.cnblogs.com/dolphin0520/p/3780005.html
  • Java 中的自动装箱与拆箱 - https://droidyue.com/blog/2015/04/07/autoboxing-and-autounboxing-in-java/
  • 5 分钟彻底理解 - Java 自动装箱、拆箱 - https://juejin.im/post/5b5183e7e51d451912531cb5
  • Java 性能要点:自动装箱 / 拆箱 (Autoboxing / Unboxing) - http://blog.oneapm.com/apm-tech/635.html
  • 一文读懂什么是 Java 中的自动拆装箱 - https://juejin.im/post/5b8de48951882542d63b4662
  • Java
  • Java

扫一扫,分享到微信

【Java】String - String,StringBuilder 和 StringBuffer
【Java】String - String 类和常量池
© 2020 西维蜀黍
  • Tag
  • Friends

tag:

  • Algorithm Problem
  • AWS
  • Algorithm
  • Architectural Pattern
  • Architecture
  • ArchitectureDesign
  • Nginx
  • Frontend
  • Cache
  • Browser
  • C#
  • Debug
  • Visual Studio
  • Cache System
  • Compile
  • Data Structure
  • JavaScript
  • Data Format
  • Database
  • Design Pattern
  • Distributed System
  • Microservices
  • Django
  • Redis
  • Docker
  • ELK
  • Format
  • Git
  • Version Control
  • Golang
  • HTTP
  • Network
  • Hardware
  • Interview
  • JQuery
  • Java EE
  • Software Testing
  • Java
  • Network Programming
  • LaTeX
  • Linux
  • Operating System
  • Linxu
  • Lock
  • macOS
  • Markdown
  • Lucene
  • Mattermost
  • MySQL
  • Netwok
  • Netwrok
  • Node.js
  • nvm
  • NPM
  • npm
  • OOP
  • OpenWrt
  • Operating Systems
  • Performancede
  • Performance
  • Programming
  • Protobuf
  • Python
  • RaspbeeryPi
  • Codis
  • SQL
  • Regular Expression
  • Security
  • Spring
  • TypeScript
  • VMware
  • Vmware
  • Windows
  • WordPress
  • VPN
  • hexo
  • ZooKeeper
  • iOS
  • hugo

    缺失模块。
    1、在博客根目录(注意不是 yilia 根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    2、在根目录_config.yml 里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: true
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 【Microservices】Service Mesh(服务网格)

    2020-08-22

    #Microservices

  • 【Golang】性能分析 - 监控 Golang 程序的垃圾回收

    2020-08-22

    #Golang

  • 【Golang】性能分析 - PProf

    2020-08-15

    #Golang

  • 【Linux】命令 - date

    2020-08-09

    #Linux

  • 【Python】Python3 的时间

    2020-08-09

    #Python

  • 【Python】Log Framework - logging

    2020-08-09

    #Python

  • 【hugo】使用

    2020-08-09

    #hugo

  • 【Python】Django - Django Shell

    2020-08-09

    #Python

  • 【Python】安装 Python

    2020-08-06

    #Python

  • 【Python】升级 Python 版本

    2020-08-06

    #Python

  • 【Golang】关键字 - defer

    2020-08-02

    #Golang

  • 【Golang】初始化(Intialization)

    2020-08-02

    #Golang

  • 【Golang】类型 - string

    2020-08-02

    #Golang

  • 【Golang】文档

    2020-08-02

    #Golang

  • 【Golang】编译 - 交叉编译(Cross Compilation)

    2020-08-02

    #Golang

  • 【Golang】关键字 - const

    2020-08-02

    #Golang

  • 【Protobuf】Protocol Buffers 性能

    2020-07-31

    #Protobuf

  • 【Protobuf】Protocol Buffers Demo

    2020-07-31

    #Protobuf

  • 【Golang】位运算

    2020-07-31

    #Golang

  • 【Protobuf】Protocol Buffers Convention Guide

    2020-07-29

    #Protobuf

  • 【Protobuf】Protocol Buffers 深入

    2020-07-28

    #Protobuf

  • 【Linux】命令 - nohup 命令

    2020-07-28

    #Linux

  • 【Microservices】服务调用

    2020-07-26

    #Microservices

  • 【Microservices】常见服务注册 / 发现实现框架

    2020-07-26

    #Microservices

  • 【VPN】Terminal 运行 Cisco AnyConnect VPN

    2020-07-26

    #VPN

  • 【Microservices】微服务 - 服务注册(Service Registry)和服务发现(Service Discovery)

    2020-07-26

    #Microservices

  • 【ZooKeeper】学习

    2020-07-25

    #ZooKeeper

  • 【ZooKeeper】安装

    2020-07-25

    #ZooKeeper

  • 【Java】安装

    2020-07-25

    #Java

  • 【Redis】Codis 安装

    2020-07-25

    #Cache System#Redis#Codis

  • 【Golang】Golang 安装

    2020-07-23

    #Golang

  • 【Performance】Prometheus - Exporter - Redis Exporter

    2020-07-23

    #Performancede

  • 【Performance】Prometheus 深入

    2020-07-23

    #Performance

  • 【Linux】安装 oh-my-zsh

    2020-07-23

    #Linux

  • 【Performance】Promethues - Exporter

    2020-07-22

    #Performance

  • 【Performance】Prometheus - Node Exporter

    2020-07-22

    #Performance

  • 【Performance】Prometheus 初入

    2020-07-22

    #Performance

  • 【Performance】Grafana 学习

    2020-07-22

    #Performance

  • 【Software Testing】App 自动化测试框架 - Appium

    2020-07-15

    #Software Testing

  • 【Software Testing】App 自动化测试框架

    2020-07-15

    #Software Testing

  • 【Protobuf】Protocol Buffers 2 中使用 map

    2020-07-12

    #Protobuf

  • 【Cache System】Redis Cluster

    2020-07-10

    #Cache System#Redis

  • 【Cache System】Redis 集群方案

    2020-07-10

    #Cache System#Redis

  • 【Redis】Codis Pipeline

    2020-07-10

    #Cache System#Redis#Codis

  • 【Mattermost】webhook

    2020-07-09

    #Mattermost

  • 【ELK】ELK(Elasticsearch+Logstash+Kibana)学习

    2020-07-07

    #ELK

  • 【Lucene】Lucene 语法

    2020-07-06

    #Lucene

  • 【MySQL】将执行结果输出到文件

    2020-07-06

    #MySQL

  • 【Golang】通过私有库安装依赖

    2020-07-06

    #Golang

  • 【Golang】生成随机数

    2020-07-06

    #Golang

  • 【Git】忽略已经提交的文件

    2020-07-06

    #Git

  • 【Golang】gvm - Golang 版本管理

    2020-07-06

    #Golang

  • 【Golang】代码检查

    2020-07-06

    #Golang

  • 【Golang】幽灵变量(Shadowed Variables)

    2020-07-06

    #Golang

  • 【OpenWrt】OpenWrt 学习

    2020-07-03

    #OpenWrt

  • 【Network】路由(Route)

    2020-06-27

    #Network

  • 【macOS】移除默认输入法

    2020-06-27

    #macOS

  • 【Network】NAT

    2020-06-27

    #Network

  • 【Vmware】安装 VMware EXSI 6.7

    2020-06-27

    #Vmware

  • 【OpenWrt】查看 CPU 温度

    2020-06-21

    #OpenWrt

  • 【Network】tcpdump 抓包

    2020-06-20

    #Network

  • 【Linux】修改 MAC 地址

    2020-06-20

    #Linux

  • 【Linux】查看网络信息

    2020-06-20

    #Linux

  • 【Linux】查看网络接口(Network Interface)

    2020-06-20

    #Linux

  • 【OpenWrt】MacOS 下红米路由器 AC2100 刷 OpenWrt

    2020-06-20

    #OpenWrt

  • 【Golang】Golang 遍历 map 时 key 随机化问题

    2020-06-14

    #Golang

  • 【hexo】使用 node 14 运行 hexo 报错

    2020-06-13

    #hexo

  • 【Linux】Oh-my-zsh 启动慢

    2020-06-13

    #Linux

  • 【Linux】查看当前所有进程

    2020-06-13

    #Linux

  • 【Linux】shell 和 shell 脚本的执行

    2020-06-13

    #Linux

  • 【Linux】Shell 和 Bash

    2020-06-13

    #Linux

  • 【Linux】bash 和 zsh 的启动脚本(.zshrc,.bash_profile,~/.profile 等区别)

    2020-06-13

    #Linux

  • 【Golang】go-redis Redis 连接库学习

    2020-05-24

    #Golang

  • 【Redis】Wireshark 分析 Redis 通讯

    2020-05-24

    #Redis

  • 【Docker】Docker Compose

    2020-05-24

    #Docker

  • 【macOS】brew 使用

    2020-05-24

    #macOS

  • 【Docker】Docker 常用命令

    2020-05-23

    #Docker

  • 【Redis】Codis

    2020-05-12

    #Cache System#Redis#Codis

  • 【Redis】Redis pipeline

    2020-05-09

    #Redis

  • 【Redis】Redis 性能分析 Insight

    2020-05-09

    #Redis

  • 【Redis】Redis 性能测试(redis-benchmark)

    2020-05-09

    #Redis

  • 【Redis】Redis High-availability

    2020-05-07

    #Redis

  • 【Redis】Redis 持久化(Persistence)

    2020-05-07

    #Redis

  • 【Redis】Redis 事务(Transaction)

    2020-05-07

    #Redis

  • 【Redis】Redis Key 长度与性能

    2020-05-07

    #Redis

  • 【Linux】Crontab

    2020-05-05

    #Linux

  • 【WordPress】使用 Docker 创建 WordPress 实例

    2020-05-05

    #WordPress

  • 【AWS】AWS CLI - s3 使用

    2020-05-05

    #AWS

  • 【Compile】交叉编译(Cross compiler)

    2020-05-05

    #Compile

  • 【Linux】Ubuntu 安装 Docker

    2020-05-01

    #Linux

  • 【Linux】shell 变量

    2020-04-26

    #Linux

  • 【Linux】makefile

    2020-04-25

    #Linux

  • 【MySQL】Out of range value for column

    2020-04-25

    #MySQL

  • 【Architecture】连接池(Connection Pool)

    2020-04-21

    #Architecture

  • 【MySQL】Too many connections

    2020-04-21

    #MySQL

  • 【Redis】查看连接信息

    2020-04-21

    #Redis

  • 【Redis】设置密码

    2020-04-21

    #Redis

  • 【Linux】iostat - 查看 IO 实时监控

    2020-04-21

    #Linux

  • 【MySQL】学习

    2020-04-12

    #MySQL

  • 【Architecture】架构学习

    2020-04-11

    #Architecture

  • 【Distributed System】无服务器(Serverless)

    2020-04-11

    #Distributed System

  • 【Network】网络测速工具 - iperf3

    2020-04-11

    #Network

  • 【Golang】JSON 序列化与反序列化

    2020-03-30

    #Golang

  • 【MySQL】用户和权限管理

    2020-03-29

    #MySQL

  • 【MySQL】MySQL 安全性设置

    2020-03-29

    #MySQL

  • 【MySQL】查看 log

    2020-03-29

    #MySQL

  • 【MySQL】Establishing a Database Connection

    2020-03-29

    #MySQL

  • 【Golang】Set 实现

    2020-03-22

    #Golang

  • 【Golang】go-redis 连接 Redis

    2020-03-22

    #Golang

  • 【Netwok】通过反向代理实现内网穿透

    2020-03-22

    #Netwok

  • 【Golang】内置函数

    2020-03-15

    #Golang

  • 【Golang】数据类型

    2020-03-15

    #Golang

  • 【Golang】循环

    2020-03-15

    #Golang

  • 【Golang】异常处理

    2020-03-15

    #Golang

  • 【Golang】静态数组(Array)和切片(slices)

    2020-03-15

    #Golang

  • 【Golang】函数

    2020-03-15

    #Golang

  • 【Golang】模块管理与引用

    2020-03-15

    #Golang

  • 【Golang】变量

    2020-03-15

    #Golang

  • 【Golang】枚举(enumeration)

    2020-03-15

    #Golang

  • 【Golang】变量访问域

    2020-03-15

    #Golang

  • 【Golang】map

    2020-03-15

    #Golang

  • 【Golang】struct

    2020-03-15

    #Golang

  • 【Golang】interface 和 interface {} 类型

    2020-03-15

    #Golang

  • 【Golang】类型转换 - 类型断言(Type Assertion)和强制类型转换

    2020-03-15

    #Golang

  • 【Hardware】ID 卡和 IC 卡

    2020-02-09

    #Hardware

  • 【MySQL】数据类型

    2020-01-31

    #MySQL

  • 【MySQL】MySQL 中的各种数据类型转换

    2020-01-31

    #MySQL

  • 【MySQL】命名习惯

    2020-01-31

    #MySQL

  • 【Golang】Golang 命令

    2020-01-30

    #Golang

  • 【Golang】指针(Pointers)

    2020-01-30

    #Golang

  • 【Golang】类型转换 - 获取变量类型

    2020-01-30

    #Golang

  • 【Linux】CentOS 安装 Docker

    2020-01-30

    #Linux

  • 【Protobuf】Protocol Buffers 入门

    2020-01-29

    #Protobuf

  • 【Golang】上传文件

    2020-01-29

    #Golang

  • 【Raspbeery Pi】树莓派玩耍

    2020-01-29

    #RaspbeeryPi

  • 【Network】电信光猫内网穿透

    2020-01-29

    #Network

  • 【Golang】Golang 使用 UUID

    2020-01-12

    #Golang

  • 【Golang】Golang 的环境变量

    2020-01-12

    #Golang

  • 【Golang】Golang 依赖管理 - go module

    2020-01-12

    #Golang

  • 【Golang】Golang 使用 gRPC

    2020-01-12

    #Golang

  • 【Golang】Golang 连接 MySQL

    2020-01-12

    #Golang

  • 【Golang】修改代码后自动重新编译并启动

    2020-01-12

    #Golang

  • 【Golang】使用 gorm(ORM 框架)

    2020-01-12

    #Golang

  • 【Golang】Web Framework - Gin 使用

    2020-01-12

    #Golang

  • 【Golang】Print

    2020-01-12

    #Golang

  • 【Format】csv

    2020-01-12

    #Format

  • 【Software Testing】Postman 深入

    2019-12-09

    #Software Testing

  • 【Linux】资源使用问题排查

    2019-12-09

    #Linux

  • 【Python】显示对象的所有 Attribute

    2019-12-06

    #Python

  • 【Python】print

    2019-12-01

    #Python

  • 【Python】断言(assert)

    2019-12-01

    #Python

  • 【WordPress】修改站点域名

    2019-12-01

    #WordPress

  • 【Python】常见错误

    2019-11-28

    #Python

  • 【SQL】select for update

    2019-11-26

    #SQL

  • 【Python】Basics - 特殊变量(Special Variables)

    2019-11-26

    #Python

  • 【Python】魔术方法(Magic Methods)

    2019-11-24

    #Python

  • 【Python】import 问题排查

    2019-11-23

    #Python

  • 【Python】pytest - 运行错误

    2019-11-18

    #Python

  • 【Python】 单元测试框架 - pytest

    2019-11-18

    #Python

  • 【Django】Django ORM - 文档整理

    2019-11-17

    #Django

  • 【Django】Django ORM - 性能优化

    2019-11-17

    #Django

  • 【Django】Django ORM - 使 DB Schema 生效

    2019-11-17

    #Django

  • 【Django】使用 Template

    2019-11-17

    #Django

  • 【MySQL】日志记录

    2019-11-17

    #MySQL

  • 【Python】枚举

    2019-11-17

    #Python

  • 【Python】is 和 ==

    2019-11-16

    #Python

  • 【Django】Django 静态资源和 HTML 文件管理

    2019-11-13

    #Django

  • 【Architectural Pattern】前端框架中的 MVC、MVP 和 MVVM

    2019-11-10

    #Architectural Pattern

  • 【Distributed System】分布式 session(Distributed Seesion)

    2019-11-10

    #Distributed System

  • 【hexo】使用 AWS s3 作为 hexo 图库

    2019-11-10

    #hexo

  • 【JQuery】获取对象

    2019-11-10

    #JQuery

  • 【Python】闭包和匿名函数

    2019-11-10

    #Python

  • 【Python】装饰器(Wrapper)

    2019-11-10

    #Python

  • 【Django】Django 路由规则

    2019-11-10

    #Django

  • 【Django】Django 创建 Django 项目或应用

    2019-11-10

    #Django

  • 【Django】template - 插入 Python 代码

    2019-11-10

    #Django

  • 【Django】Django ORM - QuerySet 序列化

    2019-11-10

    #Django

  • 【Django】Django ORM - 查询数据

    2019-11-10

    #Django

  • 【Django】Django ORM - CRUD

    2019-11-10

    #Django

  • 【Django】Django ORM - Define Model

    2019-11-10

    #Django

  • 【macOS】清除 DNS 缓存

    2019-11-06

    #macOS

  • 【Django】错误汇总

    2019-11-05

    #Django

  • 【Python】前缀

    2019-11-04

    #Python

  • 【MySQL】MySQL 错误记录

    2019-11-04

    #MySQL

  • 【Python】Comprehensions

    2019-11-01

    #Python

  • 【Python】Python 一切皆对象

    2019-11-01

    #Python

  • 【Python】I/O - 输入

    2019-11-01

    #Python

  • 【Python】Basics - Built-in Function(内置函数)

    2019-11-01

    #Python

  • 【Python】String

    2019-11-01

    #Python

  • 【Python】Collection - dict

    2019-11-01

    #Python

  • 【Python】Collection - list

    2019-11-01

    #Python

  • 【Python】Python Style Guide

    2019-11-01

    #Python

  • 【JavaEE】Java Servlet 和 JSP(JavaServer Pages)

    2019-11-01

    #Java EE

  • 【Database】聚集索引(Clustered Index)与非聚集索引(Non-clustered Index)

    2019-10-31

    #Database

  • 【Django】通过 ORM 访问 MySQL,插入 Emoji 报错

    2019-10-31

    #Django

  • 【MySQL】MySQL 的存储引擎(Storage Engines)- MyISAM 与 InnoDB

    2019-10-31

    #MySQL

  • 【Django】Django 项目部署到 uWSGI + Nginx 作为生产环境

    2019-10-28

    #Nginx#Django

  • 【HTTP】Web Server(Web 服务器)、Web Application Server(Web 应用服务器)和 CGI(Common Gateway Interface)的故事

    2019-10-28

    #HTTP#Network

  • 【Python】WSGI(Web Server Gateway Interface)、uWSGI Server、uwsgi、WSGI Application 的故事

    2019-10-28

    #Python

  • 【Python】Error Handling

    2019-10-28

    #Python

  • 【Architecture】Design - Error Handling

    2019-10-28

    #Architecture#ArchitectureDesign

  • 【Architecture】Design - Database Schema Design

    2019-10-28

    #Architecture#ArchitectureDesign

  • 【Architecture】Design - API Design

    2019-10-28

    #Architecture#ArchitectureDesign

  • 【Django】Django 使用 Redis

    2019-10-28

    #Django#Redis

  • 【Redis】自动过期

    2019-10-28

    #Redis

  • 【Python】变量作用域

    2019-10-27

    #Python

  • 【Redis】Redis 操作

    2019-10-27

    #Redis

  • 【Redis】安装 Redis

    2019-10-27

    #Redis

  • 【Python】PyCharm 中的 import 问题

    2019-10-27

    #Python

  • 【Python】Basics - 函数返回值

    2019-10-27

    #Python

  • 【Python】Exception

    2019-10-20

    #Python

  • 【Django】Error - Django : Table doesn't exist

    2019-10-20

    #Django

  • 【Python】import

    2019-10-20

    #Python

  • 【Django】Django 读写 Cookie

    2019-10-20

    #Django

  • 【HTTP】Cookie

    2019-10-20

    #HTTP

  • 【Python】Collection - set

    2019-10-20

    #Python

  • 【Python】Basics - 函数参数

    2019-10-20

    #Python

  • 【Django】Django Form

    2019-10-20

    #Django

  • 【SQL】清空表数据后如何让自增 ID 从 1 开始

    2019-10-20

    #MySQL#SQL

  • 【MySQL】ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key

    2019-10-20

    #MySQL

  • 【Django】Django 中的时间获取与相关问题

    2019-10-19

    #Django

  • 【Django】Django Shell

    2019-10-19

    #Django

  • 【Software Testing】Postman 中的 Cookies 设置

    2019-10-19

    #Software Testing

  • 【Nginx】MacOS 下安装 Nginx

    2019-10-19

    #Nginx#macOS

  • 【Node.js】 使用 nvm 管理本地 Node.js 版本

    2019-10-19

    #Node.js#nvm

  • 【Django】处理 PUT 和 DELETE 方法

    2019-10-08

    #Django

  • 【Python】杂 - virtualenv 管理 Python 项目依赖

    2019-10-08

    #Python

  • 【Python】Django - 连接 MySQL

    2019-10-08

    #Django

  • 【Python】杂 - 通过 pyenv 快速切换当前系统 Python 版本

    2019-10-06

    #Python

  • 【Python】杂 - macOS 下设置 Python 默认版本

    2019-10-06

    #Python

  • 【Python】API - 时间表示

    2019-10-06

    #Python

  • 【MySQL】MySQL 8 + macOS 错误:Authentication plugin 'caching_sha2_password' cannot be loaded

    2019-10-06

    #MySQL

  • 【Python】I/O - 异步 I/O

    2019-09-24

    #Python

  • 【Python】线程 - ThreadLocal

    2019-09-24

    #Python

  • 【Python】Basics - 类

    2019-09-23

    #Python

  • 【Python】线程 - 锁

    2019-09-23

    #Python

  • 【Python】线程 - 多线程(Multithreading)

    2019-09-23

    #Python

  • 【Python】线程 - 多进程

    2019-09-23

    #Python

  • 【Linux】命令 - cut 命令

    2019-09-17

    #Linux

  • 【Linux】Shell/Bash - 多命令执行、管道(pipeline)和重定向(redirection)

    2019-09-17

    #Linux

  • 【Linux】命令 - grep 命令

    2019-09-16

    #Linux

  • 【HTTP】RESTful

    2019-08-26

    #HTTP

  • 【HTTP】HTTP 请求方法(Methods)

    2019-08-26

    #HTTP

  • 【SQL】约束(Constraints)

    2019-08-22

    #SQL

  • 【SQL】常用 SQL 语句

    2019-08-22

    #SQL

  • 【Network】IPv4 地址

    2019-08-21

    #Network

  • 【Algorithm】算法思想 - 二分法(Binary Search)

    2019-08-16

    #Algorithm

  • 【Markdown】Markdown 使用中 HTML

    2019-08-15

    #Markdown

  • 【Java】运算符 - 乘法除法问题

    2019-08-14

    #Java

  • 【Java】源码 - BitSet

    2019-08-14

    #Java

  • 【Algorithm】动态规划 - 背包问题

    2019-08-13

    #Algorithm

  • 【Linxu】磁盘管理

    2019-08-08

    #Linxu

  • 【Python】协程(Coroutine)

    2019-08-08

    #Python

  • 【Python】Python 的单线程

    2019-08-06

    #Python

  • 【Python】Python 几种常用的测试框架

    2019-08-06

    #Python

  • 【Architecture】高并发

    2019-08-06

    #Architecture

  • 【Architecture】中台概念

    2019-08-06

    #Architecture

  • 【Algorithm】算法思想 - 分治算法(Divide and Conquer)

    2019-08-05

    #Algorithm

  • 【Algorithm】算法思想 - 贪心算法(Greedy Algorithm)

    2019-08-05

    #Algorithm

  • 【Algorithm】排序算法 - 计数排序(Counting Sort)

    2019-08-05

    #Algorithm

  • 【Architecture】系统架构考虑

    2019-08-05

    #Architecture

  • 【Distributed System】微服务 - Kubernetes 初步

    2019-08-04

    #Microservices

  • 【Distributed System】SOA 与 MicroServices

    2019-08-04

    #Distributed System#Microservices

  • 【Docker】减小 Docker 镜像体积

    2019-08-04

    #Docker

  • 【Performance】 性能指标(Performance Indicator)

    2019-08-04

    #Performance

  • 【Java】集合类 - PriorityQueue 类(优先队列)

    2019-08-02

    #Java

  • 【Linux】命令 - sed 命令

    2019-08-02

    #Linux

  • 【Linux】命令 - lsof 命令

    2019-08-01

    #Linux

  • 【Distributed System】云计算(Cloud Computing)

    2019-08-01

    #Distributed System

  • 【Data Structure】树 - 平衡二叉搜索树 - 有了二叉查找树、AVL 树为啥还需要红黑树?

    2019-08-01

    #Data Structure

  • 【Distributed System】消息队列 - RabbitMQ

    2019-08-01

    #Distributed System

  • 【Microservices】微服务(Microservice Architecture)

    2019-07-31

    #Microservices

  • 【Spring】Spring 框架

    2019-07-31

    #Spring

  • 【Database】读写分离(Read/Write Splitting)

    2019-07-31

    #Database

  • 【Data Structure】优先队列(Priority Queue)

    2019-07-31

    #Data Structure

  • 【Algorithm】排序算法 - 桶排序(Bucket Sort)

    2019-07-30

    #Algorithm

  • 【Algorithm】TopK 问题

    2019-07-30

    #Algorithm

  • 【Java】I/O - 读取数据

    2019-07-30

    #Java

  • 【Algorithm】排序算法 - 堆排序(Heap Sort)

    2019-07-30

    #Algorithm

  • 【Data Structure】堆(Heap)/ 二叉堆(binary heap)

    2019-07-29

    #Data Structure

  • 【Algorithm】算法思想 - 动态规划(Dynamic Programming)

    2019-07-29

    #Algorithm

  • 【Algorithm】递归(Recursion)

    2019-07-29

    #Algorithm

  • 【Algorithm】BigNum 原理

    2019-07-29

    #Algorithm

  • 【Algorithm】算法的时间复杂度(Time complexity)

    2019-07-27

    #Algorithm

  • 【Distributed System】负载均衡(Load balancing)

    2019-07-26

    #Distributed System

  • 【Algorithm】排序算法 - 归并排序(Merge Sort)

    2019-07-25

    #Algorithm

  • 【Netwrok】输入一个 URL 会发生什么

    2019-07-24

    #Netwrok

  • 【LaTeX】支持中文

    2019-07-24

    #LaTeX

  • 【Operating System】进程 - Linux 启动进程的几种方式

    2019-07-18

    #Linux#Operating Systems

  • 【Java】集合类 - LinkedHashMap

    2019-07-16

    #Java

  • 【Operating System】LRU(Least Recently Used)算法

    2019-07-15

    #Algorithm#Operating System

  • 【Network】HTTP 常用响应码

    2019-07-15

    #HTTP#Network

  • 【Database】分库分表

    2019-07-12

    #Database

  • 【Distributed System】柔性事务(Flexible Transactions)

    2019-07-12

    #Distributed System

  • 【Distributed System】一致性哈希(Consistent Hashing)

    2019-07-12

    #Distributed System

  • 【Distributed System】分布式事务(Distributed Transaction)

    2019-07-12

    #Distributed System

  • 【Java】锁 - Lock 接口

    2019-07-12

    #Java

  • 【Java】Java 关键字 - synchronized 关键字中的锁状态

    2019-07-12

    #Java

  • 【Lock】独享锁(Exclusive Lock) VS 共享锁(Shared Lock)

    2019-07-12

    #Java#Lock

  • 【Distributed System】分布式锁(Distributed Lock)

    2019-07-11

    #Distributed System

  • 【Distributed System】分布式系统

    2019-07-11

    #Distributed System

  • 【Operating System】I/O - 零拷贝(Zero-copy)

    2019-07-11

    #Operating System

  • 【Java】JVM - Java 内存模型中的缓存一致性(Cache Coherency)问题

    2019-07-11

    #Java

  • 【Java】Netty 入门

    2019-07-10

    #Java#Network Programming

  • 【Regular Expression】正则表达式(Regular Expression)

    2019-07-10

    #Regular Expression

  • 【Java EE】Jetty 入门

    2019-07-10

    #Java EE

  • 【Operating System】死锁(deadlock)

    2019-07-10

    #Operating System

  • 【Distributed System】消息队列(Message Queue)

    2019-07-10

    #Distributed System

  • 【Distributed System】Dubbo 入门

    2019-07-10

    #Microservices

  • 【Java】值传递与引用传递

    2019-07-10

    #Java

  • 【Linux】统计某文件 / 文件夹个数

    2019-07-10

    #Linux

  • 【Database】数据库连接池

    2019-07-09

    #Database

  • 【Operating System】I/O - 磁盘 I/O 相关概念

    2019-07-09

    #Operating System

  • 【Cache System】缓存穿透(Cache Penetration)、缓存雪崩(Cache Avalanche)与缓存击穿(Cache Breakdown)

    2019-07-08

    #Cache System

  • 【Algorithm】海量数据处理 - 布隆过滤器(Bloom Filter)

    2019-07-05

    #Algorithm

  • 【Algorithm】海量数据处理 - 位图(Bitmap)

    2019-07-05

    #Algorithm

  • 【Algorithm】海量数据处理 - MapReduce

    2019-07-05

    #Algorithm

  • 【Algorithm】海量数据处理 - hash 映射再取模 + hashmap 统计 + 排序

    2019-07-05

    #Algorithm

  • 【Algorithm】海量数据处理

    2019-07-05

    #Algorithm

  • 【Algorithm Problem】海量数据处理 - 10 亿 int 型数,统计只出现一次的数

    2019-07-05

    #Algorithm Problem

  • 【Security】Web 安全

    2019-07-04

    #Security

  • 【OOP】什么是多态

    2019-07-03

    #OOP

  • 【Java】基本数据类型 - 基本数据类型的类型转换

    2019-06-28

    #Java

  • 【Java】基本数据类型 - Java 支持的 8 种基本数据类型

    2019-06-28

    #Java

  • 【Algorithm】计算斐波纳契数(Fibonacci Number)

    2019-06-27

    #Algorithm

  • 【Algorithm】排序算法 - 希尔排序(Shell Sort)

    2019-06-26

    #Algorithm

  • 【Algorithm】排序算法 - 插入排序(Insertion Sort)

    2019-06-25

    #Algorithm

  • 【Algorithm】排序(Sorting)算法

    2019-06-25

    #Algorithm

  • 【Algorithm】排序算法 - 冒泡排序(Bubble Sort)

    2019-06-25

    #Algorithm

  • 【Algorithm】排序算法 - 快速排序(Quick Sort)

    2019-06-25

    #Algorithm

  • 【Interview】应聘者提问

    2019-06-19

    #Interview

  • 【Network】Shadowsocks 总结

    2019-06-19

    #Network

  • 【Data Structure】图(Graph) - 图的物理存储

    2019-06-14

    #Data Structure

  • 【Data Structure】图(Graph) - 图的深度优先搜索(Depth First Search)

    2019-06-14

    #Data Structure

  • 【Data Structure】多叉搜索树 - Trie 树(字典树)

    2019-06-13

    #Data Structure

  • 【Database】数据库索引(Index)

    2019-06-10

    #Database

  • 【Database】数据库索引为什么使用 B+ 树

    2019-06-10

    #Database

  • 【Data Structure】多路平衡查找树 - B+ 树(B+ Tree)

    2019-06-05

    #Data Structure

  • 【Data Structure】多路平衡查找树 - B 树(B-Tree)

    2019-06-04

    #Data Structure

  • 【Data Structure】多路平衡查找树 - 2-3 查找树和 2-4 查找树

    2019-06-04

    #Data Structure

  • 【Algorithm】查找算法

    2019-06-03

    #Algorithm

  • 【Network】Charles 为什么可以获取 HTTPS 包内容

    2019-05-31

    #Network

  • 【Data Structure】哈希表(Hash table)

    2019-05-30

    #Data Structure

  • 【Data Structure】常用数据结构的时间复杂度

    2019-05-30

    #Data Structure

  • 【Data Structure】哈夫曼树(Huffman Tree)

    2019-05-30

    #Data Structure

  • 【Data Structure】平衡二叉搜索树 - 红黑树(Red-Black Tree)

    2019-05-30

    #Data Structure

  • 【Data Structure】平衡二叉搜索树 - AVL 树

    2019-05-30

    #Data Structure

  • 【Data Structure】自平衡二叉搜索树(Self-balancing Binary Search Tree)

    2019-05-29

    #Data Structure

  • 【Data Structure】二叉搜索树(Binary Search Tree)

    2019-05-29

    #Data Structure

  • 【Data Structure】线索二叉树(Threaded Binary Tree)

    2019-05-28

    #Data Structure

  • 【Data Structure】二叉树的遍历(Traversal)

    2019-05-27

    #Data Structure

  • 【Data Structure】二叉树(Binary Tree)

    2019-05-27

    #Data Structure

  • 【Network】OpenWrt 的路由器 ssh 访问

    2019-05-27

    #Network

  • 【Data Structure】广义表

    2019-05-24

    #Data Structure

  • 【Data Structure】矩阵

    2019-05-24

    #Data Structure

  • 【Data Structure】树(Tree)

    2019-05-24

    #Data Structure

  • 【Algorithm】字符串匹配算法 - 朴素的字符串匹配算法(Naive String Matching Algorithm)

    2019-05-23

    #Algorithm

  • 【Algorithm】字符串匹配算法 - KMP 算法

    2019-05-22

    #Algorithm

  • 【Data Structure】串(String)

    2019-05-21

    #Data Structure

  • 【Data Structure】队列(Queue)

    2019-05-21

    #Data Structure

  • 【Data Structure】栈的应用

    2019-05-17

    #Data Structure

  • 【Java】集合类 - Stack

    2019-05-16

    #Java

  • 【Data Structure】栈(Stack)

    2019-05-16

    #Data Structure

  • 【Java】运算符 - 位运算符

    2019-05-16

    #Java

  • 【Data Structure】循环链表(Circular Linked List)

    2019-05-16

    #Data Structure

  • 【Data Structure】双向链表 (Doubly Linked List)

    2019-05-16

    #Data Structure

  • 【Java】集合类 - LinkedList

    2019-05-16

    #Java

  • 【Data Structure】链表 (Linked List)

    2019-05-16

    #Data Structure

  • 【Java】集合类 - ArrayList

    2019-05-15

    #Java

  • 【Data Structure】顺序表

    2019-05-15

    #Data Structure

  • 【Algorithm】什么是算法(Algorithm)

    2019-05-15

    #Algorithm

  • 【Data Structure】什么是数据结构

    2019-05-14

    #Data Structure

  • 【Data Structure】线性表(Linear List)

    2019-05-14

    #Data Structure

  • 【Data Structure】图(Graph)

    2019-05-14

    #Data Structure

  • 【Algorithm Problem】统计文章中每个单词出现的次数

    2019-05-14

    #Algorithm Problem

  • 【Algorithm】排序算法 - 选择排序(Selection Sort)

    2019-05-14

    #Algorithm

  • 【Algorithm】查找算法(Search) - 二分搜索算法 (Binary Search)

    2019-05-13

    #Algorithm

  • 【Security】Wireshake 抓包分析 HTTPS

    2019-05-13

    #Security

  • 【Security】HTTPS

    2019-05-13

    #Security

  • 【Security】安全的 HTTP 的演化

    2019-05-13

    #Security

  • 【Security】密码学基础

    2019-05-13

    #Security

  • 【Network】HTTP 协议的演变

    2019-05-08

    #HTTP#Network

  • 【Network】IP 协议(网际协议)

    2019-05-08

    #Network

  • 【Network】UDP

    2019-05-08

    #Network

  • 【Network】TCP/IP

    2019-05-08

    #Network

  • 【Network】TCP 的拥塞控制(Congestion Handling)

    2019-05-08

    #Network

  • 【Network】TCP 的流量控制(Traffic Control) - 滑动窗口(Sliding Window)

    2019-05-07

    #Network

  • 【Network】TCP 为什么是三次握手,而不是两次或四次?

    2019-05-06

    #Network

  • 【Network】TCP 四次挥手(TCP Four-way Wavehand)

    2019-05-06

    #Network

  • 【Network】Wireshark 抓包学习 TCP 通讯

    2019-05-03

    #Network

  • 【Network】TCP(Transmission Control Protocol)

    2019-05-03

    #Network

  • 【Network】TCP 三次握手(TCP Three-way Handshake)

    2019-05-03

    #Network

  • 【Design Pattern】结构类模式 — 装饰器模式(Decorator Pattern)

    2019-04-09

    #Design Pattern

  • 【Spring】Spring 中的 IoC

    2019-04-08

    #Spring

  • 【Spring】面向切面编程(AOP) 与 Spring

    2019-04-08

    #Spring

  • 【Design Pattern】结构类模式 —- 代理模式(Proxy Pattern)

    2019-04-05

    #Design Pattern

  • 【Java】泛型(Generics)

    2019-04-02

    #Java

  • 【Java】Java 对象的生命周期

    2019-04-02

    #Java

  • 【Java】Java 关键字 - transient 关键字

    2019-04-02

    #Java

  • 【Java】反射(Reflection)

    2019-04-02

    #Java

  • 【Java】instanceof 关键字与 isInstance 方法

    2019-04-01

    #Java

  • 【Java】类的访问修饰符(Access Qualifier)

    2019-04-01

    #Java

  • 【Java】Java 中的引用与如何避免 OutOfMemory

    2019-04-01

    #Java

  • 【Java】内部类(Inner Class)

    2019-04-01

    #Java

  • 【Java】Java 关键字 - static 关键字

    2019-04-01

    #Java

  • 【Java】抽象类(Abstract Class)与接口(Interface)

    2019-04-01

    #Java

  • 【OOP】重写(Overriding)与重载(Overloading)

    2019-04-01

    #OOP

  • 【Java】类(Class)与继承(Inheritance)

    2019-03-29

    #Java

  • 【Java】访问修饰符(Access Modifier)

    2019-03-29

    #Java

  • 【Java】Java 动态代理(Dynamic Proxy)

    2019-03-28

    #Java

  • 【Java】对象的序列化(Serialization)与反序列化(Deserialization)

    2019-03-28

    #Java

  • 【Java】枚举 Enum

    2019-03-27

    #Java

  • 【Java】枚举实现单例模式

    2019-03-26

    #Java

  • 【Java】同步容器与线程安全问题

    2019-03-26

    #Java

  • 【Java】String - String.intern () 方法

    2019-03-26

    #Java

  • 【Java】垃圾回收 - 分代垃圾回收

    2019-03-26

    #Java

  • 【Java】对象的内存分配 - 垃圾回收过程

    2019-03-26

    #Java

  • 【Java】垃圾收集(Garbage Collection)

    2019-03-26

    #Java

  • 【Java】Java 关键字 - final 关键字

    2019-03-19

    #Java

  • 【Java】集合类 - 并发容器 (Concurrent Container)

    2019-03-18

    #Java

  • 【Java】集合类 - CopyOnWriteArrayList

    2019-03-18

    #Java

  • 【Java】hashCode()

    2019-03-18

    #Java

  • 【Java】集合类 - ConcurrentHashMap

    2019-03-18

    #Java

  • 【Java】集合类 - Map

    2019-03-18

    #Java

  • 【Java】集合类 - 遍历 Map 对象的几种方式

    2019-03-18

    #Java

  • 【Java】集合类 - 集合框架

    2019-03-15

    #Java

  • 【Java】集合类 - Set

    2019-03-15

    #Java

  • 【Java】集合类 - List

    2019-03-15

    #Java

  • 【Java】集合类 - Iterable 接口的 Fail-Fast 机制

    2019-03-15

    #Java

  • 【Java】集合类 - HashSet

    2019-03-15

    #Java

  • 【Java】集合类 - Queue

    2019-03-15

    #Java

  • 【Java】集合类 - TreeSet

    2019-03-15

    #Java

  • 【Java】集合类 - HashMap 的并发问题

    2019-03-14

    #Java

  • 【Java】集合类 - HashMap

    2019-03-14

    #Java

  • 【Java】集合类 - Collection 接口的三种遍历方法

    2019-03-14

    #Java

  • 【Java】集合类 - HashSet、HashMap 和 HashTable

    2019-03-13

    #Java

  • 【Java】== 与 equals ()

    2019-03-12

    #Java

  • 【Java】String - String,StringBuilder 和 StringBuffer

    2019-03-11

    #Java

  • 【Java】装箱(Boxing)与拆箱(Unboxing)

    2019-03-11

    #Java

  • 【Java】String - String 类和常量池

    2019-03-11

    #Java

  • 【Java】多线程 - Callable、Future 和 FutureTask

    2019-03-08

    #Java

  • 【Java】JVM - 双亲委派模型(Parents Delegation model)

    2019-03-07

    #Java

  • 【Java】JVM - 自定义类加载器

    2019-03-07

    #Java

  • 【Java】JVM - 对象访问

    2019-03-06

    #Java

  • 【Java】JVM - JVM 内存区域

    2019-03-06

    #Java

  • 【Java】JVM - 类加载机制(ClassLoad Mechanism)

    2019-03-06

    #Java

  • 【Java】JVM - 类加载器(Class Loader)

    2019-03-06

    #Java

  • 【Java】JVM 入门

    2019-03-06

    #Java

  • 【Java】JVM - HotSpot VM

    2019-03-05

    #Java

  • 【Java】JVM - Java 对象头(Header)

    2019-03-04

    #Java

  • 【Java】锁 - JVM 对内部锁的优化

    2019-03-04

    #Java

  • 【Java】I/O - I/O 模型与服务端编程

    2019-03-04

    #Java#Network Programming

  • 【Java】I/O - NIO 使用

    2019-03-04

    #Java

  • 【Java】字符(char)

    2019-03-03

    #Java

  • 【Java】 I/O - I/O 基本操作

    2019-03-03

    #Java

  • 【Java】 字符(串)编码与解码

    2019-03-02

    #Java

  • 【Java】多线程 - 线程间通信工具 CountDownLatch、CyclicBarrier 和 Phaser 类

    2019-03-01

    #Java

  • 【Lock】锁的几种特性

    2019-03-01

    #Java#Lock

  • 【Java】锁 - AQS

    2019-02-28

    #Java

  • 【Java】锁 - ReentrantLock 类

    2019-02-28

    #Java

  • 【Java】多线程 - Java 锁的演化

    2019-02-28

    #Java

  • 【Java】多线程 - Java 保证原子性、有序性、可见性

    2019-02-28

    #Java

  • 【Java】多线程 - 原子类(Atomic Classes)

    2019-02-27

    #Java

  • 【Java】锁 - CAS 无锁算法

    2019-02-27

    #Java

  • 【Java】多线程 - Happens-before 原则

    2019-02-27

    #Java

  • 【Java】多线程 - 线程安全(Thread Safety)

    2019-02-27

    #Java

  • 【Java】多线程 - ThreadLocal

    2019-02-27

    #Java

  • 【Java】多线程 - 守护线程(Daemon Thread)

    2019-02-26

    #Java

  • 【Network】两种高性能 I/O 设计模式(Reactor/Proactor)

    2019-02-26

    #Network#Network Programming

  • 【Java】多线程 - 线程状态切换函数

    2019-02-25

    #Java

  • 【Java】多线程 - 线程池(Thread Pool)

    2019-02-25

    #Java

  • 【Operating System】进程 - 协程(Coroutines)

    2019-02-25

    #Operating System

  • 【Java】JVM - Java 内存模型(Java Memory Model)

    2019-02-25

    #Java

  • 【Lock】锁的可重入性(Reentrancy)

    2019-02-25

    #Lock

  • 【Java】Java 关键字 - volatile 关键字

    2019-02-25

    #Java

  • 【Operating System】文件描述符(File Descriptor)

    2019-02-22

    #Operating System

  • 【Database】两阶段锁(Two-phase locking)

    2019-02-21

    #Database

  • 【Programming】并发编程(Concurrent Programming)

    2019-02-19

    #Programming

  • 【并发控制】乐观并发控制(Optimistic Concurrency Control)与悲观并发控制(Pessimistic Concurrency Control)

    2019-02-17

    #Operating System

  • 【Operating System】进程 - 进程与线程

    2019-02-14

    #Operating System

  • 【Operating System】系统调用

    2019-02-14

    #Operating System

  • 【Operating System】进程 - 进程 / 线程间通信

    2019-02-13

    #Operating System

  • 【Operating System】进程 - 进程 / 线程调度

    2019-02-10

    #Operating Systems

  • 【Linux】iptables 防火墙

    2019-02-02

    #Linux

  • 【Java】多线程 - 线程优先级

    2019-02-01

    #Java

  • 【Java】Java 关键字 - synchronized 关键字

    2019-01-31

    #Java

  • 【Java】多线程 - 线程基础

    2019-01-31

    #Java

  • 【Java】多线程 - Java 中的线程状态及状态切换

    2019-01-31

    #Java

  • 【Linux】SSH 登录与管理

    2019-01-31

    #Linux

  • 【Linux】命令 - scp 命令

    2019-01-30

    #Linux

  • 【Linux】命令 - dig 命令

    2019-01-30

    #Linux

  • 【Network】dnsmasq 初学

    2019-01-30

    #Network

  • 【Linux】定时任务

    2019-01-30

    #Linux

  • 【Network】Shadowsocks + OpenWRT + dnsmasq-full + ipset + gfwList 实现路由器(小米路由器 mini)自动翻墙

    2019-01-30

    #Network

  • 【OpenWrt】小米路由器 mini 刷 OpenWRT

    2019-01-30

    #OpenWrt

  • 【Network】C10K 问题与高性能网络编程入门

    2019-01-20

    #Network#Network Programming

  • 【Linux】Linux 中的 I/O 轮询技术

    2019-01-19

    #Linux#Operating System

  • 【Java】Java 关键字 - finally 关键字

    2019-01-18

    #Java

  • 【Architecture】Nginx 学习

    2019-01-18

    #Architecture#Nginx

  • 【Node.js】Node 的模块定义和使用

    2019-01-17

    #Node.js

  • 【Linux】硬链接与软链接

    2019-01-10

    #Linux

  • 【Distributed System】分布式系统的数据一致性(Data Consistency)

    2019-01-09

    #Distributed System

  • 【Distributed System】分布式事务 - 三阶段提交

    2019-01-09

    #Distributed System

  • 【Distributed System】分布式事务 - 两阶段提交

    2019-01-09

    #Distributed System

  • 【Distributed System】分布式理论 - BASE 理论

    2019-01-08

    #Distributed System

  • 【Distributed System】分布式理论 - CAP 理论

    2019-01-08

    #Distributed System

  • 【OOP】对象的深拷贝(Deep Copy)与浅拷贝(Shallow Copy)

    2019-01-07

    #OOP

  • 【Distributed System】远程过程调用(Remote Procedure Call,RPC)

    2019-01-07

    #Distributed System

  • 【Network】GFW 学习

    2019-01-06

    #Network

  • 【Redis】Redis 入门

    2019-01-06

    #Cache System#Redis

  • 【WordPress】WordPress 安全性设置

    2018-11-12

    #WordPress

  • 【Docker】Docker 的基本使用

    2018-11-12

    #Docker

  • 【Java】macOS 下编译 JDK8

    2018-11-12

    #Java

  • 【Node.js】Node.js 应用性能监测与分析

    2018-11-12

    #Node.js

  • 【Node.js】Node.js 中的单线程模型与多线程 / 进程

    2018-11-12

    #Node.js

  • 【Linux】Shell 脚本

    2018-11-12

    #Linux

  • 【Architectural Pattern】MVVM 与数据绑定

    2018-11-12

    #Architectural Pattern

  • 【Design Pattern】结构类模式 -- 模板方法模式 (Template Method Pattern)

    2018-11-12

    #Design Pattern

  • 【Design Pattern】结构类模式 -- 组合模式 (Composite Pattern)

    2018-11-12

    #Design Pattern

  • 【Design Pattern】结构类模式 -- 适配器模式 (Adapter Pattern)

    2018-11-12

    #Design Pattern

  • 【Design Pattern】结构类模式 -- 享元模式 (Flyweight Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】行为类模式 -- 观察者模式 (Obsever Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】行为类模式 -- 策略模式 (Strategy Pattern)

    2018-11-11

    #Design Pattern

  • 【Architectural Pattern】Model – View – Controller (MVC)

    2018-11-11

    #Architectural Pattern

  • 【Java】 Intellij 调试程序断点进入 JDK 源码

    2018-11-11

    #Java

  • 【Java】Java 程序的编译与运行

    2018-11-11

    #Java

  • 【JavaScript】JavaScript 单线程与异步

    2018-11-11

    #JavaScript

  • 【Python】Python 调试技巧

    2018-11-11

    #Python

  • 【iOS】 iOS 内存管理

    2018-11-11

    #iOS

  • 【Design Pattern】行为类模式 -- 备忘者模式(Memento Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】创建类模式 -- 单例模式 (Singleton Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】创建类模式 -- 建造者模式 (Builder Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】创建类模式 -- 工厂模式 (Factory Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】行为类模式 -- 状态模式 (State Pattern)

    2018-11-11

    #Design Pattern

  • 【Design Pattern】设计模式概念

    2018-11-11

    #Design Pattern

  • 【Markdown】Markdown 中的数学符号与公式

    2018-11-10

    #Markdown

  • 【Linux】命令 - time 命令

    2018-11-06

    #Linux

  • 【Operating System】I/O - 同步、异步与阻塞、非阻塞 I/O 问题

    2018-11-06

    #Operating System

  • 【Node.js】Node.js 的 Event Loop 与异步 I/O

    2018-11-06

    #Node.js

  • 【Linux】chmod/chown - Linux 文件 / 文件夹 权限

    2018-11-05

    #Linux

  • 【SQL】SQLite 命令

    2018-02-24

    #SQL

  • 【SQL】SQL 中几个关键字

    2018-02-24

    #SQL

  • 【WordPress】WordPress 安装插件时提示输入 FTP 账号信息

    2018-02-24

    #WordPress

  • 【WordPress】WordPress 修改管理员用户名名称

    2018-02-24

    #WordPress

  • 【OOP】依赖反转原则(The Dependency Inversion Principle)、控制反转(Inversion of Control)与依赖注入 (Dependency Injection)

    2018-02-24

    #OOP

  • 【MySQL】MySQL 常用命令

    2018-02-23

    #MySQL

  • 【MySQL】Mac 下安装 MySQL

    2018-02-23

    #MySQL

  • 【Java】JavaBean、POJO 和 EJB

    2018-02-23

    #Java

  • 【macOS】 macOS 下查看端口被哪个程序占用

    2018-02-23

    #macOS

  • 【Java】 集合类 - Java 中 List 的基本使用

    2018-02-23

    #Java

  • 【Security】用户验证及密码加密存储

    2018-02-23

    #Security

  • 【OOP】SOLID 原则

    2018-02-23

    #OOP

  • 【Operating System】换行符

    2018-02-23

    #Operating System

  • 【C#】 C# 委托

    2018-02-23

    #C#

  • 【C#】 C# 匿名函数

    2018-02-23

    #C#

  • 【Programming】函数式编程(Functional Programming)

    2018-02-23

    #Programming

  • 【Software Testing】软件测试的种类

    2018-02-23

    #Software Testing

  • 【iOS】通过 Xcode 任意指定 iPhone/iPad 的地理位置

    2017-09-27

    #iOS

  • 【Linux】Linux(CentOS 7)安全策略设置

    2017-09-27

    #Linux

  • 【Linux】命令 - curl 的使用

    2017-09-26

    #Linux

  • 【Linux】查看占用端口的进程

    2017-09-08

    #Linux

  • 【Nginx】Nginx 配置文件的语法检测与路径获取

    2017-09-08

    #Nginx

  • 【Java】javap(Java Class 文件分解工具)

    2017-06-08

    #Java

  • 【Windows】Windows 10 下在 Cmder 中使用 Linux Bash

    2017-06-08

    #Windows

  • 【Java】Java 反编译工具

    2017-06-04

    #Java

  • 【Network】Wireshark 常用过滤命令

    2017-06-04

    #Network

  • 【Network】单播(Unicast)、多播(Multicast)与广播(Broadcast)

    2017-06-04

    #Network

  • 【Network】DHCP 介绍与工作原理

    2017-06-04

    #Network

  • 【Java】Java 开发环境配置及踩的坑

    2017-06-04

    #Java

  • 【iOS】 iOS 不同操作系统兼容问题

    2017-05-15

    #iOS

  • 【Hardware】i386、x86 和 x64 的故事

    2017-04-30

    #Hardware

  • 【iOS】 Apple 移动设备处理器指令集与 Xcode 指令集相关设置

    2017-04-30

    #iOS

  • 【Linux】时间同步问题与 Linux NTP

    2017-04-25

    #Linux

  • 【Linux】CentOS7/RedHat7 NTP 服务无法开机自启动

    2017-04-25

    #Linux

  • 【Linux】查看 Linux 系统版本

    2017-04-24

    #Linux

  • 【VMware】 VMware 中安装 CentOS7

    2017-04-13

    #VMware

  • 【Linux】 Linux 包管理器

    2017-04-13

    #Linux

  • 【VMware】 VMware Workstation 与 Device/Credential Guard 不兼容

    2017-04-13

    #VMware

  • 【JavaScript】 JavaScript 单元测试框架:Jasmine

    2017-04-09

    #JavaScript#Software Testing

  • 【Operating System】环境变量(Environmental Variables)

    2017-04-09

    #Linux

  • 【Node.js】 Node.js 与 NPM 的模块版本管理

    2017-04-09

    #Node.js#npm

  • 【Network】DNS 原理分析

    2017-04-04

    #Network

  • 【C#】Visual Studio 2017 一边 Debug,一边修改代码

    2017-04-03

    #C##Debug#Visual Studio

  • 【Git】 Git 之忽略文件(gitignore)

    2017-04-03

    #Git#Version Control

  • 【Software Testing】 持续集成(Continuous integration)之粗浅理解

    2017-04-02

    #Software Testing

  • 【Data Format】JSON

    2017-04-01

    #JavaScript#Data Format

  • 【JavaScript】 JavaScript 定时器深入解析

    2017-03-31

    #JavaScript

  • 【HTTP】URL 总结

    2017-03-31

    #HTTP

  • 【VMware】 VMware12 中安装 macOS Sierra 10.12.3

    2017-03-13

    #macOS#VMware

  • 【SQL】 SQL 通配符使用

    2017-03-12

    #SQL

  • 【Node.js】 Node.js 与 NPM 入门

    2017-03-11

    #Node.js#NPM

  • 【Browser】 浏览器中的缓存机制

    2017-03-02

    #Frontend#Cache#Browser

  • 【TypeScript】 TypeScript 动态调试方法总结

    2017-03-02

    #Debug#TypeScript

  • My English Blog
  • My OJ Blog
  • 西维蜀黍的健身 Blog