Vector与Hashtable 的用法

24、Java集合框架:Vector与Hashtable的深入解析 本文深入解析了Java集合框架中的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]);//排序后输出
  }

基于ProXmoX VE的虚拟化家庭服务器(篇一)—ProXmoX VE 安装及基础配置 ProxmoxVE是一款套开源的虚拟化管理软件,用户可通过网页的方式来管理服务器上使用kvm以及lxc技术运行的虚拟机。同时提供了一些先进功能的支持,如集群、HA等。PVE虽然是开源,却是由一个商业公司在运营、更新以及维护。... 阅读详情

相关推荐

DAC8760高精度数模转换器原理与工业级嵌入式应用

数模转换器(DAC)是工业测控系统中实现数字指令到模拟执行的关键接口,其核心性能由分辨率、线性度、温漂及系统级TUE(总未调整误差)共同决定。DAC8760作为一款16位四象限精密DAC,集成了可编程增益放大器(PGA)、内部基准源与SPI高速接口,支持电压/电流双模输出,显著提升闭环控制精度与硬件适配灵活性。其技术价值在于将高精度模拟前端与数字控制深度耦合,满足PLC、ATE及激光偏置等严苛场景对长期稳定性与多通道同步性的要求。本文围绕DAC8760的寄存器配置、HAL/LL驱动实践、PCB布局规范、现场

weixin_42315569的博客 581

java Vector and Hashtable

Vector允许我们用一个数字从一系列对象中作出选择,所以它实际是将数字同对象关联起来了。但假如我们想根据其他标准选择一系列对象呢?堆栈就是这样的一个例子:它的选择标准是“最后压入堆栈的东西”。这种“从一系列对象中选择”的概念亦可叫作一个“映射”、“字典”或者“关联数组”。从概念上讲,它看起来象一个Vector,但却不是通过数字来查找对象,而是用另一个对象来查找它们!这通常都属于一个程序中的重要进

zs12344444的专栏 1234

手把手教你用STM32F303和LAN9252搭建EtherCAT从站(附IO/AD/DA完整代码)

本文详细介绍了如何使用STM32F303和LAN9252搭建EtherCAT从站,涵盖硬件选型、开发环境配置、协议栈移植及IO/AD/DA功能实现。通过实战指南和完整代码,帮助开发者快速掌握工业自动化中的实时通信技术,提升系统性能与可靠性。

weixin_26802933的博客 235

Vector 和 HashTable

其实Vector 和 HashTable现在已经很少使用了,他们是同属于一个时代的,一般我们使用ArrayList 和HashMap 而且建议使用这两个,他们两个是一个时代的。Vector Vector 和ArrayList的区别: Vector是线程同步的,而ArrayList不是线程同步的,其他方面的实现两个基本一样,从下面的代码可以看到,它的底层实现也是数组。protected Objec

请叫我王老魔 2564

2.3 MMU Notifier(上):KVM 催生的页表变化通知

探讨了MMU Notifier机制的作用及其在虚拟化等场景中的应用。当CPU页表发生变更(如munmap、页面迁移等操作)时,需要通知拥有"第二套页表"的子系统(如KVM的EPT/NPT、IOMMU、GPU等)失效其映射。MMU Notifier通过订阅-通知机制实现这一功能,核心数据结构包括mmu_notifier订阅对象和回调接口mmu_notifier_ops。当CPU页表修改时,通过mmu_notifier_range描述变更范围,调用订阅者的回调函数进行同步,确保外部MMU与CPU页表一致性。

图形/计算GPU的驱动与虚拟化技术分享园地 1025

操作系统实验一到实验九合集(哈工大李治军)

操作系统实验一到实验九合集(哈工大李治军) 有详细代码及注释,程序已在本地测试,均能跑通

leoabcd12的博客 5万+

数据结构Vector和Hashtable的用法

 java所有的预定义数据结构都放在util包中,在代码中输入import java.util.*;这样就能够使用数据结构了。    下面我们先来介绍一下Vector类。Vector有的书中将它翻译成“向量”,在后面我们将一直这样称呼它。向量实际上是一个动态的数组,它可以动态的添加、删除成员。请看下面的例子:import java.util.*;public class UseVector e

ronawilliam的专栏 1010

北斗导航 | 从北一到北二再到北三,你应该知道的北斗导航系统

博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 一、引言 我国高度重视北斗系统的建设和发展。自20世纪80年代开始探索适合我们国家国情的卫星导航系统发展道路,形成了“三步走”的发展战略:2000年底,建成北斗一号导航系统,向我国广大用户提供服务;2012年底,建成北斗二号导航系统,...

尘世冰封的专栏 3078

vector和Hashtable

Vector的用法: Vector是java.util包的类,他的功能是实现了一个动态增长的数组,像其他数组一样,此向量数组可以为每个包含的元素分配一下整数索引号,但是,向量不同于数组,它的长度可以在创建以后根据实际包含的元素个数增加或减少。   向 Vector是java.util包的类,他的功能是实现了一个动态增长的数组,像其他数组一样,此向量数组可以为每个包含的元素分配一下整数索引号,

feilongzaitianlll的博客 500

第10章: MMU notifier与HMM的协作

本文摘要: HMM(Heterogeneous Memory Management)是Linux内核提供的异构内存管理框架,用于统一CPU与设备(如GPU、DSP等)的内存访问。它通过镜像页表技术实现虚拟地址空间共享,自动同步CPU和设备页表变化,支持透明的内存迁移和设备内存管理。HMM构建在mmu_interval_notifier机制上,利用序列号检测页表修改冲突,提供高效并发控制。核心数据结构包括hmm_range和HMM PFN标志位,通过hmm_range_fault()实现页表遍历和缺页处理。

图形/计算GPU的驱动与虚拟化技术分享园地 3088

2024年03月CCF-GESP编程能力等级认证Python编程五级真题解析

下面流程图在yr输入2024时,可以判定yr代表闰年,并输出 2月是29天 ,则图中菱形框中应该填入( )。 A. (yr % 400 == 0) or (yr % 4 == 0) B. ( yr % 400 == 0) or (yr % 4 == 0 and yr %100 != 0) C. ( yr % 400 == 0) and ( yr % 4 == 0) D. (yr % 400 == 0) and (yr % 4 == 0 and yr % 100 != 0)

人生就是一个不断学习的过程 744

Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法

Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操...

weixin_34185560的博客 83

rosbag分析传感器数据的时间同步情况方法

ROS传感器时间同步分析流程:通过rosbaginfo初步检查bag文件信息,使用rqt_bag可视化时间线分布,采用rostopicecho或Python脚本提取各传感器时间戳并计算时间差统计值(均值/最大差/标准差),最后分析接收与采样时间延迟。量化评估同步精度,识别固定偏移或随机抖动问题,确保多传感器数据对齐,为后续融合处理提供可靠数据基础。

start_up_go的博客 201

在java程序设计中,vector与hashtable用法的区别

Vector和ArrayList Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。当Vector或ArrayList中

858

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法

ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动 等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时

a5597942的专栏 473

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

在java程序设计中,vector与hashtable用法的区别,请详细说明。

Vector和ArrayList Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。 Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList

天外的天 520

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

List、ArrayList、Vector及map、HashTable、HashMap的区别与用法

 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历

TONG哥的专栏 1022
上一篇: Java运算符优先级
下一篇: 通俗地理解数据库设计的三个范式
QGJava
博客等级 码龄16年 14粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值