基础数据类型、数组、集合类的初始化

总结 Java 基础数据类型、数组、集合类进行初始化的相关知识与技巧。

1. 默认初始化值

Java 的基础数据类型以及对象的默认初始化值如下:

1
2
3
4
5
6
7
8
9
10
11
12
// Ref: https://stackoverflow.com/questions/13972617/primitives-objects-declaration-default-initialization-values
Data Type - Default Value (for fields)

byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
String (or any object) null
boolean false

需要注意的是,Java 中只会给类的成员变量(class members)分配初始值,而局部变量(local variable)则不会被分配初始值,必须自己初始化,否则会报编译错误,参考下面的例子。

1
2
3
4
5
6
7
8
9
10
// Ref: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
public class Test {
int a;
public void fun(){
int b;
System.out.println(a); // 正常输出,值为 0
// System.out.println(b); // 如果添加这行,会报编译错误
// java: variable b might not have been initialized
}
}

2. 初始化方法

介绍数组和集合类的初始化方法,在Leetcode 编程题中使用非常多。

2.1 数组

对于数组来说,特别要注意的是初始化的时候必须要指明它的长度,并且一经生成,数组的长度就不能再变化。

初始化数组通常有两种方案,一种是在分配存储空间的同时初始化值:

1
2
3
4
5
6
7
8
9
// Ref: https://stackoverflow.com/questions/1938101/how-to-initialize-an-array-in-java

int[] data = {10,20,30,40,50,60,71,80,90,91};

// or
// Note: 下面这种声明完之后再初始化的,必须使用 new
int[] data;
// int[] 中不能有数组长度,数组长度由后面的初始化值得数量决定
data = new int[] {10,20,30,40,50,60,71,80,90,91};

另一种则是先分配存储空间,由系统分配默认值:

1
2
// 声明并使用系统默认值(int 默认值为0)初始化一个长度为10 的整型数组
int[] data = new int[10];

2.2 集合框架

一般的,Java 集合类都是仅使用 new 关键字创建对象,而不在创建对象的同时进行值初始化(一般是后续通过add() 等方法向集合类中添加元素)。

一种更加紧凑的方式来初始化集合类是使用匿名内部类+初始化代码块的方法ref,如下:

1
2
3
4
// 初始化 list
List<String> s = new ArrayList<String>() {{ add("1"); add("2"); }};
// 初始化 set
Set<String> exclusions = new HashSet<String>() {{ add(‘Alice’); add(‘Bob’); }};

上述的初始化方法也称为 double brace initialization 法,该方法的优缺点可以参考Java:Double Brace Initialization. 由于该方法存在的缺点,另一种提升代码简洁性的方法是自己构造一个集合初始化的帮助类,来简化元素添加操作。

具体原理是双层花括号中,外层花括号表示创建了一个匿名内部类,内层的花括号则是该匿名内部类的初始化代码块(instance initialization block)。最终,在初始化代码块中调用 add() 方法初始化该匿名内部类然后将其赋给声明的对象。

Ref:

  1. java中的匿名内部类总结
  2. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序