Vector与Hashtable 的用法

Vector的用法:

Vector是java.util包的类,他的功能是实现了一个动态增长的数组,像其他数组一样,此向量数组可以为每个包含的元素分配一下整数索引号,但是,向量不同于数组,它的长度可以在创建以后根据实际包含的元素个数增加或减少。
  向
Vector是java.util包的类,他的功能是实现了一个动态增长的数组,像其他数组一样,此向量数组可以为每个包含的元素分配一下整数索引号,但是,向量不同于数组,它的长度可以在创建以后根据实际包含的元素个数增加或减少。
  向量对象是通过capacity(容量)和capacityIncrement(增长幅度)两个因素来实现存储优化管理。容量因素的值总是大于向量的长度,因为当元素被添加到向量中,向量存储长度的增加是以增长幅度因素指定的值来增加的,应用程序可以在插入大量元素前,先根据需要增加适量的向量容量,这样,可以避免增加多余的存储空间。
  以上是参考手册里对Vector的介绍,下面是我学习中的一些心得:
  Vector有三个构造函数
  public Vector(int initialCapacity,int capacityIncrement)
public Vector(int initialCapacity)
public Vector()
这三个构造函数的差别仅仅在于对向量的初始容量和增长幅度的定义上,向量的增长过程是当当前容易不能满足添加的元素时,就按照构造时给定的增长幅度来增加,如果未定义增长幅度,则每次增加的时候会成倍增加。举个例。
  Vector t=new Vetor(4,0);
for(int i=0;i<20;i++)
t.addElement(new String("ft"));
那么实际运行后,t的容量是4*2*2*2=32,
如果改写成
Vector t=new Vetor(4,3);
for(int i=0;i<20;i++)
t.addElement(new String("ft"));
那么实际运行后,t的容量是4+3+3+3+3+3+3=22,
  但如果写成
Vector t=new Vetor();
for(int i=0;i<20;i++)
t.addElement(new String("ft"));
则运行后t的容量是20,我测试过,好像用默认的构造函数,初始容量是10,以后每次翻倍,这样容易造成空间的浪费,因为建议不采用这种构造函数。
  Vector类有很多方法,其实像常用的有addElement(),removeElementAt(int index),insertElementAt(Object obj,int index)等方法,这些方法从字面上就很容易理解,其实与数组的操作差不多。
  Vector类的要点就在于对存储空间的操作,因为主要是讲一下下面的几个方法:
  public void trimToSize()
  该方法用于删除掉向量中大于向量当前长度的多余容量,应用程序通过使用此方法可以使向量容量刚好满足元素存储的最小需要。
  public void ensureCapacity(int minCapacity)
该方法用于增加向量的容量,保证增加后的向量容量不小于给定的参数。对这个方法我作过测试,使用这个方法后向量容量增加的幅度与构造Vector类时的构造方法有关,如果构造函数时给定的向量增加幅度为0,那么使用这个方法后容量会成倍增长,如果构造函数时给定了不为0的向量增加幅度,那么使用这个方法后容量会以给定的幅度为单位增长。
  public void setSize(int newSize)
该方法用于设置向量的长度,如果新设置的长度大于向量的当前长度,新增的内容为空的元素被添加到当前向量的尾部。如果新设置的长度小于向量当前的长度,索引值大于新设置长度的元素将被截取。

  Vector实际上就是一种特殊的数组,由于他的通用性,他的元素都是Object类,所以对Vector的元素增加或者读取都要进行类型转换。如:

  Vector t=new Vector();
t.addElement(new String("vector"));
system.out.println((String)t.elementAt(0));

t.addElement((Image)(pic));
g.drawImage((Image)(t.elementAt(1)),0,0,0);
 

 

Hashtable :

 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
  Hashtable 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶 的数量,初始容量 就是哈希表创建时的容量。注意,哈希表的状态为 open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。
  通常,默认加载因子(.75)在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查找某个条目的时间(在大多数 Hashtable 操作中,包括 get 和 put 操作,都反映了这一点)。
  初始容量主要控制空间消耗与执行 rehash 操作所需要的时间损耗之间的平衡。如果初始容量大于 Hashtable 所包含的最大条目数除以加载因子,则永远 不会发生 rehash 操作。但是,将初始容量设置太高可能会浪费空间。
  如果很多条目要存储在一个 Hashtable 中,那么与根据需要执行自动 rehashing 操作来增大表的容量的做法相比,使用足够大的初始容量创建哈希表或许可以更有效地插入条目。
  下面这个示例创建了一个数字的哈希表。它将数字的名称用作键:
  Hashtable<String, Integer> numbers
  = new Hashtable<String, Integer>();
  numbers.put("one", 1);
  numbers.put("two", 2);
  numbers.put("three", 3);
  要获取一个数字,可以使用以下代码:
  Integer n = numbers.get("two");
  if (n != null) {
  System.out.println("two = " + n);
  }
  }
  由所有类的“collection 视图方法”返回的 collection 的 iterator 方法返回的迭代器都是快速失败 的:在创建 Iterator 之后,如果从结构上对 Hashtable 进行修改,除非通过 Iterator 自身的 remove 方法,否则在任何时间以任何方式对其进行修改,Iterator 都将抛出ConcurrentModificationException。因此,面对并发的修改,Iterator 很快就会完全失败,而不冒在将来某个不确定的时间发生任意不确定行为的风险。由 Hashtable 的键和元素方法返回的 Enumeration 不 是快速失败的。
  注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误做法:迭代器的快速失败行为应该仅用于检测程序错误。
  在.NET work中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/的键值对,其中key通常可用来快速查找,同时key是区分大小写;用于存储对应于key的值。Hashtable中key/键值对均为object类型,所以Hashtable可以支持任何类型的key/键值对.
[编辑本段]简单操作
常见功能
  在哈希表中添加一个key/键值对:HashtableObject.Add(key,);
  在哈希表中去除某个key/键值对:HashtableObject.Remove(key);
  从哈希表中移除所有元素:           HashtableObject.Clear();
  判断哈希表是否包含特定键key:      HashtableObject.Contains(key);
  下面控制台程序将包含以上所有操作:
  using System;
  using System.Collections; //使用Hashtable时,必须引入这个命名空间
  class hashtable
  {
  public static void Main()
  {
  Hashtable ht=new Hashtable(); //创建一个Hashtable实例
  ht.Add("E","e");//添加key/键值对
  ht.Add("A","a");
  ht.Add("C","c");
  ht.Add("B","b");
  string s=(string)ht["A"];
  if(ht.Contains("E")) //判断哈希表是否包含特定键,其返回值为true或false
  Console.WriteLine("the E key:exist");
  ht.Remove("C");//移除一个key/键值对
  Console.WriteLine(ht["A"]);//此处输出a
  ht.Clear();//移除所有元素
  Console.WriteLine(ht["A"]); //此处将不会有任何输出
  }
  }
  遍历哈希表
  遍历哈希表需要用到DictionaryEntry Object,代码如下:
  foreach(DictionaryEntry de in ht) //ht为一个Hashtable实例
  {
  Console.WriteLine(de.Key);//de.Key对应于key/键值对key
  Console.WriteLine(de.Value);//de.Key对应于key/键值对
  }
  对哈希表进行排序
  对哈希表进行排序在这里的定义是对key/键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法:
  ArrayList akeys=new ArrayList(ht.Keys); //别忘了导入System.Collections
  akeys.Sort(); //按字母顺序进行排序
  foreach(string skey in akeys)
  {
  Console.Write(skey+ ":");
  Console.WriteLine(ht[skey]);//排序后输出
  }

发布了8 篇原创文章 · 获赞 0 · 访问量 10万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章