四时宝库

程序员的知识宝库

java 核心技术-12版 卷Ⅰ- 5.3.1 声明数组列表

原文

5.3.1声明数组列表

可以如下声明和构造一个保存 Employee 对象的数组列表:

ArrayList<Employee> staff = new ArrayList<Employee>();

?在 Java 10中,最好使用 var 关键字以避免重复写类名

var staff = new ArrayList<Employee>();

?如果没有使用 var 关键字,则可以省略右边的类型参数

ArrayList<Employee> staff = new ArrayListo();

?这称为“菱形”语法,因为空尖括号就像是一个菱形。可以结合 new操作符使用菱形语法。编译器会检查新值要做什么。如果赋值给一个变量,或传递给某个方法,或者从某个方法返回,编译器会检查这个变量、参数或方法的泛型类型,然后将这个类型放在<>中。在这个例子中,new ArrayList<>()将赋值给一个类型为 ArrayList<Employee> 的变量,所以泛型类型为 Employee.

警告:如果使用 var 声明 ArrayList,就不要使用菱形语法。以下声明

var elements =new ArrayList<>();会生成一个ArrayList<0bject>。

注释: Java 5以前的版本没有提供泛型类,而是有一个保存Object 类型元素的ArrayList 类,它是一个“自适应大小”(one-size-fits-all)的集合。你仍然可以使用没有后缀<...>的 ArrayList。它被认为是一个擦除了类型参数的“原始”类型。

注释:在更老的 Java 版本中,程序员使用 Vector 类实现动态数组。不过,ArrayList 类更加高效,没有任何理由再使用 Vector 类。

?使用 add 方法可以将元素添加到数组列表中。例如,下面展示了如何将 Employee 对象添加到一个数组列表中:

staff.add(new Employee("Harry Hacker",...));

staff.add(new Employee("Tony Tester",...));

?数组列表管理着一个内部的对象引用数组。最终,这个数组的空间有可能全部用尽。这时就显现出数组列表的魅力了:如果调用 add 而内部数组已经满了,数组列表就会自动地创建一个更大的数组,并将所有对象从较小的数组拷贝到较大的数组中。如果已经知道或能够估计出数组可能存储的元素数量,就可以在填充数组之前调用ensureCapacity 方法:

staff.ensureCapacity(100)

?这个方法调用将分配一个包含 100 个对象的内部数组。这样一来,前 100 次 add 调用不会带来开销很大的重新分配空间。另外,还可以把初始容量传递给 ArrayList 构造器:ArrayList<Employee staff = ned ArrayListo(100);

警告:如下分配数组列表:

new ArrayList<>(100) // capacity is 100

这与分配一个新数组有所不同:

new Employee[100] // size is 100

数组列表的容量与数组的大小有一个非常重要的区别。如果分配一个有 100 个元素的数组,数组就有100个空位置(槽)可以使用。而容量为 100个元素的数组列表只是可能保存 100 个元素(实际上也可以超过 100,不过要以重新分配空间为代价),但是在一开始,其至完成初始化构造之后,数组列表并不包含任何元素。

?size 方法将返回数组列表中包含的实际元素个数。例如

staff.size()

?将返回 staff 数组列表的当前元素个数,它等价于数组a的 a.length。

?一旦能够确认数组列表的大小将保持恒定,不再发生变化,就可以调用 trimToSize 方法这个方法将内存块的大小调整为保存当前元素数量所需要的存储空间。垃圾回收器将回收余的存储空间。

?一旦削减了数组列表的大小,添加新元素就需要再次移动内存块,这很耗费时间,所以应当只有在确认不会再向数组列表添加任何元素时才调用 trinToSize。

C++注释: Arraylist 类似于于C++的 vector 模板ArrayList 与 vector 都是泛型类型。但是C++的 vector 模板重载了[]操作符以便于访问元素。由于Java 没有操作符重载,所以必须调用显式的方法。此外,C++ 向量是按值复制。如果a和b是两个向量,赋值操作a=b将会构造一个与b长度相同的新向量a,并将所有的元素由b复制到 a。而在Java 中,这条赋值语句的操作结果是让a和b引用同一个数组列表

API java.util.ArrayList<E> 1.2

  • ArrayList<E>() 构造一个空数组列表。
  • ArrayList<E>(int initialCapacity) 构造一个有指定容量的空数组列表
  • boolean add(E obj) 在数组列表的末尾追加 obj。总是返回 true。
  • int size() 返回当前存储在数组列表中的元素个数。(当然,这个值水远不会大于数组列表的容量
  • void ensureCapacity(int capacity) 确保数组列表在不重新分配内部存储数组的情况下,有足够的容量存储给定数量元素。
  • void trimToSize() 将数组列表的存储容量削减到其当前大小

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接