从以前版本遗留下来的类和接口

文章目录

  • Enumeration接口
  • Vector
    • Vector的构造函数:
  • Hashtable
    • Hashtable的构造函数如下所示:
    • Properties

java.util的最初版本中不包括类集框架。取而代之,它定义了几个类和接口提供专门的方法用于存储对象。随着在Java 2中引入类集,有几种最初的类被重新设计成支持类集接口。因此它们与框架完全兼容。尽管实际上没有类被摈弃,但其中某些仍被认为是过时的。当然,在那些重复从以前版本遗留下来的类的功能性的地方,通常都愿意用类集编写新的代码程序。一般地,对从以前版本遗留下来的类的支持是因为仍然存在大量使用它们的基本代码。包括现在仍在被Java 2的应用编程接口(API)使用的程序。
另一点, 没有一个类集类是同步的。但是所有的从以前版本遗留下来的类都是同步
的。这一区别在有些情况下是很重要的。当然,通过使用由Collections提供的算法也很容易实现类集同步

Enumeration接口

Enumeration接口定义了可以对一个对象的类集中的元素进行枚举(一次获得一个)的方法。这个接口尽管没有被摈弃,但已经被Iterator所替代。 Enumeration对新程序来说是过时的。然而它仍被几种从以前版本遗留下来的类(例如Vector和Properties)所定义的方法使用,被几种其他的API类所使用以及被目前广泛使用的应用程序所使用。
Enumeration指定下面的两个方法:
– boolean hasMoreElements( )
– Object nextElement( )
– 执行后,当仍有更多的元素可提取时,
hasMoreElements( )方法一定返回true。当所有元素都被枚举了,则返回false。 nextElement( )方法将枚举中的下一个对象做为一个类属Object的引用而返回。也就是每次调用nextElement( )方法获得枚举中的下一个对象。调用例程必须将那个对象转换为包含在枚举内的对象类型。

Vector

Vector实现动态数组。这与ArrayList相似,但两者不同的是: Vector是同步的,并且它包含了许多不属于类集框架的从以前版本遗留下来的方法。随着Java 2的公布,Vector被重新设计来扩展AbstractList和实现List接口,因此现在它与类集是完全兼容的。

Vector的构造函数:

– 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

散列表(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( )
– 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

属性(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

你可能感兴趣的:(Java的学习之路,数据结构)