OCA/OCP Java Note (7): Core Java APIs (2)

5. Understanding an ArrayList

  与数组类似,ArrayList是一个有序序列,且允许重复与元素。数组中元素的个数在声明时就已经确定,不可再更改,ArrayList可以在运行时改变大小。

5.1. Creating an ArrayList

  Java 5之前可以使用以下的方法创建ArrayList,现在也可以使用,例如:

  Java 5引入了泛型(generics),可以在声明时指明ArrayList中所保存的类。从Java 7开始,可以省略等号右边的类型,但需要保留<>,例如:

  ArrayList实现了List接口,不能直接实例化List:

5.2. Using an ArrayList

5.2.1. add()

eg.

这里没有指明ArrayList中元素的类型,所以ArrayList中的元素为Object。

eg.

这里指明了ArrayList中元素的类型为String,不能放入Boolean。

eg.

5.2.2. remove()

eg.

5.2.3. set()

eg.

5.2.4. clear()

eg.

5.2.5. contains()

  contains()会调用equals()来判断元素是否匹配。

eg.

String实现了equals(),所以上面的例子可以正常工作。

5.2.6. equals()

  ArrayList实现了自己的equals(),可以用于判断两个ArrayList是否相同,即各个元素和元素的顺序均相同。

eg.

5.3. Wrapper Classes

  包装类及其构造方法如图1所示。

图1

图1

 

  从String转化到包装类的方法如图2所示。

图2

图2

eg.

5.4. Autoboxing

  Java 5中引入了自动封装机制,将基本类型自动转换为相对应的包装类。

eg.

第8行自动将Double拆箱(unbox)为double。对null进行unbox,会抛出NullPointerException。

eg.

eg. 需要注意自动封装为Integer的情况:

remove() 有接受int参数的版本,这里 remove() 的参数1没有自动封装为Integer, remove(1) 移除了下标为1的元素(2),而不是移除元素1; numbers.remove(new Integer(1)) 显式地进行封装,移除了元素1。

5.5. Converting Between array and List

  从List转换为数组可以使用 toArray() 

eg. 

第8行指明了新数组的大小为0,不够存储objectArray中的两个元素,于是自动生成了新的数组。
使用 asList() 可以将数组转换为List,需要注意新生成的List与原始数组所使用的数据是相同的,对他们的修改会相互影响;且新生成的List和长度固定(和原始数组相同),不能使用 add() 或 remove() 来修改。

eg. 

通过 asList() 得到的是一个固定长度的列表,使用 add() 或 remove() 尝试进行修改会得到UnsupportedOperation Exception。PS. 如果想要用remove()修改由数组转换的列表,可以使用:

LinkedList提供了更快的 remove() 方法。

  asList()接受可变参数。  

eg.

6. Working with Dates and Times

  Java 8中引入了全新的日期和时间类,对比如图3所示。

图3

图3