Enumeration接口定义了可以对一个对象的类集中的元素进行枚举(一次获得一个)的方法。这个接口尽管没有被摈弃,但已经被Iterator所替代。 Enumeration对新程序来说是过时的。然而它仍被几种从以前版本遗留下来的类(例如Vector和Properties)所定义的方法使用,被几种其他的API类所使用以及被目前广泛使用的应用程序所使用。
Enumeration指定下面的两个方法:
– boolean hasMoreElements( )
– Object nextElement( )
– 执行后,当仍有更多的元素可提取时,
hasMoreElements( )方法一定返回true。当所有元素都被枚举了,则返回false。 nextElement( )方法将枚举中的下一个对象做为一个类属Object的引用而返回。也就是每次调用nextElement( )方法获得枚举中的下一个对象。调用例程必须将那个对象转换为包含在枚举内的对象类型。
Vector实现动态数组。这与ArrayList相似,但两者不同的是: Vector是同步的,并且它包含了许多不属于类集框架的从以前版本遗留下来的方法。随着Java 2的公布,Vector被重新设计来扩展AbstractList和实现List接口,因此现在它与类集是完全兼容的。
– Vector( )
– Vector(int size)
– Vector(int size, int incr)
– Vector(Collection c)
• 第一种形式创建一个原始大小为10的默认矢量。
• 第二种形式创建一个其原始容量由size指定的矢量。
• 第三种形式创建一个其原始容量由size指定,并且它的增量由incr指定的矢量。增量指定了矢量每次允许向上改变大小的元素的个数。
• 第四种形式创建一个包含了类集c中元素的矢量。这个构造函数是在Java 2中新增加的
所有的矢量开始都有一个原始的容量。在这个原始容量达到以后,下一次再试图向矢量中存储对象时,矢量自动为那个对象分配空间同时为别的对象增加额外的空间。通过分配超过需要的内存,矢量减小了可能产生的分配的次数。这种次数的减少是很重要的,因为分配内存是很花时间的。在每次再分配中,分配的额外空间的总数由在创建矢量时指定的增量来确定。如果没有指定增量,在每个分配周期,矢量的大小增一倍。
Vector定义了下面的保护数据成员:
– int capacityIncrement;
– int elementCount;
– Object elementData[ ];
– 增量值被存储在capacityIncrement中。矢量中的当前元素的个数被存储在elementCount中。保存矢量的数组被存储在elementData中。
因为Vector实现List,所以可以像使用ArrayList的一个实例那样使用矢量。也可以使用它的从以前版本遗留下来的方法来操作它。例如,在后面实例化Vector,可以通过调用addElement( )方法而为其增加一个元素。调用elementAt( )方法可以获得指定位置处的元素。调用firstElement( )方法可以得到矢量的第一个元素。调用lastElement( )方法可以检索到矢量的最后一个元素。使用indexOf( )和lastIndexOf( )方法可以获得元素的下标。调用removeElement( )或removeElementAt( )方法可以删除元素。
随着Java 2的公布, Vector增加了对迭代函数的支持。现在可以使用迭代函数来替代枚举去遍历对象(正如前面的程序所做的那样)。
因为建议不要使编写枚举新的程序代码,所以通常可以使用迭代函数来对矢量的内容进行枚举。当然,业已存在的大量的老程序采用了枚举。不过幸运的是,枚举和迭代函数的工作方式几乎相同
散列表(Hashtable) 是原始java.util中的一部分同时也是Dictionary的一个具体实现。 然而, Java 2重新设计了散列表(Hashtable) 以便它也能实现映射(Map) 接口。 因此现在Hashtable也被集成到类集框架中。 它与HashMap相似, 但它是同步的。
和HashMap一样, Hashtable将关键字/值对存储到散列表中。使用Hashtable时,指定一个对象作为关键字,同时指定与该关键字相关联的值。接着该关键字被散列,而把得到的散列值作为存储在表中的值的下标。
散列表仅仅可以存储重载由Object定义的hashCode( )和equals( )方法的对象hashCode( )方法计算和返回对象的散列码。当然, equals( )方法比较两个对象。幸运的是,许多Java内置的类已经实现了hashCode( )方法。例如,大多数常见的Hashtable类型使用字符串(String)对象作为关键字。 String实现hashCode( )和equals( )方法。
– Hashtable( )
– Hashtable(int size)
– Hashtable(int size, float fillRatio)
– Hashtable(Map m)
• 第一种形式是默认的构造函数。
• 第二种形式创建一个散列表,该散列表具有由size指定的原始大小。
• 第三种形式创建一个散列表,该散列表具有由size指定的原始大小和由fillRatio指定的填充比。填充比必须介于0.0和1.0之间,它决定了在散列表向上调整大小之前散列表的充满度。具体地说,当元素的个数大于散列表的容量乘以它的填充比时,散列表被扩展。如果没有指定填充比,默认使用0.75。最后,
• 第四种形式创建一个散列表,该散列表用m中的元素初始化。散列表的容量被设为m中元素的个数的两倍。默认的填充因子设为0.75。第四种构造函数是在Java 2中新增加的。
重要的一点是:和映射类一样, Hashtable不直接支持迭代函数。因此,上面的程序使用枚举来显示balance的内容。然而,我们可以获得允许使用迭代函数的散列表的集合视图。为了实现它,可以简单地使用由Map定义的一个类集“视图” 方法,如entrySet( )或keySet( )方法。例如,可以获得关键字的一个集合“视图” ,并遍历这些关键字。
属性(Properties)是Hashtable的一个子类。它用来保持值的列表,在其中关键字和值都是字符串(String)。 Properties类被许多其他的Java类所使用。例如,当获得系统环境值时, System.getProperties( )返回对象的类型。
获取自己系统中的环境变量,操作方法和HashMap相同。
package fiftyThird;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
public class PropertiesTest {
public static void main(String[] args) {
Properties properties = System.getProperties();
Set set = properties.keySet();
for(Iterator iterator = set.iterator(); iterator.hasNext();) {
String key = (String)iterator.next();
String value = properties.getProperty(key);
System.out.println(key+"="+value);
}
}
}
Properties类的一个有用的功能是可以指定一个默认属性,如果没有值与特定的关键字相关联,则返回这个默认属性。例如,默认值可以与关键字一起在getProperty( )方法中被指定——如getProperty(“name”, “default value”)。如果“name”值没有找到,则返回“default value”。当构造一个Properties对象时,可以传递Properties的另一个实例做为新实例的默认值。在这种情况下,如果对一个给定的Properties对象调用getProperty(“foo”),而“foo”并不存在时, Java在默认Properties对象中寻找“foo”。它允许默认属性的任意层嵌套。
properties文件(属性文件)
name=zhangsan
age=10
address=shanghai